/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 0051a3640491a67ce2d4abcbffc687a818bb49f7:


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 20 20 74 52 6f 77 63 6e 74 20 6e 4d 61  */.  tRowcnt nMa
4600: 78 52 6f 77 63 6e 74 3b 20 20 20 20 20 20 20 2f  xRowcnt;       /
4610: 2a 20 49 66 20 21 3d 30 2c 20 74 68 65 20 6d 61  * If !=0, the ma
4620: 78 69 6d 75 6d 20 65 73 74 69 6d 61 74 65 64 20  ximum estimated 
4630: 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 23 65 6e  row count */.#en
4640: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.};../*.** Th
4650: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
4660: 72 6f 63 65 73 73 69 6e 67 20 72 6f 75 74 69 6e  rocessing routin
4670: 65 20 68 61 73 20 74 77 6f 20 68 61 6c 76 65 73  e has two halves
4680: 2e 20 20 54 68 65 0a 2a 2a 20 66 69 72 73 74 20  .  The.** first 
4690: 70 61 72 74 20 64 6f 65 73 20 74 68 65 20 73 74  part does the st
46a0: 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45  art of the WHERE
46b0: 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 73 65   loop and the se
46c0: 63 6f 6e 64 0a 2a 2a 20 68 61 6c 66 20 64 6f 65  cond.** half doe
46d0: 73 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  s the tail of th
46e0: 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 41  e WHERE loop.  A
46f0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a  n instance of.**
4700: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
4710: 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  is returned by t
4720: 68 65 20 66 69 72 73 74 20 68 61 6c 66 20 61 6e  he first half an
4730: 64 20 70 61 73 73 65 64 0a 2a 2a 20 69 6e 74 6f  d passed.** into
4740: 20 74 68 65 20 73 65 63 6f 6e 64 20 68 61 6c 66   the second half
4750: 20 74 6f 20 67 69 76 65 20 73 6f 6d 65 20 63 6f   to give some co
4760: 6e 74 69 6e 75 69 74 79 2e 0a 2a 2a 0a 2a 2a 20  ntinuity..**.** 
4770: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
4780: 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73  his object holds
4790: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 74   the complete st
47a0: 61 74 65 20 6f 66 20 74 68 65 20 71 75 65 72 79  ate of the query
47b0: 0a 2a 2a 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a  .** planner..*/.
47c0: 73 74 72 75 63 74 20 57 68 65 72 65 49 6e 66 6f  struct WhereInfo
47d0: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
47e0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
47f0: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
4800: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
4810: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
4820: 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
4830: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
4840: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f  tables in the jo
4850: 69 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  in */.  ExprList
4860: 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
4870: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
4880: 59 20 63 6c 61 75 73 65 20 6f 72 20 4e 55 4c 4c  Y clause or NULL
4890: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
48a0: 70 52 65 73 75 6c 74 53 65 74 3b 20 20 20 20 20  pResultSet;     
48b0: 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20 44  /* Result set. D
48c0: 49 53 54 49 4e 43 54 20 6f 70 65 72 61 74 65 73  ISTINCT operates
48d0: 20 6f 6e 20 74 68 65 73 65 20 2a 2f 0a 20 20 57   on these */.  W
48e0: 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 73  hereLoop *pLoops
48f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ;        /* List
4900: 20 6f 66 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f   of all WhereLoo
4910: 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 42  p objects */.  B
4920: 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 3b 20  itmask revMask; 
4930: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
4940: 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
4950: 6d 73 20 74 68 61 74 20 6e 65 65 64 20 72 65 76  ms that need rev
4960: 65 72 73 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72  ersing */.  Wher
4970: 65 43 6f 73 74 20 6e 52 6f 77 4f 75 74 3b 20 20  eCost nRowOut;  
4980: 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74        /* Estimat
4990: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
49a0: 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20 75 31  put rows */.  u1
49b0: 36 20 77 63 74 72 6c 46 6c 61 67 73 3b 20 20 20  6 wctrlFlags;   
49c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
49d0: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 70 61 73 73   originally pass
49e0: 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
49f0: 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 75  reBegin() */.  u
4a00: 38 20 62 4f 42 53 61 74 3b 20 20 20 20 20 20 20  8 bOBSat;       
4a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45           /* ORDE
4a20: 52 20 42 59 20 73 61 74 69 73 66 69 65 64 20 62  R BY satisfied b
4a30: 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 75  y indices */.  u
4a40: 38 20 6f 6b 4f 6e 65 50 61 73 73 3b 20 20 20 20  8 okOnePass;    
4a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6b 20 74           /* Ok t
4a60: 6f 20 75 73 65 20 6f 6e 65 2d 70 61 73 73 20 61  o use one-pass a
4a70: 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 55 50 44  lgorithm for UPD
4a80: 41 54 45 2f 44 45 4c 45 54 45 20 2a 2f 0a 20 20  ATE/DELETE */.  
4a90: 75 38 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73  u8 untestedTerms
4aa0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  ;         /* Not
4ab0: 20 61 6c 6c 20 57 48 45 52 45 20 74 65 72 6d 73   all WHERE terms
4ac0: 20 72 65 73 6f 6c 76 65 64 20 62 79 20 6f 75 74   resolved by out
4ad0: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 38 20  er loop */.  u8 
4ae0: 65 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  eDistinct;      
4af0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
4b00: 20 74 68 65 20 57 48 45 52 45 5f 44 49 53 54 49   the WHERE_DISTI
4b10: 4e 43 54 5f 2a 20 76 61 6c 75 65 73 20 62 65 6c  NCT_* values bel
4b20: 6f 77 20 2a 2f 0a 20 20 75 38 20 6e 4c 65 76 65  ow */.  u8 nLeve
4b30: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
4b40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
4b50: 65 73 74 65 64 20 6c 6f 6f 70 20 2a 2f 0a 20 20  ested loop */.  
4b60: 69 6e 74 20 69 54 6f 70 3b 20 20 20 20 20 20 20  int iTop;       
4b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4b80: 20 76 65 72 79 20 62 65 67 69 6e 6e 69 6e 67 20   very beginning 
4b90: 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
4ba0: 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  p */.  int iCont
4bb0: 69 6e 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  inue;           
4bc0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
4bd0: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
4be0: 65 78 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ext record */.  
4bf0: 69 6e 74 20 69 42 72 65 61 6b 3b 20 20 20 20 20  int iBreak;     
4c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4c10: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
4c20: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
4c30: 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4e 51  */.  int savedNQ
4c40: 75 65 72 79 4c 6f 6f 70 3b 20 20 20 20 20 20 2f  ueryLoop;      /
4c50: 2a 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  * pParse->nQuery
4c60: 4c 6f 6f 70 20 6f 75 74 73 69 64 65 20 74 68 65  Loop outside the
4c70: 20 57 48 45 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20   WHERE loop */. 
4c80: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 4d   WhereMaskSet sM
4c90: 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 4d 61  askSet;    /* Ma
4ca0: 70 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  p cursor numbers
4cb0: 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a   to bitmasks */.
4cc0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 57    WhereClause sW
4cd0: 43 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  C;          /* D
4ce0: 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ecomposition of 
4cf0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4d00: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
4d10: 20 61 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20   a[1];          
4d20: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
4d30: 62 6f 75 74 20 65 61 63 68 20 6e 65 73 74 20 6c  bout each nest l
4d40: 6f 6f 70 20 69 6e 20 57 48 45 52 45 20 2a 2f 0a  oop in WHERE */.
4d50: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73  };../*.** Bitmas
4d60: 6b 73 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  ks for the opera
4d70: 74 6f 72 73 20 6f 6e 20 57 68 65 72 65 54 65 72  tors on WhereTer
4d80: 6d 20 6f 62 6a 65 63 74 73 2e 20 20 54 68 65 73  m objects.  Thes
4d90: 65 20 61 72 65 20 61 6c 6c 0a 2a 2a 20 6f 70 65  e are all.** ope
4da0: 72 61 74 6f 72 73 20 74 68 61 74 20 61 72 65 20  rators that are 
4db0: 6f 66 20 69 6e 74 65 72 65 73 74 20 74 6f 20 74  of interest to t
4dc0: 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
4dd0: 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63  .  An.** OR-ed c
4de0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68  ombination of th
4df0: 65 73 65 20 76 61 6c 75 65 73 20 63 61 6e 20 62  ese values can b
4e00: 65 20 75 73 65 64 20 77 68 65 6e 20 73 65 61 72  e used when sear
4e10: 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20 70 61 72  ching for.** par
4e20: 74 69 63 75 6c 61 72 20 57 68 65 72 65 54 65 72  ticular WhereTer
4e30: 6d 73 20 77 69 74 68 69 6e 20 61 20 57 68 65 72  ms within a Wher
4e40: 65 43 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64 65 66  eClause..*/.#def
4e50: 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20 30 78  ine WO_IN     0x
4e60: 30 30 31 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45  001.#define WO_E
4e70: 51 20 20 20 20 20 30 78 30 30 32 0a 23 64 65 66  Q     0x002.#def
4e80: 69 6e 65 20 57 4f 5f 4c 54 20 20 20 20 20 28 57  ine WO_LT     (W
4e90: 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f  O_EQ<<(TK_LT-TK_
4ea0: 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f  EQ)).#define WO_
4eb0: 4c 45 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LE     (WO_EQ<<(
4ec0: 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LE-TK_EQ)).#d
4ed0: 65 66 69 6e 65 20 57 4f 5f 47 54 20 20 20 20 20  efine WO_GT     
4ee0: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 54 2d 54  (WO_EQ<<(TK_GT-T
4ef0: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
4f00: 4f 5f 47 45 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GE     (WO_EQ<
4f10: 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45 51 29 29 0a  <(TK_GE-TK_EQ)).
4f20: 23 64 65 66 69 6e 65 20 57 4f 5f 4d 41 54 43 48  #define WO_MATCH
4f30: 20 20 30 78 30 34 30 0a 23 64 65 66 69 6e 65 20    0x040.#define 
4f40: 57 4f 5f 49 53 4e 55 4c 4c 20 30 78 30 38 30 0a  WO_ISNULL 0x080.
4f50: 23 64 65 66 69 6e 65 20 57 4f 5f 4f 52 20 20 20  #define WO_OR   
4f60: 20 20 30 78 31 30 30 20 20 20 20 20 20 20 2f 2a    0x100       /*
4f70: 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d   Two or more OR-
4f80: 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
4f90: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4e  */.#define WO_AN
4fa0: 44 20 20 20 20 30 78 32 30 30 20 20 20 20 20 20  D    0x200      
4fb0: 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20   /* Two or more 
4fc0: 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65  AND-connected te
4fd0: 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  rms */.#define W
4fe0: 4f 5f 45 51 55 49 56 20 20 30 78 34 30 30 20 20  O_EQUIV  0x400  
4ff0: 20 20 20 20 20 2f 2a 20 4f 66 20 74 68 65 20 66       /* Of the f
5000: 6f 72 6d 20 41 3d 3d 42 2c 20 62 6f 74 68 20 63  orm A==B, both c
5010: 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e  olumns */.#defin
5020: 65 20 57 4f 5f 4e 4f 4f 50 20 20 20 30 78 38 30  e WO_NOOP   0x80
5030: 30 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  0       /* This 
5040: 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 72 65  term does not re
5050: 73 74 72 69 63 74 20 73 65 61 72 63 68 20 73 70  strict search sp
5060: 61 63 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20  ace */..#define 
5070: 57 4f 5f 41 4c 4c 20 20 20 20 30 78 66 66 66 20  WO_ALL    0xfff 
5080: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
5090: 20 61 6c 6c 20 70 6f 73 73 69 62 6c 65 20 57 4f   all possible WO
50a0: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65  _* values */.#de
50b0: 66 69 6e 65 20 57 4f 5f 53 49 4e 47 4c 45 20 30  fine WO_SINGLE 0
50c0: 78 30 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61  x0ff       /* Ma
50d0: 73 6b 20 6f 66 20 61 6c 6c 20 6e 6f 6e 2d 63 6f  sk of all non-co
50e0: 6d 70 6f 75 6e 64 20 57 4f 5f 2a 20 76 61 6c 75  mpound WO_* valu
50f0: 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  es */../*.** The
5100: 73 65 20 61 72 65 20 64 65 66 69 6e 69 74 69 6f  se are definitio
5110: 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  ns of bits in th
5120: 65 20 57 68 65 72 65 4c 6f 6f 70 2e 77 73 46 6c  e WhereLoop.wsFl
5130: 61 67 73 20 66 69 65 6c 64 2e 0a 2a 2a 20 54 68  ags field..** Th
5140: 65 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d  e particular com
5150: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 62 69 74 73  bination of bits
5160: 20 69 6e 20 65 61 63 68 20 57 68 65 72 65 4c 6f   in each WhereLo
5170: 6f 70 20 68 65 6c 70 20 74 6f 0a 2a 2a 20 64 65  op help to.** de
5180: 74 65 72 6d 69 6e 65 20 74 68 65 20 61 6c 67 6f  termine the algo
5190: 72 69 74 68 6d 20 74 68 61 74 20 57 68 65 72 65  rithm that Where
51a0: 4c 6f 6f 70 20 72 65 70 72 65 73 65 6e 74 73 2e  Loop represents.
51b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
51c0: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30  E_COLUMN_EQ    0
51d0: 78 30 30 30 30 30 30 30 31 20 20 2f 2a 20 78 3d  x00000001  /* x=
51e0: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
51f0: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
5200: 47 45 20 30 78 30 30 30 30 30 30 30 32 20 20 2f  GE 0x00000002  /
5210: 2a 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20  * x<EXPR and/or 
5220: 78 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e  x>EXPR */.#defin
5230: 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  e WHERE_COLUMN_I
5240: 4e 20 20 20 20 30 78 30 30 30 30 30 30 30 34 20  N    0x00000004 
5250: 20 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a   /* x IN (...) *
5260: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
5270: 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30  COLUMN_NULL  0x0
5280: 30 30 30 30 30 30 38 20 20 2f 2a 20 78 20 49 53  0000008  /* x IS
5290: 20 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65   NULL */.#define
52a0: 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e   WHERE_CONSTRAIN
52b0: 54 20 20 20 30 78 30 30 30 30 30 30 30 66 20 20  T   0x0000000f  
52c0: 2f 2a 20 41 6e 79 20 6f 66 20 74 68 65 20 57 48  /* Any of the WH
52d0: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 78 78 78 20 76  ERE_COLUMN_xxx v
52e0: 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65  alues */.#define
52f0: 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
5300: 20 20 20 20 30 78 30 30 30 30 30 30 31 30 20 20      0x00000010  
5310: 2f 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 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 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78  _BTM_LIMIT    0x
5350: 30 30 30 30 30 30 32 30 20 20 2f 2a 20 78 3e 45  00000020  /* x>E
5360: 58 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63  XPR or x>=EXPR c
5370: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65  onstraint */.#de
5380: 66 69 6e 65 20 57 48 45 52 45 5f 42 4f 54 48 5f  fine WHERE_BOTH_
5390: 4c 49 4d 49 54 20 20 20 30 78 30 30 30 30 30 30  LIMIT   0x000000
53a0: 33 30 20 20 2f 2a 20 42 6f 74 68 20 78 3e 45 58  30  /* Both x>EX
53b0: 50 52 20 61 6e 64 20 78 3c 45 58 50 52 20 2a 2f  PR and x<EXPR */
53c0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49  .#define WHERE_I
53d0: 44 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30  DX_ONLY     0x00
53e0: 30 30 30 30 34 30 20 20 2f 2a 20 55 73 65 20 69  000040  /* Use i
53f0: 6e 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74  ndex only - omit
5400: 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e   table */.#defin
5410: 65 20 57 48 45 52 45 5f 49 50 4b 20 20 20 20 20  e WHERE_IPK     
5420: 20 20 20 20 20 30 78 30 30 30 30 30 31 30 30 20       0x00000100 
5430: 20 2f 2a 20 78 20 69 73 20 74 68 65 20 49 4e 54   /* x is the INT
5440: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
5450: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
5460: 45 5f 49 4e 44 45 58 45 44 20 20 20 20 20 20 30  E_INDEXED      0
5470: 78 30 30 30 30 30 32 30 30 20 20 2f 2a 20 57 68  x00000200  /* Wh
5480: 65 72 65 4c 6f 6f 70 2e 75 2e 62 74 72 65 65 2e  ereLoop.u.btree.
5490: 70 49 6e 64 65 78 20 69 73 20 76 61 6c 69 64 20  pIndex is valid 
54a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
54b0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78  _VIRTUALTABLE 0x
54c0: 30 30 30 30 30 34 30 30 20 20 2f 2a 20 57 68 65  00000400  /* Whe
54d0: 72 65 4c 6f 6f 70 2e 75 2e 76 74 61 62 20 69 73  reLoop.u.vtab is
54e0: 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66 69 6e   valid */.#defin
54f0: 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  e WHERE_IN_ABLE 
5500: 20 20 20 20 20 30 78 30 30 30 30 30 38 30 30 20       0x00000800 
5510: 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75 70 70   /* Able to supp
5520: 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  ort an IN operat
5530: 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  or */.#define WH
5540: 45 52 45 5f 4f 4e 45 52 4f 57 20 20 20 20 20 20  ERE_ONEROW      
5550: 20 30 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20   0x00001000  /* 
5560: 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65 20  Selects no more 
5570: 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a  than one row */.
5580: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4d 55  #define WHERE_MU
5590: 4c 54 49 5f 4f 52 20 20 20 20 20 30 78 30 30 30  LTI_OR     0x000
55a0: 30 32 30 30 30 20 20 2f 2a 20 4f 52 20 75 73 69  02000  /* OR usi
55b0: 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 69  ng multiple indi
55c0: 63 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ces */.#define W
55d0: 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 20  HERE_AUTO_INDEX 
55e0: 20 20 30 78 30 30 30 30 34 30 30 30 20 20 2f 2a    0x00004000  /*
55f0: 20 55 73 65 73 20 61 6e 20 65 70 68 65 6d 65 72   Uses an ephemer
5600: 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 2f 2a  al index */.../*
5610: 20 43 6f 6e 76 65 72 74 20 61 20 57 68 65 72 65   Convert a Where
5620: 43 6f 73 74 20 76 61 6c 75 65 20 28 31 30 20 74  Cost value (10 t
5630: 69 6d 65 73 20 6c 6f 67 32 28 58 29 29 20 69 6e  imes log2(X)) in
5640: 74 6f 20 69 74 73 20 69 6e 74 65 67 65 72 20 76  to its integer v
5650: 61 6c 75 65 20 58 2e 0a 2a 2a 20 41 20 72 6f 75  alue X..** A rou
5660: 67 68 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e  gh approximation
5670: 20 69 73 20 75 73 65 64 2e 20 20 54 68 65 20 76   is used.  The v
5680: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
5690: 20 6e 6f 74 20 65 78 61 63 74 2e 0a 2a 2f 0a 73   not exact..*/.s
56a0: 74 61 74 69 63 20 75 36 34 20 77 68 65 72 65 43  tatic u64 whereC
56b0: 6f 73 74 54 6f 49 6e 74 28 57 68 65 72 65 43 6f  ostToInt(WhereCo
56c0: 73 74 20 78 29 7b 0a 20 20 75 36 34 20 6e 3b 0a  st x){.  u64 n;.
56d0: 20 20 69 66 28 20 78 3c 31 30 20 29 20 72 65 74    if( x<10 ) ret
56e0: 75 72 6e 20 31 3b 0a 20 20 6e 20 3d 20 78 25 31  urn 1;.  n = x%1
56f0: 30 3b 0a 20 20 78 20 2f 3d 20 31 30 3b 0a 20 20  0;.  x /= 10;.  
5700: 69 66 28 20 6e 3e 3d 35 20 29 20 6e 20 2d 3d 20  if( n>=5 ) n -= 
5710: 32 3b 0a 20 20 65 6c 73 65 20 69 66 28 20 6e 3e  2;.  else if( n>
5720: 3d 31 20 29 20 6e 20 2d 3d 20 31 3b 0a 20 20 69  =1 ) n -= 1;.  i
5730: 66 28 20 78 3e 3d 33 20 29 20 72 65 74 75 72 6e  f( x>=3 ) return
5740: 20 28 6e 2b 38 29 3c 3c 28 78 2d 33 29 3b 0a 20   (n+8)<<(x-3);. 
5750: 20 72 65 74 75 72 6e 20 28 6e 2b 38 29 3e 3e 28   return (n+8)>>(
5760: 33 2d 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  3-x);.}../*.** R
5770: 65 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61  eturn the estima
5780: 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  ted number of ou
5790: 74 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61  tput rows from a
57a0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f   WHERE clause.*/
57b0: 0a 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72  .u64 sqlite3Wher
57c0: 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
57d0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
57e0: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 77 68 65  o){.  return whe
57f0: 72 65 43 6f 73 74 54 6f 49 6e 74 28 70 57 49 6e  reCostToInt(pWIn
5800: 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 7d 0a  fo->nRowOut);.}.
5810: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6f 6e  ./*.** Return on
5820: 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44  e of the WHERE_D
5830: 49 53 54 49 4e 43 54 5f 78 78 78 78 78 20 76 61  ISTINCT_xxxxx va
5840: 6c 75 65 73 20 74 6f 20 69 6e 64 69 63 61 74 65  lues to indicate
5850: 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20 57 48 45   how this.** WHE
5860: 52 45 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e  RE clause return
5870: 73 20 6f 75 74 70 75 74 73 20 66 6f 72 20 44 49  s outputs for DI
5880: 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
5890: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
58a0: 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
58b0: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
58c0: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
58d0: 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3b  Info->eDistinct;
58e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
58f0: 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45   TRUE if the WHE
5900: 52 45 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e  RE clause return
5910: 73 20 72 6f 77 73 20 69 6e 20 4f 52 44 45 52 20  s rows in ORDER 
5920: 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20 52 65 74  BY order..** Ret
5930: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
5940: 20 6f 75 74 70 75 74 20 6e 65 65 64 73 20 74 6f   output needs to
5950: 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a 2f 0a 69   be sorted..*/.i
5960: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  nt sqlite3WhereI
5970: 73 4f 72 64 65 72 65 64 28 57 68 65 72 65 49 6e  sOrdered(WhereIn
5980: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
5990: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 62 4f  eturn pWInfo->bO
59a0: 42 53 61 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  BSat!=0;.}../*.*
59b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
59c0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
59d0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
59e0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
59f0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
5a00: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
5a10: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
5a20: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
5a30: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
5a40: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
5a50: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
5a60: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  turn pWInfo->iCo
5a70: 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
5a80: 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42 45   Return the VDBE
5a90: 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62 65   address or labe
5aa0: 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e 20  l to jump to in 
5ab0: 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b 0a 2a  order to break.*
5ac0: 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45 52 45  * out of a WHERE
5ad0: 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71   loop..*/.int sq
5ae0: 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c  lite3WhereBreakL
5af0: 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f 20 2a  abel(WhereInfo *
5b00: 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72  pWInfo){.  retur
5b10: 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  n pWInfo->iBreak
5b20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5b30: 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55 50 44  n TRUE if an UPD
5b40: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
5b50: 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70 65 72  atement can oper
5b60: 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 0a  ate directly on.
5b70: 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20 72 65  ** the rowids re
5b80: 74 75 72 6e 65 64 20 62 79 20 61 20 57 48 45 52  turned by a WHER
5b90: 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74 75 72  E clause.  Retur
5ba0: 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69 6e 67  n FALSE if doing
5bb0: 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20 6f 72   an.** UPDATE or
5bc0: 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20 63 68   DELETE might ch
5bd0: 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e 74 20  ange subsequent 
5be0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 73  WHERE clause res
5bf0: 75 6c 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ults..*/.int sql
5c00: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
5c10: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
5c20: 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20  Info){.  return 
5c30: 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
5c40: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  s;.}../*.** Move
5c50: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
5c60: 70 53 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a  pSrc into pDest.
5c70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
5c80: 68 65 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65  hereOrMove(Where
5c90: 4f 72 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68  OrSet *pDest, Wh
5ca0: 65 72 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b  ereOrSet *pSrc){
5cb0: 0a 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53  .  pDest->n = pS
5cc0: 72 63 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28  rc->n;.  memcpy(
5cd0: 70 44 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e  pDest->a, pSrc->
5ce0: 61 2c 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65  a, pDest->n*size
5cf0: 6f 66 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29  of(pDest->a[0]))
5d00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
5d10: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70  o insert a new p
5d20: 72 65 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74  rerequisite/cost
5d30: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
5d40: 57 68 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e  WhereOrSet pSet.
5d50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65  .**.** The new e
5d60: 6e 74 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77  ntry might overw
5d70: 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67  rite an existing
5d80: 20 65 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69   entry, or it mi
5d90: 67 68 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64  ght be.** append
5da0: 65 64 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ed, or it might 
5db0: 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20 44  be discarded.  D
5dc0: 6f 20 77 68 61 74 65 76 65 72 20 69 73 20 74 68  o whatever is th
5dd0: 65 20 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a  e right thing.**
5de0: 20 73 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65   so that pSet ke
5df0: 65 70 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53  eps the N_OR_COS
5e00: 54 20 62 65 73 74 20 65 6e 74 72 69 65 73 20 73  T best entries s
5e10: 65 65 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73  een so far..*/.s
5e20: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f  tatic int whereO
5e30: 72 49 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65  rInsert(.  Where
5e40: 4f 72 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20  OrSet *pSet,    
5e50: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72    /* The WhereOr
5e60: 53 65 74 20 74 6f 20 62 65 20 75 70 64 61 74 65  Set to be update
5e70: 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  d */.  Bitmask p
5e80: 72 65 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a  rereq,        /*
5e90: 20 50 72 65 72 65 71 75 69 73 69 74 65 73 20 6f   Prerequisites o
5ea0: 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  f the new entry 
5eb0: 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72  */.  WhereCost r
5ec0: 52 75 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 52  Run,        /* R
5ed0: 75 6e 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e  un-cost of the n
5ee0: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20 57 68  ew entry */.  Wh
5ef0: 65 72 65 43 6f 73 74 20 6e 4f 75 74 20 20 20 20  ereCost nOut    
5f00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5f10: 66 20 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68  f outputs for th
5f20: 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29  e new entry */.)
5f30: 7b 0a 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65  {.  u16 i;.  Whe
5f40: 72 65 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66  reOrCost *p;.  f
5f50: 6f 72 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d  or(i=pSet->n, p=
5f60: 70 53 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  pSet->a; i>0; i-
5f70: 2d 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, p++){.    if(
5f80: 20 72 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26   rRun<=p->rRun &
5f90: 26 20 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70  & (prereq & p->p
5fa0: 72 65 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29  rereq)==prereq )
5fb0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65  {.      goto whe
5fc0: 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b  reOrInsert_done;
5fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
5fe0: 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20  ->rRun<=rRun && 
5ff0: 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65  (p->prereq & pre
6000: 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20  req)==p->prereq 
6010: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
6020: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
6030: 66 28 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f  f( pSet->n<N_OR_
6040: 43 4f 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20  COST ){.    p = 
6050: 26 70 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e  &pSet->a[pSet->n
6060: 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74  ++];.    p->nOut
6070: 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65   = nOut;.  }else
6080: 7b 0a 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e  {.    p = pSet->
6090: 61 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  a;.    for(i=1; 
60a0: 69 3c 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b  i<pSet->n; i++){
60b0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52  .      if( p->rR
60c0: 75 6e 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52  un>pSet->a[i].rR
60d0: 75 6e 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61  un ) p = pSet->a
60e0: 20 2b 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   + i;.    }.    
60f0: 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75  if( p->rRun<=rRu
6100: 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
6110: 7d 0a 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f  }.whereOrInsert_
6120: 64 6f 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65  done:.  p->prere
6130: 71 20 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d  q = prereq;.  p-
6140: 3e 72 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20  >rRun = rRun;.  
6150: 69 66 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74  if( p->nOut>nOut
6160: 20 29 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75   ) p->nOut = nOu
6170: 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  t;.  return 1;.}
6180: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
6190: 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  ze a preallocate
61a0: 64 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  d WhereClause st
61b0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
61c0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61  ic void whereCla
61d0: 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65  useInit(.  Where
61e0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
61f0: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
6200: 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69  Clause to be ini
6210: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68  tialized */.  Wh
6220: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
6230: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
6240: 45 52 45 20 70 72 6f 63 65 73 73 69 6e 67 20 63  ERE processing c
6250: 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70  ontext */.){.  p
6260: 57 43 2d 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49  WC->pWInfo = pWI
6270: 6e 66 6f 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74  nfo;.  pWC->pOut
6280: 65 72 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  er = 0;.  pWC->n
6290: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d  Term = 0;.  pWC-
62a0: 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69  >nSlot = ArraySi
62b0: 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29  ze(pWC->aStatic)
62c0: 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43  ;.  pWC->a = pWC
62d0: 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a  ->aStatic;.}../*
62e0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
62f0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
6300: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
6310: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29  ar(WhereClause*)
6320: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  ;../*.** Dealloc
6330: 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ate all memory a
6340: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
6350: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a   WhereOrInfo obj
6360: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
6370: 6f 69 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44  oid whereOrInfoD
6380: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
6390: 62 2c 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a  b, WhereOrInfo *
63a0: 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  p){.  whereClaus
63b0: 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a  eClear(&p->wc);.
63c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
63d0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
63e0: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20   Deallocate all 
63f0: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
6400: 64 20 77 69 74 68 20 61 20 57 68 65 72 65 41 6e  d with a WhereAn
6410: 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  dInfo object..*/
6420: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
6430: 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28  reAndInfoDelete(
6440: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
6450: 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20  reAndInfo *p){. 
6460: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
6470: 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c  r(&p->wc);.  sql
6480: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6490: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  );.}../*.** Deal
64a0: 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65 43 6c  locate a WhereCl
64b0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  ause structure. 
64c0: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
64d0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74   structure.** it
64e0: 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65  self is not free
64f0: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
6500: 20 69 73 20 74 68 65 20 69 6e 76 65 72 73 65 20   is the inverse 
6510: 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  of whereClauseIn
6520: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
6530: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
6540: 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73  Clear(WhereClaus
6550: 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69  e *pWC){.  int i
6560: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61  ;.  WhereTerm *a
6570: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
6580: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
6590: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72  Parse->db;.  for
65a0: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c  (i=pWC->nTerm-1,
65b0: 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b   a=pWC->a; i>=0;
65c0: 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20   i--, a++){.    
65d0: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
65e0: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b   TERM_DYNAMIC ){
65f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
6600: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  prDelete(db, a->
6610: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
6620: 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73    if( a->wtFlags
6630: 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29   & TERM_ORINFO )
6640: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49  {.      whereOrI
6650: 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d  nfoDelete(db, a-
6660: 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20  >u.pOrInfo);.   
6670: 20 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74   }else if( a->wt
6680: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44  Flags & TERM_AND
6690: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68  INFO ){.      wh
66a0: 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65  ereAndInfoDelete
66b0: 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e  (db, a->u.pAndIn
66c0: 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  fo);.    }.  }. 
66d0: 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43   if( pWC->a!=pWC
66e0: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
66f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6700: 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a  b, pWC->a);.  }.
6710: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
6720: 69 6e 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54  ingle new WhereT
6730: 65 72 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65  erm entry to the
6740: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
6750: 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20  ect pWC..** The 
6760: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62  new WhereTerm ob
6770: 6a 65 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63  ject is construc
6780: 74 65 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20  ted from Expr p 
6790: 61 6e 64 20 77 69 74 68 20 77 74 46 6c 61 67 73  and with wtFlags
67a0: 2e 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  ..** The index i
67b0: 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68  n pWC->a[] of th
67c0: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
67d0: 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
67e0: 75 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20  uccess..** 0 is 
67f0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
6800: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f  new WhereTerm co
6810: 75 6c 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64  uld not be added
6820: 20 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79   due to a memory
6830: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  .** allocation e
6840: 72 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72  rror.  The memor
6850: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
6860: 6c 75 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63  lure will be rec
6870: 6f 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  orded in.** the 
6880: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6890: 20 66 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69   flag so that hi
68a0: 67 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74  gher-level funct
68b0: 69 6f 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20  ions can detect 
68c0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  it..**.** This r
68d0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72  outine will incr
68e0: 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
68f0: 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72   the pWC->a[] ar
6900: 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
6910: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
6920: 74 46 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20  tFlags argument 
6930: 69 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59  includes TERM_DY
6940: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70  NAMIC, then resp
6950: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f  onsibility.** fo
6960: 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 78  r freeing the ex
6970: 70 72 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73  pression p is as
6980: 73 75 6d 65 64 20 62 79 20 74 68 65 20 57 68 65  sumed by the Whe
6990: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
69a0: 70 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  pWC..** This is 
69b0: 74 72 75 65 20 65 76 65 6e 20 69 66 20 74 68 69  true even if thi
69c0: 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
69d0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
69e0: 77 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  w WhereTerm..**.
69f0: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69  ** WARNING:  Thi
6a00: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
6a10: 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  reallocate the s
6a20: 70 61 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f  pace used to sto
6a30: 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73  re.** WhereTerms
6a40: 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20  .  All pointers 
6a50: 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20 73 68  to WhereTerms sh
6a60: 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61  ould be invalida
6a70: 74 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c  ted after.** cal
6a80: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
6a90: 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72  e.  Such pointer
6aa0: 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69  s may be reiniti
6ab0: 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72 65  alized by refere
6ac0: 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43  ncing.** the pWC
6ad0: 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ->a[] array..*/.
6ae0: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
6af0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68 65  ClauseInsert(Whe
6b00: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
6b10: 78 70 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61  xpr *p, u8 wtFla
6b20: 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  gs){.  WhereTerm
6b30: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
6b40: 64 78 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  dx;.  testcase( 
6b50: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
6b60: 49 52 54 55 41 4c 20 29 3b 0a 20 20 69 66 28 20  IRTUAL );.  if( 
6b70: 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d  pWC->nTerm>=pWC-
6b80: 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68  >nSlot ){.    Wh
6b90: 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20  ereTerm *pOld = 
6ba0: 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69  pWC->a;.    sqli
6bb0: 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70  te3 *db = pWC->p
6bc0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
6bd0: 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20  b;.    pWC->a = 
6be0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6bf0: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57  aw(db, sizeof(pW
6c00: 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53  C->a[0])*pWC->nS
6c10: 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  lot*2 );.    if(
6c20: 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20   pWC->a==0 ){.  
6c30: 20 20 20 20 69 66 28 20 77 74 46 6c 61 67 73 20      if( wtFlags 
6c40: 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29  & TERM_DYNAMIC )
6c50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6c60: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
6c70: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
6c80: 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b    pWC->a = pOld;
6c90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
6ca0: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
6cb0: 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20  y(pWC->a, pOld, 
6cc0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
6cd0: 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20  )*pWC->nTerm);. 
6ce0: 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43     if( pOld!=pWC
6cf0: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
6d00: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6d10: 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20  (db, pOld);.    
6d20: 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74  }.    pWC->nSlot
6d30: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6d40: 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e  ocSize(db, pWC->
6d50: 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  a)/sizeof(pWC->a
6d60: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72  [0]);.  }.  pTer
6d70: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20  m = &pWC->a[idx 
6d80: 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b  = pWC->nTerm++];
6d90: 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  .  pTerm->pExpr 
6da0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
6db0: 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20 20 70  pCollate(p);.  p
6dc0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20  Term->wtFlags = 
6dd0: 77 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d  wtFlags;.  pTerm
6de0: 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70  ->pWC = pWC;.  p
6df0: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
6e00: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78  -1;.  return idx
6e10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6e20: 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69  routine identifi
6e30: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
6e40: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
6e50: 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65  lause where.** e
6e60: 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f  ach subexpressio
6e70: 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
6e80: 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74  y the AND operat
6e90: 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  or or some other
6ea0: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65  .** operator spe
6eb0: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70  cified in the op
6ec0: 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65   parameter.  The
6ed0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
6ee0: 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c  ucture.** is fil
6ef0: 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72  led with pointer
6f00: 73 20 74 6f 20 73 75 62 65 78 70 72 65 73 73 69  s to subexpressi
6f10: 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ons.  For exampl
6f20: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52  e:.**.**    WHER
6f30: 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e  E  a=='hello' AN
6f40: 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29  D coalesce(b,11)
6f50: 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64  <10 AND (c+12!=d
6f60: 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20   OR c==22).**   
6f70: 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
6f80: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
6f90: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
6fa0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
6fb0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 73 6c  **            sl
6fc0: 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20  ot[0]           
6fd0: 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20   slot[1]        
6fe0: 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a         slot[2].*
6ff0: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
7000: 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  l WHERE clause i
7010: 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74  n pExpr is unalt
7020: 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20  ered.  All this 
7030: 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20  routine.** does 
7040: 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65  is make slot[] e
7050: 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20  ntries point to 
7060: 73 75 62 73 74 72 75 63 74 75 72 65 20 77 69 74  substructure wit
7070: 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a  hin pExpr..**.**
7080: 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   In the previous
7090: 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e   sentence and in
70a0: 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73   the diagram, "s
70b0: 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f  lot[]" refers to
70c0: 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61  .** the WhereCla
70d0: 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20  use.a[] array.  
70e0: 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79  The slot[] array
70f0: 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64   grows as needed
7100: 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61   to contain.** a
7110: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
7120: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f  WHERE clause..*/
7130: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
7140: 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61  reSplit(WhereCla
7150: 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
7160: 70 45 78 70 72 2c 20 75 38 20 6f 70 29 7b 0a 20  pExpr, u8 op){. 
7170: 20 70 57 43 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20   pWC->op = op;. 
7180: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
7190: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45  return;.  if( pE
71a0: 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20  xpr->op!=op ){. 
71b0: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
71c0: 73 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c  sert(pWC, pExpr,
71d0: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
71e0: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
71f0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
7200: 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70  op);.    whereSp
7210: 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e  lit(pWC, pExpr->
7220: 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d  pRight, op);.  }
7230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
7240: 6c 69 7a 65 20 61 20 57 68 65 72 65 4d 61 73 6b  lize a WhereMask
7250: 53 65 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 23 64  Set object.*/.#d
7260: 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65  efine initMaskSe
7270: 74 28 50 29 20 20 28 50 29 2d 3e 6e 3d 30 0a 0a  t(P)  (P)->n=0..
7280: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7290: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
72a0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
72b0: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
72c0: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
72d0: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
72e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
72f0: 73 6b 20 67 65 74 4d 61 73 6b 28 57 68 65 72 65  sk getMask(Where
7300: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
7310: 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b  t, int iCursor){
7320: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
7330: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c  rt( pMaskSet->n<
7340: 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74  =(int)sizeof(Bit
7350: 6d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72  mask)*8 );.  for
7360: 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74  (i=0; i<pMaskSet
7370: 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ->n; i++){.    i
7380: 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  f( pMaskSet->ix[
7390: 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  i]==iCursor ){. 
73a0: 20 20 20 20 20 72 65 74 75 72 6e 20 4d 41 53 4b       return MASK
73b0: 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20  BIT(i);.    }.  
73c0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
73d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
73e0: 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72  new mask for cur
73f0: 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a  sor iCursor..**.
7400: 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  ** There is one 
7410: 63 75 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65  cursor per table
7420: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
7430: 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  use.  The number
7440: 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e   of.** tables in
7450: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
7460: 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61   is limited by a
7470: 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74   test early in t
7480: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  he.** sqlite3Whe
7490: 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e  reBegin() routin
74a0: 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74  e.  So we know t
74b0: 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74  hat the pMaskSet
74c0: 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20  ->ix[].** array 
74d0: 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66  will never overf
74e0: 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  low..*/.static v
74f0: 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57  oid createMask(W
7500: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
7510: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
7520: 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  or){.  assert( p
7530: 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72  MaskSet->n < Arr
7540: 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d  aySize(pMaskSet-
7550: 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53  >ix) );.  pMaskS
7560: 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d  et->ix[pMaskSet-
7570: 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b  >n++] = iCursor;
7580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  .}../*.** These 
7590: 72 6f 75 74 69 6e 65 73 20 77 61 6c 6b 20 28 72  routines walk (r
75a0: 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65  ecursively) an e
75b0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
75c0: 6e 64 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 61  nd generate.** a
75d0: 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74   bitmask indicat
75e0: 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65 73  ing which tables
75f0: 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 61   are used in tha
7600: 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  t expression.** 
7610: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
7620: 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74  Bitmask exprList
7630: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
7640: 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69  MaskSet*, ExprLi
7650: 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74  st*);.static Bit
7660: 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54  mask exprSelectT
7670: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
7680: 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a  askSet*, Select*
7690: 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  );.static Bitmas
76a0: 6b 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  k exprTableUsage
76b0: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
76c0: 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70  MaskSet, Expr *p
76d0: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  ){.  Bitmask mas
76e0: 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d  k = 0;.  if( p==
76f0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7700: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
7710: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b  LUMN ){.    mask
7720: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
7730: 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b  Set, p->iTable);
7740: 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b  .    return mask
7750: 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65  ;.  }.  mask = e
7760: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
7770: 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68  askSet, p->pRigh
7780: 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78  t);.  mask |= ex
7790: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
77a0: 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29  skSet, p->pLeft)
77b0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
77c0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
77d0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
77e0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65  mask |= exprSele
77f0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
7800: 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c  skSet, p->x.pSel
7810: 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ect);.  }else{. 
7820: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
7830: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
7840: 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69  askSet, p->x.pLi
7850: 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  st);.  }.  retur
7860: 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63  n mask;.}.static
7870: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73   Bitmask exprLis
7880: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
7890: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
78a0: 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  et, ExprList *pL
78b0: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
78c0: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
78d0: 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  0;.  if( pList )
78e0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
78f0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
7900: 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20  ++){.      mask 
7910: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
7920: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73  e(pMaskSet, pLis
7930: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
7940: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7950: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69  rn mask;.}.stati
7960: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65  c Bitmask exprSe
7970: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57  lectTableUsage(W
7980: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
7990: 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70  skSet, Select *p
79a0: 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61  S){.  Bitmask ma
79b0: 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  sk = 0;.  while(
79c0: 20 70 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69   pS ){.    SrcLi
79d0: 73 74 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70  st *pSrc = pS->p
79e0: 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  Src;.    mask |=
79f0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
7a00: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
7a10: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d  ->pEList);.    m
7a20: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
7a30: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
7a40: 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79  et, pS->pGroupBy
7a50: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
7a60: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
7a70: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
7a80: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d  pOrderBy);.    m
7a90: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
7aa0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
7ab0: 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  pS->pWhere);.   
7ac0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
7ad0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
7ae0: 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  , pS->pHaving);.
7af0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
7b00: 53 72 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Src!=0) ){.     
7b10: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
7b20: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
7b30: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
7b40: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53     mask |= exprS
7b50: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
7b60: 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e  pMaskSet, pSrc->
7b70: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
7b80: 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65         mask |= e
7b90: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
7ba0: 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b  askSet, pSrc->a[
7bb0: 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d  i].pOn);.      }
7bc0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20  .    }.    pS = 
7bd0: 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  pS->pPrior;.  }.
7be0: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
7bf0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
7c00: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
7c10: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65   operator is one
7c20: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
7c30: 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c  s that is.** all
7c40: 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65  owed for an inde
7c50: 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  xable WHERE clau
7c60: 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c  se term.  The al
7c70: 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20  lowed operators 
7c80: 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c  are.** "=", "<",
7c90: 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22   ">", "<=", ">="
7ca0: 2c 20 22 49 4e 22 2c 20 61 6e 64 20 22 49 53 20  , "IN", and "IS 
7cb0: 4e 55 4c 4c 22 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL".*/.static 
7cc0: 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e  int allowedOp(in
7cd0: 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28  t op){.  assert(
7ce0: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20   TK_GT>TK_EQ && 
7cf0: 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_GT<TK_GE );. 
7d00: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54   assert( TK_LT>T
7d10: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b  K_EQ && TK_LT<TK
7d20: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
7d30: 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20   TK_LE>TK_EQ && 
7d40: 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LE<TK_GE );. 
7d50: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
7d60: 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74  TK_EQ+4 );.  ret
7d70: 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c  urn op==TK_IN ||
7d80: 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f   (op>=TK_EQ && o
7d90: 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d  p<=TK_GE) || op=
7da0: 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f  =TK_ISNULL;.}../
7db0: 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62  *.** Swap two ob
7dc0: 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 59  jects of type TY
7dd0: 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  PE..*/.#define S
7de0: 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54  WAP(TYPE,A,B) {T
7df0: 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d  YPE t=A; A=B; B=
7e00: 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75  t;}../*.** Commu
7e10: 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  te a comparison 
7e20: 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65  operator.  Expre
7e30: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
7e40: 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61  rm "X op Y".** a
7e50: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
7e60: 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a  o "Y op X"..**.*
7e70: 2a 20 49 66 20 6c 65 66 74 2f 72 69 67 68 74 20  * If left/right 
7e80: 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c 65 73  precedence rules
7e90: 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20   come into play 
7ea0: 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67  when determining
7eb0: 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e   the.** collatin
7ec0: 67 20 73 65 71 75 65 6e 63 65 2c 20 74 68 65 6e  g sequence, then
7ed0: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
7ee0: 72 73 20 61 72 65 20 61 64 6a 75 73 74 65 64 20  rs are adjusted 
7ef0: 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61  to ensure.** tha
7f00: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
7f10: 73 65 71 75 65 6e 63 65 20 64 6f 65 73 20 6e 6f  sequence does no
7f20: 74 20 63 68 61 6e 67 65 2e 20 20 46 6f 72 20 65  t change.  For e
7f30: 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20 63 6f  xample:.** "Y co
7f40: 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20  llate NOCASE op 
7f50: 58 22 20 62 65 63 6f 6d 65 73 20 22 58 20 6f 70  X" becomes "X op
7f60: 20 59 22 20 62 65 63 61 75 73 65 20 61 6e 79 20   Y" because any 
7f70: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7f80: 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66  ce on.** the lef
7f90: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61  t hand side of a
7fa0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72   comparison over
7fb0: 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74  rides any collat
7fc0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a  ion sequence .**
7fd0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
7fe0: 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20   right. For the 
7ff0: 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20  same reason the 
8000: 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a  EP_Collate flag.
8010: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74  ** is not commut
8020: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
8030: 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50  id exprCommute(P
8040: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
8050: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31  pr *pExpr){.  u1
8060: 36 20 65 78 70 52 69 67 68 74 20 3d 20 28 70 45  6 expRight = (pE
8070: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61  xpr->pRight->fla
8080: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
8090: 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74 20  ;.  u16 expLeft 
80a0: 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = (pExpr->pLeft-
80b0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
80c0: 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ate);.  assert( 
80d0: 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d  allowedOp(pExpr-
80e0: 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f  >op) && pExpr->o
80f0: 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66  p!=TK_IN );.  if
8100: 28 20 65 78 70 52 69 67 68 74 3d 3d 65 78 70 4c  ( expRight==expL
8110: 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  eft ){.    /* Ei
8120: 74 68 65 72 20 58 20 61 6e 64 20 59 20 62 6f 74  ther X and Y bot
8130: 68 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f  h have COLLATE o
8140: 70 65 72 61 74 6f 72 20 6f 72 20 6e 65 69 74 68  perator or neith
8150: 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28  er do */.    if(
8160: 20 65 78 70 52 69 67 68 74 20 29 7b 0a 20 20 20   expRight ){.   
8170: 20 20 20 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64     /* Both X and
8180: 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20   Y have COLLATE 
8190: 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65  operators.  Make
81a0: 20 73 75 72 65 20 58 20 69 73 20 61 6c 77 61 79   sure X is alway
81b0: 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20  s.      ** used 
81c0: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
81d0: 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20  EP_Collate flag 
81e0: 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20  from Y. */.     
81f0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
8200: 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c  flags &= ~EP_Col
8210: 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20  late;.    }else 
8220: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
8230: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
8240: 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20  Expr->pLeft)!=0 
8250: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65 69 74  ){.      /* Neit
8260: 68 65 72 20 58 20 6e 6f 72 20 59 20 68 61 76 65  her X nor Y have
8270: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
8280: 72 73 2c 20 62 75 74 20 58 20 68 61 73 20 61 20  rs, but X has a 
8290: 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20 20 20  non-default.    
82a0: 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73    ** collating s
82b0: 65 71 75 65 6e 63 65 2e 20 20 53 6f 20 61 64 64  equence.  So add
82c0: 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20   the EP_Collate 
82d0: 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63  marker on X to c
82e0: 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74  ause.      ** it
82f0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
8300: 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20  first. */.      
8310: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c  pExpr->pLeft->fl
8320: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
8330: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53  e;.    }.  }.  S
8340: 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d  WAP(Expr*,pExpr-
8350: 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70  >pRight,pExpr->p
8360: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
8370: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b  pr->op>=TK_GT ){
8380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
8390: 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20  LT==TK_GT+2 );. 
83a0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
83b0: 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20  ==TK_LE+2 );.   
83c0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
83d0: 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  K_EQ );.    asse
83e0: 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20  rt( TK_GT<TK_LE 
83f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
8400: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
8410: 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b  && pExpr->op<=TK
8420: 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72  _GE );.    pExpr
8430: 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e  ->op = ((pExpr->
8440: 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f  op-TK_GT)^2)+TK_
8450: 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  GT;.  }.}../*.**
8460: 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20   Translate from 
8470: 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74  TK_xx operator t
8480: 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e  o WO_xx bitmask.
8490: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f  .*/.static u16 o
84a0: 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20  peratorMask(int 
84b0: 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20  op){.  u16 c;.  
84c0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
84d0: 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f  p(op) );.  if( o
84e0: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
84f0: 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c  c = WO_IN;.  }el
8500: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
8510: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20  NULL ){.    c = 
8520: 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  WO_ISNULL;.  }el
8530: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
8540: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
8550: 51 29 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a  Q)) < 0x7fff );.
8560: 20 20 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f      c = (u16)(WO
8570: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29  _EQ<<(op-TK_EQ))
8580: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
8590: 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
85a0: 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b   c==WO_ISNULL );
85b0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
85c0: 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e  K_IN || c==WO_IN
85d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
85e0: 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f  !=TK_EQ || c==WO
85f0: 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _EQ );.  assert(
8600: 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d   op!=TK_LT || c=
8610: 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65  =WO_LT );.  asse
8620: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  rt( op!=TK_LE ||
8630: 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61   c==WO_LE );.  a
8640: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54  ssert( op!=TK_GT
8650: 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a   || c==WO_GT );.
8660: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
8670: 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20  _GE || c==WO_GE 
8680: 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d  );.  return c;.}
8690: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
86a0: 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68 65 72  to the next Wher
86b0: 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68  eTerm that match
86c0: 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
86d0: 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
86e0: 65 73 74 61 62 6c 69 73 68 65 64 20 77 68 65 6e  established when
86f0: 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a 65 63   the pScan objec
8700: 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65  t was initialize
8710: 64 20 62 79 20 77 68 65 72 65 53 63 61 6e 49 6e  d by whereScanIn
8720: 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  it()..** Return 
8730: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
8740: 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69  e no more matchi
8750: 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a  ng WhereTerms..*
8760: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
8770: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e 65 78  rm *whereScanNex
8780: 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63  t(WhereScan *pSc
8790: 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b  an){.  int iCur;
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
87b0: 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65  he cursor on the
87c0: 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d   LHS of the term
87d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
87e0: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  n;         /* Th
87f0: 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  e column on the 
8800: 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 2e  LHS of the term.
8810: 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a    -1 for IPK */.
8820: 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
8830: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
8840: 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 74 65  ression being te
8850: 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  sted */.  WhereC
8860: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
8870: 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
8880: 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20  pScan->pWC */.  
8890: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
88a0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
88b0: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f   being tested */
88c0: 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53 63 61 6e  .  int k = pScan
88d0: 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65 72 65  ->k;    /* Where
88e0: 20 74 6f 20 73 74 61 72 74 20 73 63 61 6e 6e 69   to start scanni
88f0: 6e 67 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20  ng */..  while( 
8900: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 70  pScan->iEquiv<=p
8910: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a  Scan->nEquiv ){.
8920: 20 20 20 20 69 43 75 72 20 3d 20 70 53 63 61 6e      iCur = pScan
8930: 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e  ->aEquiv[pScan->
8940: 69 45 71 75 69 76 2d 32 5d 3b 0a 20 20 20 20 69  iEquiv-2];.    i
8950: 43 6f 6c 75 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e  Column = pScan->
8960: 61 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45  aEquiv[pScan->iE
8970: 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20 77 68 69  quiv-1];.    whi
8980: 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63 61 6e  le( (pWC = pScan
8990: 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20 20 20  ->pWC)!=0 ){.   
89a0: 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
89b0: 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54  ->a+k; k<pWC->nT
89c0: 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b  erm; k++, pTerm+
89d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
89e0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
89f0: 72 3d 3d 69 43 75 72 20 26 26 20 70 54 65 72 6d  r==iCur && pTerm
8a00: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
8a10: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
8a20: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
8a30: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8a40: 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20  EQUIV)!=0.      
8a50: 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e       && pScan->n
8a60: 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28  Equiv<ArraySize(
8a70: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 29 0a 20  pScan->aEquiv). 
8a80: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
8a90: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
8aa0: 20 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20             pX = 
8ab0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
8ac0: 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45  ollate(pTerm->pE
8ad0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
8ae0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
8af0: 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
8b00: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  UMN );.         
8b10: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53     for(j=0; j<pS
8b20: 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b 3d  can->nEquiv; j+=
8b30: 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2){.            
8b40: 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61 45 71    if( pScan->aEq
8b50: 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62  uiv[j]==pX->iTab
8b60: 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  le.             
8b70: 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 45 71 75    && pScan->aEqu
8b80: 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f  iv[j+1]==pX->iCo
8b90: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
8ba0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
8bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
8bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
8bd0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
8be0: 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  ==pScan->nEquiv 
8bf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8c00: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a   pScan->aEquiv[j
8c10: 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a  ] = pX->iTable;.
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
8c30: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d  can->aEquiv[j+1]
8c40: 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a   = pX->iColumn;.
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
8c60: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d 20 32  can->nEquiv += 2
8c70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
8c80: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8c90: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
8ca0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53  ->eOperator & pS
8cb0: 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20  can->opMask)!=0 
8cc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
8cd0: 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66 66  * Verify the aff
8ce0: 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74  inity and collat
8cf0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74  ing sequence mat
8d00: 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
8d10: 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f    if( pScan->zCo
8d20: 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d  llName && (pTerm
8d30: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
8d40: 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  _ISNULL)==0 ){. 
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c               Col
8d60: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
8d70: 20 20 20 20 20 20 20 20 20 20 20 50 61 72 73 65             Parse
8d80: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
8d90: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
8db0: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
8dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
8dd0: 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
8de0: 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70  AffinityOk(pX, p
8df0: 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b  Scan->idxaff) ){
8e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8e10: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8e20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8e30: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
8e40: 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pX->pLeft);.    
8e50: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
8e60: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
8e70: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
8e80: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8eb0: 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65 66          pX->pLef
8ec0: 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8ee0: 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f  ( pColl==0 ) pCo
8ef0: 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
8f00: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
8f10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
8f20: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
8f30: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61 6e  ll->zName, pScan
8f40: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a  ->zCollName) ){.
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f60: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
8f70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8f80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8f90: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
8fa0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
8fb0: 51 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  Q)!=0.          
8fc0: 20 20 20 26 26 20 28 70 58 20 3d 20 70 54 65 72     && (pX = pTer
8fd0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
8fe0: 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  )->op==TK_COLUMN
8ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
9000: 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 63   pX->iTable==pSc
9010: 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a 20 20  an->aEquiv[0].  
9020: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58             && pX
9030: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e  ->iColumn==pScan
9040: 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20 20 20  ->aEquiv[1].    
9050: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
9060: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
9070: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
9080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63  .            pSc
9090: 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20  an->k = k+1;.   
90a0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
90b0: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  pTerm;.         
90c0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
90d0: 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e     }.      pScan
90e0: 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70  ->pWC = pScan->p
90f0: 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20  WC->pOuter;.    
9100: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    k = 0;.    }. 
9110: 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20     pScan->pWC = 
9120: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a  pScan->pOrigWC;.
9130: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70      k = 0;.    p
9140: 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b 3d 20  Scan->iEquiv += 
9150: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
9160: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  0;.}../*.** Init
9170: 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20 63  ialize a WHERE c
9180: 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f 62  lause scanner ob
9190: 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ject.  Return a 
91a0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
91b0: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20 20  * first match.  
91c0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
91d0: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63  here are no matc
91e0: 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  hes..**.** The s
91f0: 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20 73  canner will be s
9200: 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48 45  earching the WHE
9210: 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20  RE clause pWC.  
9220: 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20  It will look.** 
9230: 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
9240: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
9250: 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69 73  xpr>" where X is
9260: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20   column iColumn 
9270: 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72  of table.** iCur
9280: 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74  .  The <op> must
9290: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f   be one of the o
92a0: 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69 62  perators describ
92b0: 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a  ed by opMask..**
92c0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72 63  .** If the searc
92d0: 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20 74  h is for X and t
92e0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
92f0: 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f  contains terms o
9300: 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d  f the.** form X=
9310: 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  Y then this rout
9320: 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 72  ine might also r
9330: 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20 74  eturn terms of t
9340: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f  he form.** "Y <o
9350: 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68 65  p> <expr>".  The
9360: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   number of level
9370: 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69 74  s of transitivit
9380: 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a  y is limited,.**
9390: 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20 74   but is enough t
93a0: 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f  o handle most co
93b0: 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67  mmonly occurring
93c0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
93d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e  .**.** If X is n
93e0: 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  ot the INTEGER P
93f0: 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20  RIMARY KEY then 
9400: 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  X must be compat
9410: 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64  ible with.** ind
9420: 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  ex pIdx..*/.stat
9430: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
9440: 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57  ereScanInit(.  W
9450: 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c  hereScan *pScan,
9460: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
9470: 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62  ereScan object b
9480: 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64  eing initialized
9490: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
94a0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a  e *pWC,       /*
94b0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
94c0: 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  e to be scanned 
94d0: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94f0: 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66  Cursor to scan f
9500: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  or */.  int iCol
9510: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
9520: 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61  /* Column to sca
9530: 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f  n for */.  u32 o
9540: 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20  pMask,          
9550: 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73     /* Operator(s
9560: 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  ) to scan for */
9570: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
9580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
9590: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
95a0: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
95b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a   */.){.  int j;.
95c0: 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63  .  /* memset(pSc
95d0: 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  an, 0, sizeof(*p
95e0: 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63  Scan)); */.  pSc
95f0: 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57  an->pOrigWC = pW
9600: 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20  C;.  pScan->pWC 
9610: 3d 20 70 57 43 3b 0a 20 20 69 66 28 20 70 49 64  = pWC;.  if( pId
9620: 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20  x && iColumn>=0 
9630: 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64  ){.    pScan->id
9640: 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61  xaff = pIdx->pTa
9650: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
9660: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
9670: 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e   for(j=0; pIdx->
9680: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f  aiColumn[j]!=iCo
9690: 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
96a0: 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70    if( NEVER(j>=p
96b0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20  Idx->nColumn) ) 
96c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
96d0: 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c      pScan->zColl
96e0: 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Name = pIdx->azC
96f0: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b  oll[j];.  }else{
9700: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  .    pScan->idxa
9710: 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61  ff = 0;.    pSca
9720: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30  n->zCollName = 0
9730: 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f  ;.  }.  pScan->o
9740: 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a  pMask = opMask;.
9750: 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a    pScan->k = 0;.
9760: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
9770: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
9780: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20 3d 20  an->aEquiv[1] = 
9790: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e  iColumn;.  pScan
97a0: 2d 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a 20 20  ->nEquiv = 2;.  
97b0: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20  pScan->iEquiv = 
97c0: 32 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72  2;.  return wher
97d0: 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29  eScanNext(pScan)
97e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
97f0: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
9800: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
9810: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
9820: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
9830: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
9840: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
9850: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
9860: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
9870: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
9880: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
9890: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
98a0: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
98b0: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
98c0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
98d0: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
98e0: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
98f0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  d..**.** The ter
9900: 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  m returned might
9910: 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20   by Y=<expr> if 
9920: 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72  there is another
9930: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a   constraint in.*
9940: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
9950: 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  se that specifie
9960: 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79  s that X=Y.  Any
9970: 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74   such constraint
9980: 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65  s will be.** ide
9990: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57  ntified by the W
99a0: 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74  O_EQUIV bit in t
99b0: 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  he pTerm->eOpera
99c0: 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a  tor field.  The.
99d0: 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72 61  ** aEquiv[] arra
99e0: 79 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61 6c  y holds X and al
99f0: 6c 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74  l its equivalent
9a00: 73 2c 20 77 69 74 68 20 65 61 63 68 20 53 51 4c  s, with each SQL
9a10: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61 6b   variable.** tak
9a20: 69 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74 73  ing up two slots
9a30: 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20 54   in aEquiv[].  T
9a40: 68 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69 73  he first slot is
9a50: 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20   for the cursor 
9a60: 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74 68  number.** and th
9a70: 65 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72 20  e second is for 
9a80: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
9a90: 72 2e 20 20 54 68 65 72 65 20 61 72 65 20 32 32  r.  There are 22
9aa0: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
9ab0: 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d 65  [].** so that me
9ac0: 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20  ans we can look 
9ad0: 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f  for X plus up to
9ae0: 20 31 30 20 6f 74 68 65 72 20 65 71 75 69 76 61   10 other equiva
9af0: 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a 20  lent values..** 
9b00: 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66  Hence a search f
9b10: 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e  or X will return
9b20: 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 20   <expr> if X=A1 
9b30: 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32  and A1=A2 and A2
9b40: 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20 61  =A3.** and ... a
9b50: 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31  nd A9=A10 and A1
9b60: 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20  0=<expr>..**.** 
9b70: 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  If there are mul
9b80: 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
9b90: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
9ba0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
9bb0: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74  op> <expr>".** t
9bc0: 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20  hen try for the 
9bd0: 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65  one with no depe
9be0: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70  ndencies on <exp
9bf0: 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f  r> - in other wo
9c00: 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78  rds where.** <ex
9c10: 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  pr> is a constan
9c20: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  t expression of 
9c30: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79  some kind.  Only
9c40: 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20   return entries 
9c50: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
9c60: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
9c70: 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  Y is a column in
9c80: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
9c90: 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a  f no terms of.**
9ca0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
9cb0: 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20  > <const-expr>" 
9cc0: 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74  exist.   If no t
9cd0: 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73  erms with a cons
9ce0: 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73  tant RHS.** exis
9cf0: 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e  t, try to return
9d00: 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65   a term that doe
9d10: 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55  s not use WO_EQU
9d20: 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  IV..*/.static Wh
9d30: 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72  ereTerm *findTer
9d40: 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m(.  WhereClause
9d50: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
9d60: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
9d70: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
9d80: 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
9d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
9da0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  or number of LHS
9db0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
9dc0: 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  n,          /* C
9dd0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
9de0: 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  LHS */.  Bitmask
9df0: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
9e00: 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f  * RHS must not o
9e10: 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73  verlap with this
9e20: 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f   mask */.  u32 o
9e30: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
9e40: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78   /* Mask of WO_x
9e50: 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62  x values describ
9e60: 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ing operator */.
9e70: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
9e80: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
9e90: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
9ea0: 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69  th this index, i
9eb0: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
9ec0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52  .  WhereTerm *pR
9ed0: 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57 68 65  esult = 0;.  Whe
9ee0: 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57 68 65  reTerm *p;.  Whe
9ef0: 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a 20 20  reScan scan;..  
9f00: 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  p = whereScanIni
9f10: 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20 69 43  t(&scan, pWC, iC
9f20: 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c  ur, iColumn, op,
9f30: 20 70 49 64 78 29 3b 0a 20 20 77 68 69 6c 65 28   pIdx);.  while(
9f40: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70   p ){.    if( (p
9f50: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
9f60: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a  notReady)==0 ){.
9f70: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65        if( p->pre
9f80: 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28  reqRight==0 && (
9f90: 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f  p->eOperator&WO_
9fa0: 45 51 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  EQ)!=0 ){.      
9fb0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20    return p;.    
9fc0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52    }.      if( pR
9fd0: 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73 75  esult==0 ) pResu
9fe0: 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  lt = p;.    }.  
9ff0: 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 4e    p = whereScanN
a000: 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d 0a  ext(&scan);.  }.
a010: 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c 74    return pResult
a020: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
a030: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
a040: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
a050: 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 57  lyze(SrcList*, W
a060: 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74  hereClause*, int
a070: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65  );../*.** Call e
a080: 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c  xprAnalyze on al
a090: 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45  l terms in a WHE
a0a0: 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2f 0a  RE clause.  .*/.
a0b0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
a0c0: 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72  AnalyzeAll(.  Sr
a0d0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
a0e0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
a0f0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
a100: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
a110: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
a120: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
a130: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
a140: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
a150: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20  i=pWC->nTerm-1; 
a160: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
a170: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62  exprAnalyze(pTab
a180: 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20  List, pWC, i);. 
a190: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
a1a0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
a1b0: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
a1c0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
a1d0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
a1e0: 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45  ession is a LIKE
a1f0: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
a200: 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  r that.** can be
a210: 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
a220: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
a230: 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e  traints.  Return
a240: 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a   TRUE if it is.*
a250: 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69  * so and false i
a260: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  f not..**.** In 
a270: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70  order for the op
a280: 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74  erator to be opt
a290: 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48  imizible, the RH
a2a0: 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69  S must be a stri
a2b0: 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68  ng.** literal th
a2c0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  at does not begi
a2d0: 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72  n with a wildcar
a2e0: 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  d.  .*/.static i
a2f0: 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  nt isLikeOrGlob(
a300: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a310: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
a320: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
a330: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
a340: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
a350: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
a360: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
a370: 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c  Expr **ppPrefix,
a380: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
a390: 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73  TK_STRING expres
a3a0: 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72  sion with patter
a3b0: 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e  n prefix */.  in
a3c0: 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20  t *pisComplete, 
a3d0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f  /* True if the o
a3e0: 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20  nly wildcard is 
a3f0: 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68  % in the last ch
a400: 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74  aracter */.  int
a410: 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f   *pnoCase      /
a420: 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63  * True if upperc
a430: 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ase is equivalen
a440: 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a  t to lowercase *
a450: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
a460: 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20  r *z = 0;       
a470: 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52    /* String on R
a480: 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61  HS of LIKE opera
a490: 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  tor */.  Expr *p
a4a0: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20  Right, *pLeft;  
a4b0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64      /* Right and
a4c0: 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49   left size of LI
a4d0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
a4e0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
a4f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
a500: 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20  ist of operands 
a510: 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  to the LIKE oper
a520: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b  ator */.  int c;
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72       /* One char
a550: 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a  acter in z[] */.
a560: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a580: 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69  Number of non-wi
a590: 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68  ldcard prefix ch
a5a0: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68  aracters */.  ch
a5b0: 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20  ar wc[3];       
a5c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64           /* Wild
a5d0: 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20  card characters 
a5e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
a5f0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
a600: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
a610: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ection */.  sqli
a620: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
a630: 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20  = 0;.  int op;  
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70    /* Opcode of p
a660: 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20  Right */..  if( 
a670: 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75  !sqlite3IsLikeFu
a680: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72  nction(db, pExpr
a690: 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29  , pnoCase, wc) )
a6a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a6b0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
a6c0: 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a  E_EBCDIC.  if( *
a6d0: 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e  pnoCase ) return
a6e0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69   0;.#endif.  pLi
a6f0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
a700: 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70  ist;.  pLeft = p
a710: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
a720: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  ;.  if( pLeft->o
a730: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20  p!=TK_COLUMN .  
a740: 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41   || sqlite3ExprA
a750: 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d  ffinity(pLeft)!=
a760: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
a770: 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  .   || IsVirtual
a780: 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20 20  (pLeft->pTab).  
a790: 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ){.    /* IMP: R
a7a0: 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54 68 65  -02065-49465 The
a7b0: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
a7c0: 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47  of the LIKE or G
a7d0: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73  LOB operator mus
a7e0: 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
a7f0: 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78  name of an index
a800: 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54  ed column with T
a810: 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f  EXT affinity. */
a820: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a830: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65   }.  assert( pLe
a840: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31  ft->iColumn!=(-1
a850: 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  ) ); /* Because 
a860: 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46  IPK never has AF
a870: 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69  F_TEXT */..  pRi
a880: 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  ght = pList->a[0
a890: 5d 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20  ].pExpr;.  op = 
a8a0: 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66  pRight->op;.  if
a8b0: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
a8c0: 52 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52  R ){.    op = pR
a8d0: 69 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20  ight->op2;.  }. 
a8e0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49   if( op==TK_VARI
a8f0: 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65  ABLE ){.    Vdbe
a900: 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20 70   *pReprepare = p
a910: 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72  Parse->pReprepar
a920: 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  e;.    int iCol 
a930: 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d  = pRight->iColum
a940: 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71  n;.    pVal = sq
a950: 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
a960: 64 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72  dValue(pReprepar
a970: 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  e, iCol, SQLITE_
a980: 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69  AFF_NONE);.    i
a990: 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74  f( pVal && sqlit
a9a0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
a9b0: 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  al)==SQLITE_TEXT
a9c0: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63   ){.      z = (c
a9d0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
a9e0: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a  lue_text(pVal);.
a9f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
aa00: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
aa10: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69  pParse->pVdbe, i
aa20: 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Col);.    assert
aa30: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
aa40: 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69  _VARIABLE || pRi
aa50: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  ght->op==TK_REGI
aa60: 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20  STER );.  }else 
aa70: 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  if( op==TK_STRIN
aa80: 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69  G ){.    z = pRi
aa90: 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  ght->u.zToken;. 
aaa0: 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20   }.  if( z ){.  
aab0: 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77    cnt = 0;.    w
aac0: 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29  hile( (c=z[cnt])
aad0: 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20  !=0 && c!=wc[0] 
aae0: 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63  && c!=wc[1] && c
aaf0: 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20  !=wc[2] ){.     
ab00: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   cnt++;.    }.  
ab10: 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26 20    if( cnt!=0 && 
ab20: 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31  255!=(u8)z[cnt-1
ab30: 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ] ){.      Expr 
ab40: 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20  *pPrefix;.      
ab50: 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63  *pisComplete = c
ab60: 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74  ==wc[0] && z[cnt
ab70: 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50  +1]==0;.      pP
ab80: 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45  refix = sqlite3E
ab90: 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e  xpr(db, TK_STRIN
aba0: 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  G, z);.      if(
abb0: 20 70 50 72 65 66 69 78 20 29 20 70 50 72 65 66   pPrefix ) pPref
abc0: 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74  ix->u.zToken[cnt
abd0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 70  ] = 0;.      *pp
abe0: 50 72 65 66 69 78 20 3d 20 70 50 72 65 66 69 78  Prefix = pPrefix
abf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d  ;.      if( op==
ac00: 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20  TK_VARIABLE ){. 
ac10: 20 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d         Vdbe *v =
ac20: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
ac30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ac40: 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c  dbeSetVarmask(v,
ac50: 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
ac60: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  );.        if( *
ac70: 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70  pisComplete && p
ac80: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  Right->u.zToken[
ac90: 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
aca0: 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f 66  /* If the rhs of
acb0: 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73   the LIKE expres
acc0: 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62  sion is a variab
acd0: 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  le, and the curr
ace0: 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ent.          **
acf0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61   value of the va
ad00: 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65  riable means the
ad10: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
ad20: 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45   invoke the LIKE
ad30: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75  .          ** fu
ad40: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20  nction, then no 
ad50: 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c  OP_Variable will
ad60: 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
ad70: 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20   program..      
ad80: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73      ** This caus
ad90: 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  es problems for 
ada0: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
adb0: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
adc0: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41  ).          ** A
add0: 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75 6e  PI. To workaroun
ade0: 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75  d them, add a du
adf0: 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20  mmy OP_Variable 
ae00: 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20  here..          
ae10: 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e  */ .          in
ae20: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
ae30: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
ae40: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ae50: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
ae60: 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  t(pParse, pRight
ae70: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
ae80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ae90: 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56  geP3(v, sqlite3V
aea0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
aeb0: 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  )-1, 0);.       
aec0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
aed0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
aee0: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   r1);.        }.
aef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
af00: 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a  e{.      z = 0;.
af10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
af20: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
af30: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a  al);.  return (z
af40: 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  !=0);.}.#endif /
af50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
af60: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
af70: 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
af80: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
af90: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63  TABLE./*.** Chec
afa0: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
afb0: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
afc0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
afd0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  **.**         co
afe0: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a  lumn MATCH expr.
aff0: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74  **.** If it is t
b000: 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e  hen return TRUE.
b010: 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e    If not, return
b020: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
b030: 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43  c int isMatchOfC
b040: 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70  olumn(.  Expr *p
b050: 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73  Expr      /* Tes
b060: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
b070: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  n */.){.  ExprLi
b080: 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66  st *pList;..  if
b090: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
b0a0: 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
b0b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
b0c0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
b0d0: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
b0e0: 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29  en,"match")!=0 )
b0f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
b100: 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45    }.  pList = pE
b110: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
b120: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
b130: 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=2 ){.    retur
b140: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
b150: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
b160: 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d  ->op != TK_COLUM
b170: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
b180: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
b190: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
b1a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
b1b0: 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
b1c0: 2a 20 49 66 20 74 68 65 20 70 42 61 73 65 20 65  * If the pBase e
b1d0: 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e  xpression origin
b1e0: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
b1f0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
b200: 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65  f.** a join, the
b210: 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 61  n transfer the a
b220: 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69  ppropriate marki
b230: 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69  ngs over to deri
b240: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ved..*/.static v
b250: 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e  oid transferJoin
b260: 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70  Markings(Expr *p
b270: 44 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70  Derived, Expr *p
b280: 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69 76 65  Base){.  pDerive
b290: 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73  d->flags |= pBas
b2a0: 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72  e->flags & EP_Fr
b2b0: 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72 69 76  omJoin;.  pDeriv
b2c0: 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  ed->iRightJoinTa
b2d0: 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52 69  ble = pBase->iRi
b2e0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a  ghtJoinTable;.}.
b2f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
b300: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
b310: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
b320: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b330: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a  IT_SUBQUERY)./*.
b340: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  ** Analyze a ter
b350: 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  m that consists 
b360: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f  of two or more O
b370: 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73  R-connected.** s
b380: 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a  ubterms.  So in:
b390: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57  .**.**     ... W
b3a0: 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20  HERE  (a=5) AND 
b3b0: 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64  (b=7 OR c=9 OR d
b3c0: 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a  =13) AND (d=13).
b3d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e              ^^^^
b3f0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
b400: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b410: 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72  ine analyzes ter
b420: 6d 73 20 73 75 63 68 20 61 73 20 74 68 65 20 6d  ms such as the m
b430: 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68  iddle term in th
b440: 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e  e above example.
b450: 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72  .** A WhereOrTer
b460: 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70  m object is comp
b470: 75 74 65 64 20 61 6e 64 20 61 74 74 61 63 68 65  uted and attache
b480: 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e  d to the term un
b490: 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c  der.** analysis,
b4a0: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
b4b0: 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68  he outcome of th
b4c0: 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e  e analysis.  Hen
b4d0: 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  ce:.**.**     Wh
b4e0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20  ereTerm.wtFlags 
b4f0: 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46    |=  TERM_ORINF
b500: 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  O.**     WhereTe
b510: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20  rm.u.pOrInfo  = 
b520: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
b530: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72  llocated WhereOr
b540: 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a  Term object.**.*
b550: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
b560: 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68   analyzed must h
b570: 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ave two or more 
b580: 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  of OR-connected 
b590: 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73  subterms..** A s
b5a0: 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69  ingle subterm mi
b5b0: 67 68 74 20 62 65 20 61 20 73 65 74 20 6f 66 20  ght be a set of 
b5c0: 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75  AND-connected su
b5d0: 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45  b-subterms..** E
b5e0: 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73  xamples of terms
b5f0: 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a   under analysis:
b600: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20  .**.**     (A)  
b610: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
b620: 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e  t1.x=t2.z OR t1.
b630: 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e  y=15 OR t1.z=t3.
b640: 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20  a+5.**     (B)  
b650: 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78     x=expr1 OR ex
b660: 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33  pr2=x OR x=expr3
b670: 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20 20  .**     (C)     
b680: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31  t1.x=t2.y OR (t1
b690: 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79  .x=t2.z AND t1.y
b6a0: 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20  =15).**     (D) 
b6b0: 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28      x=expr1 OR (
b6c0: 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e  y>11 AND y<22 AN
b6d0: 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f  D z LIKE '*hello
b6e0: 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20  *').**     (E)  
b6f0: 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e     (p.a=1 AND q.
b700: 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f  b=2 AND r.c=3) O
b710: 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79  R (p.x=4 AND q.y
b720: 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a  =5 AND r.z=6).**
b730: 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a  .** CASE 1:.**.*
b740: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
b750: 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72  s are of the for
b760: 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73  m T.C=expr for s
b770: 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  ome single colum
b780: 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20 61 20  n of C and.** a 
b790: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28  single table T (
b7a0: 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d  as shown in exam
b7b0: 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65  ple B above) the
b7c0: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
b7d0: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74  irtual.** term t
b7e0: 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61  hat is an equiva
b7f0: 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69  lent IN expressi
b800: 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
b810: 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d  rds, if the term
b820: 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  .** being analyz
b830: 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed is:.**.**    
b840: 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20    x = expr1  OR 
b850: 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20   expr2 = x  OR  
b860: 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20  x = expr3.**.** 
b870: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
b880: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c  w virtual term l
b890: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
b8a0: 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31       x IN (expr1
b8b0: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
b8c0: 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a  .** CASE 2:.**.*
b8d0: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
b8e0: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20  s are indexable 
b8f0: 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  by a single tabl
b900: 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  e T, then set.**
b910: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
b920: 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20  m.eOperator     
b930: 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f           =  WO_O
b940: 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  R.**     WhereTe
b950: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  rm.u.pOrInfo->in
b960: 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65  dexable  |=  the
b970: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
b980: 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a  or table T.**.**
b990: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69   A subterm is "i
b9a0: 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20  ndexable" if it 
b9b0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  is of the form.*
b9c0: 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70  * "T.C <op> <exp
b9d0: 72 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61  r>" where C is a
b9e0: 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ny column of tab
b9f0: 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70  le T and .** <op
ba00: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c  > is one of "=",
ba10: 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c   "<", "<=", ">",
ba20: 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22   ">=", "IS NULL"
ba30: 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20  , or "IN"..** A 
ba40: 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20  subterm is also 
ba50: 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20  indexable if it 
ba60: 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f  is an AND of two
ba70: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73   or more.** subs
ba80: 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74  ubterms at least
ba90: 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73   one of which is
baa0: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64   indexable.  Ind
bab0: 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73  exable AND .** s
bac0: 75 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65  ubterms have the
bad0: 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  ir eOperator set
bae0: 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74   to WO_AND and t
baf0: 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41  hey have.** u.pA
bb00: 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20  ndInfo set to a 
bb10: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
bb20: 63 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65  cated WhereAndTe
bb30: 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  rm object..**.**
bb40: 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f   From another po
bb50: 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e  int of view, "in
bb60: 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74  dexable" means t
bb70: 68 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20  hat the subterm 
bb80: 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69  could.** potenti
bb90: 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  ally be used wit
bba0: 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e  h an index if an
bbb0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
bbc0: 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68  ex exists..** Th
bbd0: 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73  is analysis does
bbe0: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68   not consider wh
bbf0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
bc00: 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74   index exists; t
bc10: 68 61 74 0a 2a 2a 20 69 73 20 64 65 63 69 64 65  hat.** is decide
bc20: 64 20 65 6c 73 65 77 68 65 72 65 2e 20 20 54 68  d elsewhere.  Th
bc30: 69 73 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  is analysis only
bc40: 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65   looks at whethe
bc50: 72 20 73 75 62 74 65 72 6d 73 0a 2a 2a 20 61 70  r subterms.** ap
bc60: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
bc70: 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a  dexing exist..**
bc80: 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73  .** All examples
bc90: 20 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f   A through E abo
bca0: 76 65 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ve satisfy case 
bcb0: 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72  2.  But if a ter
bcc0: 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69 73  m.** also statis
bcd0: 66 69 65 73 20 63 61 73 65 20 31 20 28 73 75 63  fies case 1 (suc
bce0: 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20  h as B) we know 
bcf0: 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a  that the optimiz
bd00: 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79  er will.** alway
bd10: 73 20 70 72 65 66 65 72 20 63 61 73 65 20 31 2c  s prefer case 1,
bd20: 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65   so in that case
bd30: 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 61 74   we pretend that
bd40: 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a   case 2 is not.*
bd50: 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a  * satisfied..**.
bd60: 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20 74  ** It might be t
bd70: 68 65 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c  he case that mul
bd80: 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65  tiple tables are
bd90: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72   indexable.  For
bda0: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29   example,.** (E)
bdb0: 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61   above is indexa
bdc0: 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c  ble on tables P,
bdd0: 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a   Q, and R..**.**
bde0: 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 74 69   Terms that sati
bdf0: 73 66 79 20 63 61 73 65 20 32 20 61 72 65 20 63  sfy case 2 are c
be00: 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f  andidates for lo
be10: 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a  okup by using.**
be20: 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65   separate indice
be30: 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73  s to find rowids
be40: 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 65 72   for each subter
be50: 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a  m and composing.
be60: 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20  ** the union of 
be70: 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67  all rowids using
be80: 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74   a RowSet object
be90: 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
bea0: 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70  ar.** to "bitmap
beb0: 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68   indices" in oth
bec0: 65 72 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  er database engi
bed0: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52  nes..**.** OTHER
bee0: 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  WISE:.**.** If n
bef0: 65 69 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f  either case 1 no
bf00: 72 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20  r case 2 apply, 
bf10: 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65  then leave the e
bf20: 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a  Operator set to.
bf30: 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74  ** zero.  This t
bf40: 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75  erm is not usefu
bf50: 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f  l for search..*/
bf60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
bf70: 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a  rAnalyzeOrTerm(.
bf80: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
bfa0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
bfb0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
bfc0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
bfd0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48   the complete WH
bfe0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
bff0: 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20  int idxTerm     
c000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
c010: 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72  ex of the OR-ter
c020: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
c030: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
c040: 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43  fo *pWInfo = pWC
c050: 2d 3e 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  ->pWInfo;       
c060: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
c070: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
c080: 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
c090: 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
c0a0: 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  >pParse;        
c0b0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
c0c0: 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
c0d0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c0e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c0f0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
c100: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ection */.  Wher
c110: 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  eTerm *pTerm = &
c120: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
c130: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
c140: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
c150: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
c160: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20  = pTerm->pExpr; 
c170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c180: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
c190: 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69   the term */.  i
c1a0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1c0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
c1d0: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65  ounters */.  Whe
c1e0: 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
c1f0: 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75         /* Breaku
c200: 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20  p of pTerm into 
c210: 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68  subterms */.  Wh
c220: 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
c230: 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62  ;       /* A Sub
c240: 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65  -term within the
c250: 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72   pOrWc */.  Wher
c260: 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f  eOrInfo *pOrInfo
c270: 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f  ;     /* Additio
c280: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
c290: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
c2a0: 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61  pTerm */.  Bitma
c2b0: 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20  sk chngToIN;    
c2c0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
c2d0: 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66  hat might satisf
c2e0: 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69  y case 1 */.  Bi
c2f0: 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b  tmask indexable;
c300: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
c310: 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78  s that are index
c320: 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67  able, satisfying
c330: 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a   case 2 */..  /*
c340: 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20  .  ** Break the 
c350: 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69  OR clause into i
c360: 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62 74  ts separate subt
c370: 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65  erms.  The subte
c380: 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f  rms are.  ** sto
c390: 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c  red in a WhereCl
c3a0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20 63  ause structure c
c3b0: 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e  ontaining within
c3c0: 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f   the WhereOrInfo
c3d0: 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  .  ** object tha
c3e0: 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  t is attached to
c3f0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52   the original OR
c400: 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20   clause term..  
c410: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  */.  assert( (pT
c420: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
c430: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52  TERM_DYNAMIC|TER
c440: 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e  M_ORINFO|TERM_AN
c450: 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  DINFO))==0 );.  
c460: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
c470: 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54  p==TK_OR );.  pT
c480: 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d  erm->u.pOrInfo =
c490: 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74   pOrInfo = sqlit
c4a0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
c4b0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e  b, sizeof(*pOrIn
c4c0: 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49  fo));.  if( pOrI
c4d0: 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  nfo==0 ) return;
c4e0: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  .  pTerm->wtFlag
c4f0: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  s |= TERM_ORINFO
c500: 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72  ;.  pOrWc = &pOr
c510: 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72  Info->wc;.  wher
c520: 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57  eClauseInit(pOrW
c530: 63 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68  c, pWInfo);.  wh
c540: 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20  ereSplit(pOrWc, 
c550: 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20  pExpr, TK_OR);. 
c560: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
c570: 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20  pSrc, pOrWc);.  
c580: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
c590: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
c5a0: 20 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e   assert( pOrWc->
c5b0: 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f  nTerm>=2 );..  /
c5c0: 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74  *.  ** Compute t
c5d0: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
c5e0: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
c5f0: 73 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32  sfy cases 1 or 2
c600: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62  ..  */.  indexab
c610: 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  le = ~(Bitmask)0
c620: 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e  ;.  chngToIN = ~
c630: 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
c640: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
c650: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
c660: 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e  c->a; i>=0 && in
c670: 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f  dexable; i--, pO
c680: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  rTerm++){.    if
c690: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
c6a0: 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c  rator & WO_SINGL
c6b0: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  E)==0 ){.      W
c6c0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e  hereAndInfo *pAn
c6d0: 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73  dInfo;.      ass
c6e0: 65 72 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77  ert( (pOrTerm->w
c6f0: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41  tFlags & (TERM_A
c700: 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e  NDINFO|TERM_ORIN
c710: 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  FO))==0 );.     
c720: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20   chngToIN = 0;. 
c730: 20 20 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20       pAndInfo = 
c740: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
c750: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
c760: 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  AndInfo));.     
c770: 20 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b   if( pAndInfo ){
c780: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c  .        WhereCl
c790: 61 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20  ause *pAndWC;.  
c7a0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
c7b0: 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20  *pAndTerm;.     
c7c0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
c7d0: 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b    Bitmask b = 0;
c7e0: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
c7f0: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70  ->u.pAndInfo = p
c800: 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AndInfo;.       
c810: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
c820: 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46  s |= TERM_ANDINF
c830: 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  O;.        pOrTe
c840: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
c850: 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20  WO_AND;.        
c860: 70 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e  pAndWC = &pAndIn
c870: 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
c880: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
c890: 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70 57 49  pAndWC, pWC->pWI
c8a0: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 77 68  nfo);.        wh
c8b0: 65 72 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c  ereSplit(pAndWC,
c8c0: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c   pOrTerm->pExpr,
c8d0: 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20   TK_AND);.      
c8e0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
c8f0: 28 70 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a  (pSrc, pAndWC);.
c900: 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 2d 3e          pAndWC->
c910: 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20  pOuter = pWC;.  
c920: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
c930: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c940: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
c950: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
c960: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  d ){.          f
c970: 6f 72 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d  or(j=0, pAndTerm
c980: 3d 70 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41  =pAndWC->a; j<pA
c990: 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b  ndWC->nTerm; j++
c9a0: 2c 20 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20  , pAndTerm++){. 
c9b0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
c9c0: 74 28 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78  t( pAndTerm->pEx
c9d0: 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pr );.          
c9e0: 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28    if( allowedOp(
c9f0: 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d  pAndTerm->pExpr-
ca00: 3e 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >op) ){.        
ca10: 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61        b |= getMa
ca20: 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
ca30: 6b 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e  kSet, pAndTerm->
ca40: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
ca50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ca60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
ca70: 0a 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62  .        indexab
ca80: 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d  le &= b;.      }
ca90: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
caa0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
cab0: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b  & TERM_COPIED ){
cac0: 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74  .      /* Skip t
cad0: 68 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77  his term for now
cae0: 2e 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74  .  We revisit it
caf0: 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73   when we process
cb00: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f   the.      ** co
cb10: 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d  rresponding TERM
cb20: 5f 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f  _VIRTUAL term */
cb30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cb40: 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20    Bitmask b;.   
cb50: 20 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 26     b = getMask(&
cb60: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
cb70: 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  , pOrTerm->leftC
cb80: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
cb90: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
cba0: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
cbb0: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  L ){.        Whe
cbc0: 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d  reTerm *pOther =
cbd0: 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65   &pOrWc->a[pOrTe
cbe0: 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20  rm->iParent];.  
cbf0: 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61        b |= getMa
cc00: 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
cc10: 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65  kSet, pOther->le
cc20: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
cc30: 20 7d 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62   }.      indexab
cc40: 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69  le &= b;.      i
cc50: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
cc60: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d  erator & WO_EQ)=
cc70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  =0 ){.        ch
cc80: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
cc90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cca0: 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a   chngToIN &= b;.
ccb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ccc0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63  }..  /*.  ** Rec
ccd0: 6f 72 64 20 74 68 65 20 73 65 74 20 6f 66 20 74  ord the set of t
cce0: 61 62 6c 65 73 20 74 68 61 74 20 73 61 74 69 73  ables that satis
ccf0: 66 79 20 63 61 73 65 20 32 2e 20 20 54 68 65 20  fy case 2.  The 
cd00: 73 65 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a  set might be.  *
cd10: 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  * empty..  */.  
cd20: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
cd30: 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a  le = indexable;.
cd40: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
cd50: 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d  or = indexable==
cd60: 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a  0 ? 0 : WO_OR;..
cd70: 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    /*.  ** chngTo
cd80: 49 4e 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f  IN holds a set o
cd90: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d  f tables that *m
cda0: 69 67 68 74 2a 20 73 61 74 69 73 66 79 20 63 61  ight* satisfy ca
cdb0: 73 65 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20  se 1.  But.  ** 
cdc0: 77 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  we have to do so
cdd0: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68  me additional ch
cde0: 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66  ecking to see if
cdf0: 20 63 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20   case 1 really. 
ce00: 20 2a 2a 20 69 73 20 73 61 74 69 73 66 69 65 64   ** is satisfied
ce10: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67  ..  **.  ** chng
ce20: 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65  ToIN will hold e
ce30: 69 74 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32  ither 0, 1, or 2
ce40: 20 62 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69   bits.  The 0-bi
ce50: 74 20 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a  t case means.  *
ce60: 2a 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  * that there is 
ce70: 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f  no possibility o
ce80: 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  f transforming t
ce90: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74  he OR clause int
cea0: 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65  o an.  ** IN ope
ceb0: 72 61 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e  rator because on
cec0: 65 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20  e or more terms 
ced0: 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  in the OR clause
cee0: 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f   contain.  ** so
cef0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
cf00: 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d  an == on a colum
cf10: 6e 20 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20  n in the single 
cf20: 74 61 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69  table.  The 1-bi
cf30: 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e  t.  ** case mean
cf40: 73 20 74 68 61 74 20 65 76 65 72 79 20 74 65 72  s that every ter
cf50: 6d 20 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75  m of the OR clau
cf60: 73 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  se is of the for
cf70: 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f  m.  ** "table.co
cf80: 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73  lumn=expr" for s
cf90: 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  ome single table
cfa0: 2e 20 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74  .  The one bit t
cfb0: 68 61 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20  hat is set.  ** 
cfc0: 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20  will correspond 
cfd0: 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61  to the common ta
cfe0: 62 6c 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e  ble.  We still n
cff0: 65 65 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20  eed to check to 
d000: 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74  make.  ** sure t
d010: 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69  he same column i
d020: 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65  s used on all te
d030: 72 6d 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20  rms.  The 2-bit 
d040: 63 61 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a  case is when.  *
d050: 2a 20 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20  * the all terms 
d060: 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  are of the form 
d070: 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74  "table1.column=t
d080: 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20  able2.column".  
d090: 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  It.  ** might be
d0a0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72   possible to for
d0b0: 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  m an IN operator
d0c0: 20 77 69 74 68 20 65 69 74 68 65 72 20 74 61 62   with either tab
d0d0: 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  le1.column.  ** 
d0e0: 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e  or table2.column
d0f0: 20 61 73 20 74 68 65 20 4c 48 53 20 69 66 20 65   as the LHS if e
d100: 69 74 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20  ither is common 
d110: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  to every term of
d120: 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61  .  ** the OR cla
d130: 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  use..  **.  ** N
d140: 6f 74 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f  ote that terms o
d150: 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c  f the form "tabl
d160: 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e  e.column1=table.
d170: 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20  column2" (the.  
d180: 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e  ** same table on
d190: 20 62 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74   both sizes of t
d1a0: 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65  he ==) cannot be
d1b0: 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f   optimized..  */
d1c0: 0a 20 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20  .  if( chngToIN 
d1d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43  ){.    int okToC
d1e0: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20  hngToIN = 0;    
d1f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
d200: 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e  conversion to IN
d210: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20   is valid */.   
d220: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d   int iColumn = -
d230: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  1;         /* Co
d240: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68  lumn index on lh
d250: 73 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  s of IN operator
d260: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72   */.    int iCur
d270: 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  sor = -1;       
d280: 20 20 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f    /* Table curso
d290: 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  r common to all 
d2a0: 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74  terms */.    int
d2b0: 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   j = 0;         
d2c0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
d2d0: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f  ounter */..    /
d2e0: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
d2f0: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  able and column 
d300: 74 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20  that appears on 
d310: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a  one side or the.
d320: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20      ** other of 
d330: 74 68 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20  the == operator 
d340: 69 6e 20 65 76 65 72 79 20 73 75 62 74 65 72 6d  in every subterm
d350: 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e  .  That table an
d360: 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20  d column.    ** 
d370: 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64  will be recorded
d380: 20 69 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20   in iCursor and 
d390: 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20  iColumn.  There 
d3a0: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79  might not be any
d3b0: 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62  .    ** such tab
d3c0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20  le and column.  
d3d0: 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  Set okToChngToIN
d3e0: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
d3f0: 74 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  te table.    ** 
d400: 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f  and column is fo
d410: 75 6e 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b  und but leave ok
d420: 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65  ToChngToIN false
d430: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
d440: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d     */.    for(j=
d450: 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43  0; j<2 && !okToC
d460: 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20  hngToIN; j++){. 
d470: 20 20 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70       pOrTerm = p
d480: 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66  OrWc->a;.      f
d490: 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  or(i=pOrWc->nTer
d4a0: 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  m-1; i>=0; i--, 
d4b0: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
d4c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
d4d0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
d4e0: 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
d4f0: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
d500: 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f  gs &= ~TERM_OR_O
d510: 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  K;.        if( p
d520: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
d530: 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or==iCursor ){. 
d540: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
d550: 20 69 73 20 74 68 65 20 32 2d 62 69 74 20 63 61   is the 2-bit ca
d560: 73 65 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e  se and we are on
d570: 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72   the second iter
d580: 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
d590: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
d5a0: 65 72 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20  erm is from the 
d5b0: 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e  first iteration.
d5c0: 20 20 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74    So skip this t
d5d0: 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
d5e0: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29    assert( j==1 )
d5f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
d600: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
d610: 20 20 20 20 20 20 20 20 69 66 28 20 28 63 68 6e          if( (chn
d620: 67 54 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28  gToIN & getMask(
d630: 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
d640: 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t, pOrTerm->left
d650: 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20  Cursor))==0 ){. 
d660: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
d670: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 6f 66   term must be of
d680: 20 74 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d   the form t1.a==
d690: 74 32 2e 62 20 77 68 65 72 65 20 74 32 20 69 73  t2.b where t2 is
d6a0: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
d6b0: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65    ** chngToIN se
d6c0: 74 20 62 75 74 20 74 31 20 69 73 20 6e 6f 74 2e  t but t1 is not.
d6d0: 20 20 54 68 69 73 20 74 65 72 6d 20 77 69 6c 6c    This term will
d6e0: 20 62 65 20 65 69 74 68 65 72 20 70 72 65 63 65   be either prece
d6f0: 65 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  eded.          *
d700: 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62 79 20  * or follwed by 
d710: 61 6e 20 69 6e 76 65 72 74 65 64 20 63 6f 70 79  an inverted copy
d720: 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20   (t2.b==t1.a).  
d730: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 0a  Skip this term .
d740: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
d750: 20 75 73 65 20 69 74 73 20 69 6e 76 65 72 73 69   use its inversi
d760: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  on. */.         
d770: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
d780: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
d790: 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20 20 20  RM_COPIED );.   
d7a0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
d7b0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
d7c0: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
d7d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
d7e0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77  sert( pOrTerm->w
d7f0: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43  tFlags & (TERM_C
d800: 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49 52 54 55  OPIED|TERM_VIRTU
d810: 41 4c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  AL) );.         
d820: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
d830: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 43 6f     }.        iCo
d840: 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  lumn = pOrTerm->
d850: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
d860: 20 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20        iCursor = 
d870: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
d880: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  sor;.        bre
d890: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
d8a0: 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
d8b0: 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69       /* No candi
d8c0: 64 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d  date table+colum
d8d0: 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 54 68  n was found.  Th
d8e0: 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
d8f0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  r.        ** on 
d900: 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61  the second itera
d910: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
d920: 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a  assert( j==1 );.
d930: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d940: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 63 68 6e  IsPowerOfTwo(chn
d950: 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20 20 20 20  gToIN) );.      
d960: 20 20 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f    assert( chngTo
d970: 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 26 70 57 49  IN==getMask(&pWI
d980: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
d990: 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20  Cursor) );.     
d9a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d9b0: 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
d9c0: 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20  ( j==1 );..     
d9d0: 20 2f 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e   /* We have foun
d9e0: 64 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 61  d a candidate ta
d9f0: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20  ble and column. 
da00: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
da10: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74   that.      ** t
da20: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  able and column 
da30: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65  is common to eve
da40: 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f  ry term in the O
da50: 52 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  R clause */.    
da60: 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d    okToChngToIN =
da70: 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20   1;.      for(; 
da80: 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67  i>=0 && okToChng
da90: 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  ToIN; i--, pOrTe
daa0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  rm++){.        a
dab0: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
dac0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
dad0: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Q );.        if(
dae0: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
daf0: 72 73 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b  rsor!=iCursor ){
db00: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65  .          pOrTe
db10: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e  rm->wtFlags &= ~
db20: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
db30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
db40: 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  rTerm->u.leftCol
db50: 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn!=iColumn ){.
db60: 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68            okToCh
db70: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
db80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
db90: 20 20 20 20 20 69 6e 74 20 61 66 66 4c 65 66 74       int affLeft
dba0: 2c 20 61 66 66 52 69 67 68 74 3b 0a 20 20 20 20  , affRight;.    
dbb0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
dbc0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
dbd0: 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e  is also a column
dbe0: 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
dbf0: 69 74 69 65 73 0a 20 20 20 20 20 20 20 20 20 20  ities.          
dc00: 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74  ** of both right
dc10: 20 61 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20   and left sides 
dc20: 6d 75 73 74 20 62 65 20 73 75 63 68 20 74 68 61  must be such tha
dc30: 74 20 6e 6f 20 74 79 70 65 0a 20 20 20 20 20 20  t no type.      
dc40: 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f      ** conversio
dc50: 6e 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ns are required 
dc60: 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 20 28  on the right.  (
dc70: 54 69 63 6b 65 74 20 23 32 32 34 39 29 0a 20 20  Ticket #2249).  
dc80: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
dc90: 20 20 20 20 20 61 66 66 52 69 67 68 74 20 3d 20       affRight = 
dca0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
dcb0: 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78  ity(pOrTerm->pEx
dcc0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
dcd0: 20 20 20 20 20 20 20 61 66 66 4c 65 66 74 20 3d         affLeft =
dce0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
dcf0: 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45  nity(pOrTerm->pE
dd00: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
dd10: 20 20 20 20 20 20 20 69 66 28 20 61 66 66 52 69         if( affRi
dd20: 67 68 74 21 3d 30 20 26 26 20 61 66 66 52 69 67  ght!=0 && affRig
dd30: 68 74 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20  ht!=affLeft ){. 
dd40: 20 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43             okToC
dd50: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
dd60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
dd70: 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72            pOrTer
dd80: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
dd90: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
dda0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
ddb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
ddc0: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
ddd0: 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  int, okToChngToI
dde0: 4e 20 69 73 20 74 72 75 65 20 69 66 20 6f 72 69  N is true if ori
ddf0: 67 69 6e 61 6c 20 70 54 65 72 6d 20 73 61 74 69  ginal pTerm sati
de00: 73 66 69 65 73 0a 20 20 20 20 2a 2a 20 63 61 73  sfies.    ** cas
de10: 65 20 31 2e 20 20 49 6e 20 74 68 61 74 20 63 61  e 1.  In that ca
de20: 73 65 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20  se, construct a 
de30: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
de40: 20 74 68 61 74 20 69 73 20 0a 20 20 20 20 2a 2a   that is .    **
de50: 20 70 54 65 72 6d 20 63 6f 6e 76 65 72 74 65 64   pTerm converted
de60: 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72   into an IN oper
de70: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
de80: 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49   if( okToChngToI
de90: 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N ){.      Expr 
dea0: 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20 20 20  *pDup;          
deb0: 20 20 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e 74    /* A transient
dec0: 20 64 75 70 6c 69 63 61 74 65 20 65 78 70 72 65   duplicate expre
ded0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
dee0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
def0: 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 52 48 53   0;   /* The RHS
df00: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
df10: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  tor */.      Exp
df20: 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20 20  r *pLeft = 0;   
df30: 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f      /* The LHS o
df40: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
df50: 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
df60: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
df70: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
df80: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
df90: 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f  ..      for(i=pO
dfa0: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f  rWc->nTerm-1, pO
dfb0: 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20  rTerm=pOrWc->a; 
dfc0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  i>=0; i--, pOrTe
dfd0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
dfe0: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46  f( (pOrTerm->wtF
dff0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f  lags & TERM_OR_O
e000: 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  K)==0 ) continue
e010: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e020: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
e030: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
e040: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e050: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
e060: 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a  sor==iCursor );.
e070: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e080: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
e090: 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
e0a0: 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  ;.        pDup =
e0b0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
e0c0: 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  db, pOrTerm->pEx
e0d0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a  pr->pRight, 0);.
e0e0: 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20          pList = 
e0f0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
e100: 70 70 65 6e 64 28 70 57 49 6e 66 6f 2d 3e 70 50  ppend(pWInfo->pP
e110: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75  arse, pList, pDu
e120: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66  p);.        pLef
e130: 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  t = pOrTerm->pEx
e140: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
e150: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
e160: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20   pLeft!=0 );.   
e170: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
e180: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
e190: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  ft, 0);.      pN
e1a0: 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ew = sqlite3PExp
e1b0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c  r(pParse, TK_IN,
e1c0: 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20   pDup, 0, 0);.  
e1d0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
e1e0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
e1f0: 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e  ew;.        tran
e200: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
e210: 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20  (pNew, pExpr);. 
e220: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
e230: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
e240: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
e250: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ct) );.        p
e260: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
e270: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64  List;.        id
e280: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
e290: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
e2a0: 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ew, TERM_VIRTUAL
e2b0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
e2c0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
e2d0: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
e2e0: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
e2f0: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
e300: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  xNew);.        p
e310: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
e320: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
e330: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
e340: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
e350: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
e360: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
e370: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e380: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
e390: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
e3a0: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
e3b0: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
e3c0: 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20  tor = WO_NOOP;  
e3d0: 2f 2a 20 63 61 73 65 20 31 20 74 72 75 6d 70 73  /* case 1 trumps
e3e0: 20 63 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d   case 2 */.    }
e3f0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
e400: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52   !SQLITE_OMIT_OR
e410: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26  _OPTIMIZATION &&
e420: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55   !SQLITE_OMIT_SU
e430: 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
e440: 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   The input to th
e450: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
e460: 20 57 68 65 72 65 54 65 72 6d 20 73 74 72 75 63   WhereTerm struc
e470: 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74  ture with only t
e480: 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69  he.** "pExpr" fi
e490: 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20  eld filled in.  
e4a0: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
e4b0: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e  routine is to an
e4c0: 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62  alyze the.** sub
e4d0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
e4e0: 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20  opulate all the 
e4f0: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20  other fields of 
e500: 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a  the WhereTerm.**
e510: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
e520: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
e530: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
e540: 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20  rm "<expr> <op> 
e550: 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75  X" it gets commu
e560: 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  ted.** to the st
e570: 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22  andard form of "
e580: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a  X <op> <expr>"..
e590: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
e5a0: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
e5b0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59  e form "X <op> Y
e5c0: 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20 61  " where both X a
e5d0: 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75  nd Y are.** colu
e5e0: 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72  mns, then the or
e5f0: 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f  iginal expressio
e600: 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  n is unchanged a
e610: 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  nd a new virtual
e620: 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20  .** term of the 
e630: 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20  form "Y <op> X" 
e640: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
e650: 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64  WHERE clause and
e660: 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70  .** analyzed sep
e670: 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72  arately.  The or
e680: 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d  iginal term is m
e690: 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f  arked with TERM_
e6a0: 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68  COPIED.** and th
e6b0: 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61  e new term is ma
e6c0: 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44  rked with TERM_D
e6d0: 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73 65 20  YNAMIC (because 
e6e0: 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65  it's pExpr.** ne
e6f0: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
e700: 77 69 74 68 20 74 68 65 20 57 68 65 72 65 43 6c  with the WhereCl
e710: 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56  ause) and TERM_V
e720: 49 52 54 55 41 4c 20 28 62 65 63 61 75 73 65 20  IRTUAL (because 
e730: 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75  it.** is a commu
e740: 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72  ted copy of a pr
e750: 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20  ior term.)  The 
e760: 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61  original term ha
e770: 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e  s nChild=1.** an
e780: 64 20 74 68 65 20 63 6f 70 79 20 68 61 73 20 69  d the copy has i
e790: 64 78 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20  dxParent set to 
e7a0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
e7b0: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a   original term..
e7c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
e7d0: 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72  xprAnalyze(.  Sr
e7e0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
e7f0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
e800: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
e810: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
e820: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
e830: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
e840: 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20  .  int idxTerm  
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e860: 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65 72  Index of the ter
e870: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
e880: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
e890: 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43  fo *pWInfo = pWC
e8a0: 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a 20 57 48 45  ->pWInfo; /* WHE
e8b0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
e8c0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
e8d0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
e8e0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
e8f0: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
e900: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
e910: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
e920: 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20  *pMaskSet;      
e930: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61      /* Set of ta
e940: 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20  ble index masks 
e950: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
e960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e970: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
e980: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
e990: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d  alyzed */.  Bitm
e9a0: 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20  ask prereqLeft; 
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e9c0: 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66  Prerequesites of
e9d0: 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66   the pExpr->pLef
e9e0: 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  t */.  Bitmask p
e9f0: 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20  rereqAll;       
ea00: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
ea10: 71 75 65 73 69 74 65 73 20 6f 66 20 70 45 78 70  quesites of pExp
ea20: 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  r */.  Bitmask e
ea30: 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20  xtraRight = 0;  
ea40: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
ea50: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e   dependencies on
ea60: 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20   LEFT JOIN */.  
ea70: 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b  Expr *pStr1 = 0;
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea90: 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f   /* RHS of LIKE/
eaa0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
eab0: 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74  .  int isComplet
eac0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
ead0: 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49      /* RHS of LI
eae0: 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74  KE/GLOB ends wit
eaf0: 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20  h wildcard */.  
eb00: 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20  int noCase = 0; 
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb20: 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69   /* LIKE/GLOB di
eb30: 73 74 69 6e 67 75 69 73 68 65 73 20 63 61 73 65  stinguishes case
eb40: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb60: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65         /* Top-le
eb70: 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70  vel operator.  p
eb80: 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61  Expr->op */.  Pa
eb90: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
eba0: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 2f  Info->pParse;  /
ebb0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
ebc0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
ebd0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
ebe0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
ebf0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
ec00: 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  /..  if( db->mal
ec10: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
ec20: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
ec30: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
ec40: 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b  dxTerm];.  pMask
ec50: 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  Set = &pWInfo->s
ec60: 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72  MaskSet;.  pExpr
ec70: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
ec80: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
ec90: 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 26 26 20 70  ->op!=TK_AS && p
eca0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
ecb0: 4c 41 54 45 20 29 3b 0a 20 20 70 72 65 72 65 71  LATE );.  prereq
ecc0: 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65  Left = exprTable
ecd0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
ece0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
ecf0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
ed00: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
ed10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ed20: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
ed30: 20 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72   );.    if( Expr
ed40: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
ed50: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
ed60: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
ed70: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
ed80: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
ed90: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
eda0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  xpr->x.pSelect);
edb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
edc0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
edd0: 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54  ight = exprListT
ede0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
edf0: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  et, pExpr->x.pLi
ee00: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  st);.    }.  }el
ee10: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
ee20: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72  NULL ){.    pTer
ee30: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
ee40: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
ee50: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
ee60: 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55  ght = exprTableU
ee70: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
ee80: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
ee90: 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d   }.  prereqAll =
eea0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
eeb0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29  pMaskSet, pExpr)
eec0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
eed0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
eee0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
eef0: 20 20 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67     Bitmask x = g
ef00: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
ef10: 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
ef20: 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72  inTable);.    pr
ef30: 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20  ereqAll |= x;.  
ef40: 20 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 78    extraRight = x
ef50: 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73  -1;  /* ON claus
ef60: 65 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20  e terms may not 
ef70: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
ef80: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20  index.          
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
efa0: 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  on left table of
efb0: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54   a LEFT JOIN.  T
efc0: 69 63 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20  icket #3015 */. 
efd0: 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72   }.  pTerm->prer
efe0: 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c  eqAll = prereqAl
eff0: 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74  l;.  pTerm->left
f000: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
f010: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
f020: 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70  -1;.  pTerm->eOp
f030: 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66  erator = 0;.  if
f040: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
f050: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  ){.    Expr *pLe
f060: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
f070: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70  SkipCollate(pExp
f080: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 45  r->pLeft);.    E
f090: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71  xpr *pRight = sq
f0a0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
f0b0: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67  late(pExpr->pRig
f0c0: 68 74 29 3b 0a 20 20 20 20 75 31 36 20 6f 70 4d  ht);.    u16 opM
f0d0: 61 73 6b 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72  ask = (pTerm->pr
f0e0: 65 72 65 71 52 69 67 68 74 20 26 20 70 72 65 72  ereqRight & prer
f0f0: 65 71 4c 65 66 74 29 3d 3d 30 20 3f 20 57 4f 5f  eqLeft)==0 ? WO_
f100: 41 4c 4c 20 3a 20 57 4f 5f 45 51 55 49 56 3b 0a  ALL : WO_EQUIV;.
f110: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
f120: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
f130: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66        pTerm->lef
f140: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
f150: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
f160: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
f170: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
f180: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  umn;.      pTerm
f190: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70  ->eOperator = op
f1a0: 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70 29 20 26  eratorMask(op) &
f1b0: 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20   opMask;.    }. 
f1c0: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 26 26     if( pRight &&
f1d0: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
f1e0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
f1f0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b  WhereTerm *pNew;
f200: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
f210: 70 3b 0a 20 20 20 20 20 20 75 31 36 20 65 45 78  p;.      u16 eEx
f220: 74 72 61 4f 70 20 3d 20 30 3b 20 20 20 20 20 20  traOp = 0;      
f230: 20 20 2f 2a 20 45 78 74 72 61 20 62 69 74 73 20    /* Extra bits 
f240: 66 6f 72 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61  for pNew->eOpera
f250: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  tor */.      if(
f260: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
f270: 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  or>=0 ){.       
f280: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
f290: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
f2a0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
f2b0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
f2c0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
f2d0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
f2e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
f2f0: 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b  elete(db, pDup);
f300: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
f310: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
f320: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
f330: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
f340: 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f  pWC, pDup, TERM_
f350: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
f360: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69  AMIC);.        i
f370: 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72  f( idxNew==0 ) r
f380: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70  eturn;.        p
f390: 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  New = &pWC->a[id
f3a0: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70  xNew];.        p
f3b0: 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  New->iParent = i
f3c0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
f3d0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
f3e0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
f3f0: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
f400: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65  = 1;.        pTe
f410: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
f420: 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
f430: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
f440: 70 3d 3d 54 4b 5f 45 51 0a 20 20 20 20 20 20 20  p==TK_EQ.       
f450: 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
f460: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
f470: 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20  FromJoin).      
f480: 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
f490: 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
f4a0: 4c 49 54 45 5f 54 72 61 6e 73 69 74 69 76 65 29  LITE_Transitive)
f4b0: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
f4c0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
f4d0: 65 72 61 74 6f 72 20 7c 3d 20 57 4f 5f 45 51 55  erator |= WO_EQU
f4e0: 49 56 3b 0a 20 20 20 20 20 20 20 20 20 20 65 45  IV;.          eE
f4f0: 78 74 72 61 4f 70 20 3d 20 57 4f 5f 45 51 55 49  xtraOp = WO_EQUI
f500: 56 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  V;.        }.   
f510: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f520: 20 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a    pDup = pExpr;.
f530: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70          pNew = p
f540: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
f550: 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28      exprCommute(
f560: 70 50 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20  pParse, pDup);. 
f570: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
f580: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
f590: 61 74 65 28 70 44 75 70 2d 3e 70 4c 65 66 74 29  ate(pDup->pLeft)
f5a0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65  ;.      pNew->le
f5b0: 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74  ftCursor = pLeft
f5c0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
f5d0: 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  pNew->u.leftColu
f5e0: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
f5f0: 75 6d 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63  umn;.      testc
f600: 61 73 65 28 20 28 70 72 65 72 65 71 4c 65 66 74  ase( (prereqLeft
f610: 20 7c 20 65 78 74 72 61 52 69 67 68 74 29 20 21   | extraRight) !
f620: 3d 20 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a  = prereqLeft );.
f630: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
f640: 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
f650: 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68  Left | extraRigh
f660: 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  t;.      pNew->p
f670: 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65  rereqAll = prere
f680: 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77  qAll;.      pNew
f690: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 28 6f  ->eOperator = (o
f6a0: 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70  peratorMask(pDup
f6b0: 2d 3e 6f 70 29 20 2b 20 65 45 78 74 72 61 4f 70  ->op) + eExtraOp
f6c0: 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20  ) & opMask;.    
f6d0: 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  }.  }..#ifndef S
f6e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
f6f0: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  EN_OPTIMIZATION.
f700: 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69    /* If a term i
f710: 73 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70  s the BETWEEN op
f720: 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74  erator, create t
f730: 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  wo new virtual t
f740: 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64  erms.  ** that d
f750: 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20  efine the range 
f760: 74 68 61 74 20 74 68 65 20 42 45 54 57 45 45 4e  that the BETWEEN
f770: 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f   implements.  Fo
f780: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  r example:.  **.
f790: 20 20 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57    **      a BETW
f7a0: 45 45 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a  EEN b AND c.  **
f7b0: 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74  .  ** is convert
f7c0: 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ed into:.  **.  
f7d0: 2a 2a 20 20 20 20 20 20 28 61 20 42 45 54 57 45  **      (a BETWE
f7e0: 45 4e 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20  EN b AND c) AND 
f7f0: 28 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63  (a>=b) AND (a<=c
f800: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
f810: 74 77 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72  two new terms ar
f820: 65 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65  e added onto the
f830: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72   end of the Wher
f840: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a  eClause object..
f850: 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72    ** The new ter
f860: 6d 73 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22  ms are "dynamic"
f870: 20 61 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65   and are childre
f880: 6e 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  n of the origina
f890: 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74  l BETWEEN.  ** t
f8a0: 65 72 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  erm.  That means
f8b0: 20 74 68 61 74 20 69 66 20 74 68 65 20 42 45 54   that if the BET
f8c0: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64  WEEN term is cod
f8d0: 65 64 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e  ed, the children
f8e0: 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65   are.  ** skippe
f8f0: 64 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63  d.  Or, if the c
f900: 68 69 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69  hildren are sati
f910: 73 66 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65  sfied by an inde
f920: 78 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  x, the original.
f930: 20 20 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72    ** BETWEEN ter
f940: 6d 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  m is skipped..  
f950: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
f960: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57  xpr->op==TK_BETW
f970: 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d  EEN && pWC->op==
f980: 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78  TK_AND ){.    Ex
f990: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
f9a0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
f9b0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
f9c0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f  tatic const u8 o
f9d0: 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54  ps[] = {TK_GE, T
f9e0: 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72  K_LE};.    asser
f9f0: 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
fa00: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
fa10: 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20  ->nExpr==2 );.  
fa20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
fa30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
fa40: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
fa50: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
fa60: 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
fa70: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
fa80: 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20  se, ops[i], .   
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faa0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
fab0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
fac0: 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20  pr->pLeft, 0),. 
fad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
faf0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
fb00: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
fb10: 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
fb20: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
fb30: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
fb40: 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56  pNewExpr, TERM_V
fb50: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
fb60: 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MIC);.      test
fb70: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
fb80: 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61  );.      exprAna
fb90: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
fba0: 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70  idxNew);.      p
fbb0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
fbc0: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
fbd0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50  WC->a[idxNew].iP
fbe0: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
fbf0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d  .    }.    pTerm
fc00: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
fc10: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
fc20: 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f  TE_OMIT_BETWEEN_
fc30: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
fc40: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
fc50: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
fc60: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
fc70: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
fc80: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f  IT_SUBQUERY).  /
fc90: 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d  * Analyze a term
fca0: 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f 73 65   that is compose
fcb0: 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  d of two or more
fcc0: 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63   subterms connec
fcd0: 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f  ted by.  ** an O
fce0: 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  R operator..  */
fcf0: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
fd00: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a  r->op==TK_OR ){.
fd10: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 43 2d      assert( pWC-
fd20: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20  >op==TK_AND );. 
fd30: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72     exprAnalyzeOr
fd40: 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43 2c 20  Term(pSrc, pWC, 
fd50: 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 70 54  idxTerm);.    pT
fd60: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
fd70: 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64  xTerm];.  }.#end
fd80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
fd90: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
fda0: 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  N */..#ifndef SQ
fdb0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
fdc0: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
fdd0: 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73   Add constraints
fde0: 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 73   to reduce the s
fdf0: 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61  earch space on a
fe00: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20   LIKE or GLOB.  
fe10: 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ** operator..  *
fe20: 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61  *.  ** A like pa
fe30: 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72  ttern of the for
fe40: 6d 20 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27  m "x LIKE 'abc%'
fe50: 22 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74  " is changed int
fe60: 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  o constraints.  
fe70: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
fe80: 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c   x>='abc' AND x<
fe90: 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45  'abd' AND x LIKE
fea0: 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a   'abc%'.  **.  *
feb0: 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61 72 61  * The last chara
fec0: 63 74 65 72 20 6f 66 20 74 68 65 20 70 72 65 66  cter of the pref
fed0: 69 78 20 22 61 62 63 22 20 69 73 20 69 6e 63 72  ix "abc" is incr
fee0: 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20  emented to form 
fef0: 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61  the.  ** termina
ff00: 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22  tion condition "
ff10: 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  abd"..  */.  if(
ff20: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44   pWC->op==TK_AND
ff30: 20 0a 20 20 20 26 26 20 69 73 4c 69 6b 65 4f 72   .   && isLikeOr
ff40: 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78  Glob(pParse, pEx
ff50: 70 72 2c 20 26 70 53 74 72 31 2c 20 26 69 73 43  pr, &pStr1, &isC
ff60: 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65  omplete, &noCase
ff70: 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20  ).  ){.    Expr 
ff80: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a  *pLeft;       /*
ff90: 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   LHS of LIKE/GLO
ffa0: 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
ffb0: 20 20 45 78 70 72 20 2a 70 53 74 72 32 3b 20 20    Expr *pStr2;  
ffc0: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
ffd0: 70 53 74 72 31 20 2d 20 52 48 53 20 6f 66 20 4c  pStr1 - RHS of L
ffe0: 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f  IKE/GLOB operato
fff0: 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  r */.    Expr *p
10000 4e 65 77 45 78 70 72 31 3b 0a 20 20 20 20 45 78  NewExpr1;.    Ex
10010 70 72 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20  pr *pNewExpr2;. 
10020 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a     int idxNew1;.
10030 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 32 3b      int idxNew2;
10040 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6c  .    Token sColl
10050 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d  SeqName;  /* Nam
10060 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73  e of collating s
10070 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20  equence */..    
10080 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78  pLeft = pExpr->x
10090 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
100a0 70 72 3b 0a 20 20 20 20 70 53 74 72 32 20 3d 20  pr;.    pStr2 = 
100b0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
100c0 62 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20  b, pStr1, 0);.  
100d0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
100e0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
100f0 20 75 38 20 63 2c 20 2a 70 43 3b 20 20 20 20 20   u8 c, *pC;     
10100 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 72 61 63    /* Last charac
10110 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20 66  ter before the f
10120 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f  irst wildcard */
10130 0a 20 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a  .      pC = (u8*
10140 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65  )&pStr2->u.zToke
10150 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  n[sqlite3Strlen3
10160 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65  0(pStr2->u.zToke
10170 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d  n)-1];.      c =
10180 20 2a 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20   *pC;.      if( 
10190 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20  noCase ){.      
101a0 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69    /* The point i
101b0 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  s to increment t
101c0 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
101d0 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
101e0 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  st.        ** wi
101f0 6c 64 63 61 72 64 2e 20 20 42 75 74 20 69 66 20  ldcard.  But if 
10200 77 65 20 69 6e 63 72 65 6d 65 6e 74 20 27 40 27  we increment '@'
10210 2c 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  , that will push
10220 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20   it into the.   
10230 20 20 20 20 20 2a 2a 20 61 6c 70 68 61 62 65 74       ** alphabet
10240 69 63 20 72 61 6e 67 65 20 77 68 65 72 65 20 63  ic range where c
10250 61 73 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20  ase conversions 
10260 77 69 6c 6c 20 6d 65 73 73 20 75 70 20 74 68 65  will mess up the
10270 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 65   .        ** ine
10280 71 75 61 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f  quality.  To avo
10290 69 64 20 74 68 69 73 2c 20 6d 61 6b 65 20 73 75  id this, make su
102a0 72 65 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74  re to also run t
102b0 68 65 20 66 75 6c 6c 0a 20 20 20 20 20 20 20 20  he full.        
102c0 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63  ** LIKE on all c
102d0 61 6e 64 69 64 61 74 65 20 65 78 70 72 65 73 73  andidate express
102e0 69 6f 6e 73 20 62 79 20 63 6c 65 61 72 69 6e 67  ions by clearing
102f0 20 74 68 65 20 69 73 43 6f 6d 70 6c 65 74 65 20   the isComplete 
10300 66 6c 61 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a  flag.        */.
10310 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
10320 41 27 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65 74  A'-1 ) isComplet
10330 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  e = 0;.        c
10340 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54   = sqlite3UpperT
10350 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20  oLower[c];.     
10360 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63   }.      *pC = c
10370 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   + 1;.    }.    
10380 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 7a 20 3d  sCollSeqName.z =
10390 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43 41 53   noCase ? "NOCAS
103a0 45 22 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20  E" : "BINARY";. 
103b0 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e     sCollSeqName.
103c0 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e 65 77 45  n = 6;.    pNewE
103d0 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78  xpr1 = sqlite3Ex
103e0 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c  prDup(db, pLeft,
103f0 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70   0);.    pNewExp
10400 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  r1 = sqlite3PExp
10410 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c  r(pParse, TK_GE,
10420 20 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c   .           sql
10430 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
10440 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70  teToken(pParse,p
10450 4e 65 77 45 78 70 72 31 2c 26 73 43 6f 6c 6c 53  NewExpr1,&sCollS
10460 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  eqName),.       
10470 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b 0a 20      pStr1, 0);. 
10480 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65     idxNew1 = whe
10490 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
104a0 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54  WC, pNewExpr1, T
104b0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
104c0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74  _DYNAMIC);.    t
104d0 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 31  estcase( idxNew1
104e0 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41  ==0 );.    exprA
104f0 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
10500 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20  , idxNew1);.    
10510 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69  pNewExpr2 = sqli
10520 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
10530 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e  Left, 0);.    pN
10540 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65  ewExpr2 = sqlite
10550 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
10560 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_LT,.          
10570 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
10580 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72  ollateToken(pPar
10590 73 65 2c 70 4e 65 77 45 78 70 72 32 2c 26 73 43  se,pNewExpr2,&sC
105a0 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20  ollSeqName),.   
105b0 20 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30          pStr2, 0
105c0 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d  );.    idxNew2 =
105d0 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
105e0 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
105f0 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  2, TERM_VIRTUAL|
10600 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
10610 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
10620 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65  New2==0 );.    e
10630 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
10640 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a   pWC, idxNew2);.
10650 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
10660 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
10670 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65    if( isComplete
10680 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61   ){.      pWC->a
10690 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e  [idxNew1].iParen
106a0 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
106b0 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
106c0 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  2].iParent = idx
106d0 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
106e0 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20  m->nChild = 2;. 
106f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
10700 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
10710 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
10720 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
10730 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
10740 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61  TABLE.  /* Add a
10750 20 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69   WO_MATCH auxili
10760 61 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20  ary term to the 
10770 63 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69  constraint set i
10780 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
10790 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  nt expression is
107a0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63   of the form:  c
107b0 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72  olumn MATCH expr
107c0 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f  ..  ** This info
107d0 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
107e0 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  by the xBestInde
107f0 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a  x methods of.  *
10800 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  * virtual tables
10810 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75  .  The native qu
10820 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f  ery optimizer do
10830 65 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20  es not attempt. 
10840 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69   ** to do anythi
10850 6e 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75  ng with MATCH fu
10860 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
10870 69 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c  if( isMatchOfCol
10880 75 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20  umn(pExpr) ){.  
10890 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
108a0 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
108b0 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72  *pLeft;.    Wher
108c0 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b  eTerm *pNewTerm;
108d0 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65  .    Bitmask pre
108e0 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65  reqColumn, prere
108f0 71 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67  qExpr;..    pRig
10900 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
10910 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
10920 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78  .    pLeft = pEx
10930 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
10940 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65  ].pExpr;.    pre
10950 72 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61  reqExpr = exprTa
10960 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
10970 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
10980 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65  prereqColumn = e
10990 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
109a0 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a  askSet, pLeft);.
109b0 20 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45      if( (prereqE
109c0 78 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75  xpr & prereqColu
109d0 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mn)==0 ){.      
109e0 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
109f0 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d        pNewExpr =
10a00 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
10a10 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20  arse, TK_MATCH, 
10a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
10a40 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
10a50 28 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c  (db, pRight, 0),
10a60 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65   0);.      idxNe
10a70 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
10a80 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
10a90 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  xpr, TERM_VIRTUA
10aa0 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
10ab0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10ac0 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
10ad0 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
10ae0 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
10af0 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
10b00 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72  prereqRight = pr
10b10 65 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20  ereqExpr;.      
10b20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pNewTerm->leftCu
10b30 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
10b40 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
10b50 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
10b60 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
10b70 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  umn;.      pNewT
10b80 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
10b90 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20   WO_MATCH;.     
10ba0 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65   pNewTerm->iPare
10bb0 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
10bc0 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
10bd0 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
10be0 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
10bf0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65  d = 1;.      pTe
10c00 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
10c10 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
10c20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
10c30 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70  eqAll = pTerm->p
10c40 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a  rereqAll;.    }.
10c50 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
10c60 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
10c70 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65  LTABLE */..#ifde
10c80 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10c90 53 54 41 54 34 0a 20 20 2f 2a 20 57 68 65 6e 20  STAT4.  /* When 
10ca0 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73  sqlite_stat3 his
10cb0 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61  togram data is a
10cc0 76 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72  vailable an oper
10cd0 61 74 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ator of the.  **
10ce0 20 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20   form "x IS NOT 
10cf0 4e 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69  NULL" can someti
10d00 6d 65 73 20 62 65 20 65 76 61 6c 75 61 74 65 64  mes be evaluated
10d10 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c   more efficientl
10d20 79 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c  y.  ** as "x>NUL
10d30 4c 22 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61  L" if x is not a
10d40 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
10d50 59 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74  Y KEY.  So const
10d60 72 75 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74  ruct a.  ** virt
10d70 75 61 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74  ual term of that
10d80 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   form..  **.  **
10d90 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 76   Note that the v
10da0 69 72 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74  irtual term must
10db0 20 62 65 20 74 61 67 67 65 64 20 77 69 74 68 20   be tagged with 
10dc0 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54 68 69  TERM_VNULL.  Thi
10dd0 73 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c  s.  ** TERM_VNUL
10de0 4c 20 74 61 67 20 77 69 6c 6c 20 73 75 70 70 72  L tag will suppr
10df0 65 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c  ess the not-null
10e00 20 63 68 65 63 6b 20 61 74 20 74 68 65 20 62 65   check at the be
10e10 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20  ginning.  ** of 
10e20 74 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74 68 6f  the loop.  Witho
10e30 75 74 20 74 68 65 20 54 45 52 4d 5f 56 4e 55 4c  ut the TERM_VNUL
10e40 4c 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f 74 2d  L flag, the not-
10e50 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a 20 20  null check at.  
10e60 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  ** the start of 
10e70 74 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 70 72  the loop will pr
10e80 65 76 65 6e 74 20 61 6e 79 20 72 65 73 75 6c 74  event any result
10e90 73 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 74  s from being ret
10ea0 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  urned..  */.  if
10eb0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
10ec0 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70 45  NOTNULL.   && pE
10ed0 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  xpr->pLeft->op==
10ee0 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20  TK_COLUMN.   && 
10ef0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 43  pExpr->pLeft->iC
10f00 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 26 26 20 4f  olumn>=0.   && O
10f10 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
10f20 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 74  ed(db, SQLITE_St
10f30 61 74 33 29 0a 20 20 29 7b 0a 20 20 20 20 45 78  at3).  ){.    Ex
10f40 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
10f50 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
10f60 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
10f70 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
10f80 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65    WhereTerm *pNe
10f90 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70 4e 65 77  wTerm;..    pNew
10fa0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
10fb0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47  xpr(pParse, TK_G
10fc0 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10fe0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
10ff0 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20  , pLeft, 0),.   
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11010 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11020 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
11030 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 2c  _NULL, 0, 0, 0),
11040 20 30 29 3b 0a 0a 20 20 20 20 69 64 78 4e 65 77   0);..    idxNew
11050 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
11060 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
11070 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11090 20 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54    TERM_VIRTUAL|T
110a0 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d  ERM_DYNAMIC|TERM
110b0 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 28  _VNULL);.    if(
110c0 20 69 64 78 4e 65 77 20 29 7b 0a 20 20 20 20 20   idxNew ){.     
110d0 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43   pNewTerm = &pWC
110e0 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
110f0 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65     pNewTerm->pre
11100 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20  reqRight = 0;.  
11110 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65      pNewTerm->le
11120 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74  ftCursor = pLeft
11130 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
11140 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  pNewTerm->u.left
11150 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
11160 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
11170 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  NewTerm->eOperat
11180 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20 20 20 20  or = WO_GT;.    
11190 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72    pNewTerm->iPar
111a0 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
111b0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
111c0 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
111d0 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
111e0 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54  ld = 1;.      pT
111f0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
11200 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20  TERM_COPIED;.   
11210 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65     pNewTerm->pre
11220 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e  reqAll = pTerm->
11230 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d  prereqAll;.    }
11240 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
11250 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
11260 54 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65  T */..  /* Preve
11270 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72  nt ON clause ter
11280 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  ms of a LEFT JOI
11290 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65  N from being use
112a0 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20  d to drive.  ** 
112b0 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62  an index for tab
112c0 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
112d0 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
112e0 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  /.  pTerm->prere
112f0 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52  qRight |= extraR
11300 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ight;.}../*.** T
11310 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61  his function sea
11320 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20  rches pList for 
11330 61 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  a entry that mat
11340 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68  ches the iCol-th
11350 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e   column.** of in
11360 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
11370 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72 65  If such an expre
11380 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
11390 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  its index in pLi
113a0 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72  st->a[] is retur
113b0 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78  ned. If.** no ex
113c0 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
113d0 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
113e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
113f0 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20   findIndexCol(. 
11400 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11420 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
11430 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
11440 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
11450 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
11460 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61  sion list to sea
11470 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61  rch */.  int iBa
11480 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
11490 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
114a0 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73  or for table ass
114b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
114c0 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
114d0 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
114e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
114f0 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  to match column 
11500 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  of */.  int iCol
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
11530 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61  n of index to ma
11540 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
11550 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
11560 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
11570 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20  zColl[iCol];..  
11580 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
11590 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
115a0 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
115b0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
115c0 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ate(pList->a[i].
115d0 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
115e0 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
115f0 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c  .     && p->iCol
11600 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
11610 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26  umn[iCol].     &
11620 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61  & p->iTable==iBa
11630 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  se.    ){.      
11640 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
11650 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
11660 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
11670 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
11680 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
11690 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71  (pColl) && 0==sq
116a0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
116b0 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c  ll->zName, zColl
116c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
116d0 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20  urn i;.      }. 
116e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
116f0 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
11700 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
11710 68 65 20 44 49 53 54 49 4e 43 54 20 65 78 70 72  he DISTINCT expr
11720 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73  ession-list pass
11730 65 64 20 61 73 20 74 68 65 20 74 68 69 72 64 20  ed as the third 
11740 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72  argument.** is r
11750 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20  edundant..**.** 
11760 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20  A DISTINCT list 
11770 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20  is redundant if 
11780 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
11790 74 61 69 6e 73 20 73 6f 6d 65 20 73 75 62 73 65  tains some subse
117a0 74 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  t of.** columns 
117b0 74 68 61 74 20 61 72 65 20 75 6e 69 71 75 65 20  that are unique 
117c0 61 6e 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f  and non-null..*/
117d0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69  .static int isDi
117e0 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28  stinctRedundant(
117f0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11800 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
11810 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
11820 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
11830 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  abList,        /
11840 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
11850 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
11860 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
11870 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
11880 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
11890 73 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20  st *pDistinct   
118a0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
118b0 74 20 73 65 74 20 74 68 61 74 20 6e 65 65 64 73  t set that needs
118c0 20 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20   to be DISTINCT 
118d0 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
118e0 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
118f0 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  dx;.  int i;    
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61        .  int iBa
11920 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  se;..  /* If the
11930 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  re is more than 
11940 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62  one table or sub
11950 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46  -select in the F
11960 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20  ROM clause of.  
11970 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20 74  ** this query, t
11980 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  hen it will not 
11990 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73  be possible to s
119a0 68 6f 77 20 74 68 61 74 20 74 68 65 20 44 49 53  how that the DIS
119b0 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75  TINCT .  ** clau
119c0 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  se is redundant.
119d0 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69   */.  if( pTabLi
119e0 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  st->nSrc!=1 ) re
119f0 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20  turn 0;.  iBase 
11a00 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  = pTabList->a[0]
11a10 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62  .iCursor;.  pTab
11a20 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30   = pTabList->a[0
11a30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66  ].pTab;..  /* If
11a40 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72   any of the expr
11a50 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50  essions is an IP
11a60 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c  K column on tabl
11a70 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65  e iBase, then re
11a80 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e  turn .  ** true.
11a90 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69   Note: The (p->i
11aa0 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61  Table==iBase) pa
11ab0 72 74 20 6f 66 20 74 68 69 73 20 74 65 73 74 20  rt of this test 
11ac0 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69 66 20  may be false if 
11ad0 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
11ae0 20 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72   SELECT is a cor
11af0 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72  related sub-quer
11b00 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
11b10 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e  0; i<pDistinct->
11b20 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
11b30 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
11b40 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
11b50 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69  e(pDistinct->a[i
11b60 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
11b70 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
11b80 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d  MN && p->iTable=
11b90 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f  =iBase && p->iCo
11ba0 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
11bb0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f  1;.  }..  /* Loo
11bc0 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e  p through all in
11bd0 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62  dices on the tab
11be0 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63  le, checking eac
11bf0 68 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d  h to see if it m
11c00 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49  akes.  ** the DI
11c10 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
11c20 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64   redundant. It d
11c30 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a  oes so if:.  **.
11c40 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e    **   1. The in
11c50 64 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e  dex is itself UN
11c60 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20  IQUE, and.  **. 
11c70 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20   **   2. All of 
11c80 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
11c90 68 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74  he index are eit
11ca0 68 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20  her part of the 
11cb0 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20  pDistinct.  **  
11cc0 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73      list, or els
11cd0 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
11ce0 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65  se contains a te
11cf0 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
11d00 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20  col=X",.  **    
11d10 20 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63    where X is a c
11d20 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54  onstant value. T
11d30 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
11d40 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20  uences of the.  
11d50 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73  **      comparis
11d60 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69  on and select-li
11d70 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  st expressions m
11d80 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20  ust match those 
11d90 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  of the index..  
11da0 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c  **.  **   3. All
11db0 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20   of those index 
11dc0 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63  columns for whic
11dd0 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  h the WHERE clau
11de0 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a  se does not.  **
11df0 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20        contain a 
11e00 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65  "col=X" term are
11e10 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f   subject to a NO
11e20 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
11e30 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  t..  */.  for(pI
11e40 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
11e50 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
11e60 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
11e70 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
11e80 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69  =OE_None ) conti
11e90 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  nue;.    for(i=0
11ea0 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
11eb0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
11ec0 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nt iCol = pIdx->
11ed0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
11ee0 20 20 20 69 66 28 20 30 3d 3d 66 69 6e 64 54 65     if( 0==findTe
11ef0 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69  rm(pWC, iBase, i
11f00 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30  Col, ~(Bitmask)0
11f10 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29  , WO_EQ, pIdx) )
11f20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 49  {.        int iI
11f30 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65  dxCol = findInde
11f40 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69  xCol(pParse, pDi
11f50 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70  stinct, iBase, p
11f60 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  Idx, i);.       
11f70 20 69 66 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c   if( iIdxCol<0 |
11f80 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64  | pTab->aCol[pId
11f90 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e  x->aiColumn[i]].
11fa0 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  notNull==0 ){.  
11fb0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11fc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11fd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
11fe0 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  ==pIdx->nColumn 
11ff0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
12000 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74   index implies t
12010 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
12020 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65   qualifier is re
12030 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20  dundant. */.    
12040 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
12050 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
12060 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 46 69 6e  0;.}../* .** Fin
12070 64 20 28 61 6e 20 61 70 70 72 6f 78 69 6d 61 74  d (an approximat
12080 65 29 20 73 75 6d 20 6f 66 20 74 77 6f 20 57 68  e) sum of two Wh
12090 65 72 65 43 6f 73 74 73 2e 20 20 54 68 69 73 20  ereCosts.  This 
120a0 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 0a 2a  computation is.*
120b0 2a 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 22  * not a simple "
120c0 2b 22 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61  +" operator beca
120d0 75 73 65 20 57 68 65 72 65 43 6f 73 74 20 69 73  use WhereCost is
120e0 20 73 74 6f 72 65 64 20 61 73 20 61 20 6c 6f 67   stored as a log
120f0 61 72 69 74 68 6d 69 63 0a 2a 2a 20 76 61 6c 75  arithmic.** valu
12100 65 2e 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  e..** .*/.static
12110 20 57 68 65 72 65 43 6f 73 74 20 77 68 65 72 65   WhereCost where
12120 43 6f 73 74 41 64 64 28 57 68 65 72 65 43 6f 73  CostAdd(WhereCos
12130 74 20 61 2c 20 57 68 65 72 65 43 6f 73 74 20 62  t a, WhereCost b
12140 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
12150 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
12160 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 31 30 2c  x[] = {.     10,
12170 20 31 30 2c 20 20 20 20 20 20 20 20 20 20 20 20   10,            
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12190 30 2c 31 20 2a 2f 0a 20 20 20 20 20 20 39 2c 20  0,1 */.      9, 
121a0 39 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9,              
121b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
121c0 2c 33 20 2a 2f 0a 20 20 20 20 20 20 38 2c 20 38  ,3 */.      8, 8
121d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
121e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 2c             /* 4,
121f0 35 20 2a 2f 0a 20 20 20 20 20 20 37 2c 20 37 2c  5 */.      7, 7,
12200 20 37 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   7,             
12210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 2c 37            /* 6,7
12220 2c 38 20 2a 2f 0a 20 20 20 20 20 20 36 2c 20 36  ,8 */.      6, 6
12230 2c 20 36 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 6,            
12240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 39 2c             /* 9,
12250 31 30 2c 31 31 20 2a 2f 0a 20 20 20 20 20 20 35  10,11 */.      5
12260 2c 20 35 2c 20 35 2c 20 20 20 20 20 20 20 20 20  , 5, 5,         
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12280 20 31 32 2d 31 34 20 2a 2f 0a 20 20 20 20 20 20   12-14 */.      
12290 34 2c 20 34 2c 20 34 2c 20 34 2c 20 20 20 20 20  4, 4, 4, 4,     
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
122b0 2a 20 31 35 2d 31 38 20 2a 2f 0a 20 20 20 20 20  * 15-18 */.     
122c0 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20   3, 3, 3, 3, 3, 
122d0 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
122e0 2f 2a 20 31 39 2d 32 34 20 2a 2f 0a 20 20 20 20  /* 19-24 */.    
122f0 20 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c    2, 2, 2, 2, 2,
12300 20 32 2c 20 32 2c 20 20 20 20 20 20 20 20 20 20   2, 2,          
12310 20 2f 2a 20 32 35 2d 33 31 20 2a 2f 0a 20 20 7d   /* 25-31 */.  }
12320 3b 0a 20 20 69 66 28 20 61 3e 3d 62 20 29 7b 0a  ;.  if( a>=b ){.
12330 20 20 20 20 69 66 28 20 61 3e 62 2b 34 39 20 29      if( a>b+49 )
12340 20 72 65 74 75 72 6e 20 61 3b 0a 20 20 20 20 69   return a;.    i
12350 66 28 20 61 3e 62 2b 33 31 20 29 20 72 65 74 75  f( a>b+31 ) retu
12360 72 6e 20 61 2b 31 3b 0a 20 20 20 20 72 65 74 75  rn a+1;.    retu
12370 72 6e 20 61 2b 78 5b 61 2d 62 5d 3b 0a 20 20 7d  rn a+x[a-b];.  }
12380 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 62 3e  else{.    if( b>
12390 61 2b 34 39 20 29 20 72 65 74 75 72 6e 20 62 3b  a+49 ) return b;
123a0 0a 20 20 20 20 69 66 28 20 62 3e 61 2b 33 31 20  .    if( b>a+31 
123b0 29 20 72 65 74 75 72 6e 20 62 2b 31 3b 0a 20 20  ) return b+1;.  
123c0 20 20 72 65 74 75 72 6e 20 62 2b 78 5b 62 2d 61    return b+x[b-a
123d0 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ];.  }.}../*.** 
123e0 43 6f 6e 76 65 72 74 20 61 6e 20 69 6e 74 65 67  Convert an integ
123f0 65 72 20 69 6e 74 6f 20 61 20 57 68 65 72 65 43  er into a WhereC
12400 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ost.  In other w
12410 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65 20 61 0a  ords, compute a.
12420 2a 2a 20 67 6f 6f 64 20 61 70 70 72 6f 78 69 6d  ** good approxim
12430 61 74 61 74 69 6f 6e 20 66 6f 72 20 31 30 2a 6c  atation for 10*l
12440 6f 67 32 28 78 29 2e 0a 2a 2f 0a 73 74 61 74 69  og2(x)..*/.stati
12450 63 20 57 68 65 72 65 43 6f 73 74 20 77 68 65 72  c WhereCost wher
12460 65 43 6f 73 74 28 74 52 6f 77 63 6e 74 20 78 29  eCost(tRowcnt x)
12470 7b 0a 20 20 73 74 61 74 69 63 20 57 68 65 72 65  {.  static Where
12480 43 6f 73 74 20 61 5b 5d 20 3d 20 7b 20 30 2c 20  Cost a[] = { 0, 
12490 32 2c 20 33 2c 20 35 2c 20 36 2c 20 37 2c 20 38  2, 3, 5, 6, 7, 8
124a0 2c 20 39 20 7d 3b 0a 20 20 57 68 65 72 65 43 6f  , 9 };.  WhereCo
124b0 73 74 20 79 20 3d 20 34 30 3b 0a 20 20 69 66 28  st y = 40;.  if(
124c0 20 78 3c 38 20 29 7b 0a 20 20 20 20 69 66 28 20   x<8 ){.    if( 
124d0 78 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  x<2 ) return 0;.
124e0 20 20 20 20 77 68 69 6c 65 28 20 78 3c 38 20 29      while( x<8 )
124f0 7b 20 20 79 20 2d 3d 20 31 30 3b 20 78 20 3c 3c  {  y -= 10; x <<
12500 3d 20 31 3b 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  = 1; }.  }else{.
12510 20 20 20 20 77 68 69 6c 65 28 20 78 3e 32 35 35      while( x>255
12520 20 29 7b 20 79 20 2b 3d 20 34 30 3b 20 78 20 3e   ){ y += 40; x >
12530 3e 3d 20 34 3b 20 7d 0a 20 20 20 20 77 68 69 6c  >= 4; }.    whil
12540 65 28 20 78 3e 31 35 20 29 7b 20 20 79 20 2b 3d  e( x>15 ){  y +=
12550 20 31 30 3b 20 78 20 3e 3e 3d 20 31 3b 20 7d 0a   10; x >>= 1; }.
12560 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 5b 78    }.  return a[x
12570 26 37 5d 20 2b 20 79 20 2d 20 31 30 3b 0a 7d 0a  &7] + y - 10;.}.
12580 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12590 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
125a0 45 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  E./*.** Convert 
125b0 61 20 64 6f 75 62 6c 65 20 28 61 73 20 72 65 63  a double (as rec
125c0 65 69 76 65 64 20 66 72 6f 6d 20 78 42 65 73 74  eived from xBest
125d0 49 6e 64 65 78 20 6f 66 20 61 20 76 69 72 74 75  Index of a virtu
125e0 61 6c 20 74 61 62 6c 65 29 0a 2a 2a 20 69 6e 74  al table).** int
125f0 6f 20 61 20 57 68 65 72 65 43 6f 73 74 2e 20 20  o a WhereCost.  
12600 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
12610 63 6f 6d 70 75 74 65 20 61 6e 20 61 70 70 72 6f  compute an appro
12620 78 69 6d 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  ximation for.** 
12630 31 30 2a 6c 6f 67 32 28 78 29 2e 0a 2a 2f 0a 73  10*log2(x)..*/.s
12640 74 61 74 69 63 20 57 68 65 72 65 43 6f 73 74 20  tatic WhereCost 
12650 77 68 65 72 65 43 6f 73 74 46 72 6f 6d 44 6f 75  whereCostFromDou
12660 62 6c 65 28 64 6f 75 62 6c 65 20 78 29 7b 0a 20  ble(double x){. 
12670 20 75 36 34 20 61 3b 0a 20 20 57 68 65 72 65 43   u64 a;.  WhereC
12680 6f 73 74 20 65 3b 0a 20 20 61 73 73 65 72 74 28  ost e;.  assert(
12690 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26   sizeof(x)==8 &&
126a0 20 73 69 7a 65 6f 66 28 61 29 3d 3d 38 20 29 3b   sizeof(a)==8 );
126b0 0a 20 20 69 66 28 20 78 3c 3d 31 20 29 20 72 65  .  if( x<=1 ) re
126c0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 78 3c  turn 0;.  if( x<
126d0 3d 32 30 30 30 30 30 30 30 30 30 20 29 20 72 65  =2000000000 ) re
126e0 74 75 72 6e 20 77 68 65 72 65 43 6f 73 74 28 28  turn whereCost((
126f0 74 52 6f 77 63 6e 74 29 78 29 3b 0a 20 20 6d 65  tRowcnt)x);.  me
12700 6d 63 70 79 28 26 61 2c 20 26 78 2c 20 38 29 3b  mcpy(&a, &x, 8);
12710 0a 20 20 65 20 3d 20 28 61 3e 3e 35 32 29 20 2d  .  e = (a>>52) -
12720 20 31 30 32 32 3b 0a 20 20 72 65 74 75 72 6e 20   1022;.  return 
12730 65 2a 31 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  e*10;.}.#endif /
12740 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
12750 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
12760 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
12770 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  e logarithm of t
12780 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74  he input value t
12790 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61  o base 2..*/.sta
127a0 74 69 63 20 57 68 65 72 65 43 6f 73 74 20 65 73  tic WhereCost es
127b0 74 4c 6f 67 28 57 68 65 72 65 43 6f 73 74 20 4e  tLog(WhereCost N
127c0 29 7b 0a 20 20 57 68 65 72 65 43 6f 73 74 20 78  ){.  WhereCost x
127d0 20 3d 20 77 68 65 72 65 43 6f 73 74 28 4e 29 3b   = whereCost(N);
127e0 0a 20 20 72 65 74 75 72 6e 20 78 3e 33 33 20 3f  .  return x>33 ?
127f0 20 78 20 2d 20 33 33 20 3a 20 30 3b 0a 7d 0a 0a   x - 33 : 0;.}..
12800 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e  /*.** Two routin
12810 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  es for printing 
12820 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
12830 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
12840 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  info.** structur
12850 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73  e.  Used for tes
12860 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
12870 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69  ng only.  If nei
12880 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  ther.** SQLITE_T
12890 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  EST or SQLITE_DE
128a0 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c  BUG are defined,
128b0 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74   then these rout
128c0 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f  ines.** are no-o
128d0 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ps..*/.#if !defi
128e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
128f0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
12900 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
12910 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61  ACE_ENABLED).sta
12920 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
12930 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65  DX_INPUTS(sqlite
12940 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
12950 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
12960 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
12970 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
12980 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
12990 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
129a0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
129b0 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74  gPrintf("  const
129c0 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25  raint[%d]: col=%
129d0 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25  d termid=%d op=%
129e0 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c  d usabled=%d\n",
129f0 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
12a00 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
12a10 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
12a20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
12a30 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[i].iTermOffse
12a40 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  t,.       p->aCo
12a50 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a  nstraint[i].op,.
12a60 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
12a70 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29  raint[i].usable)
12a80 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
12a90 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20   i<p->nOrderBy; 
12aa0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
12ab0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
12ac0 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c  orderby[%d]: col
12ad0 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a  =%d desc=%d\n",.
12ae0 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
12af0 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
12b00 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
12b10 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64  p->aOrderBy[i].d
12b20 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  esc);.  }.}.stat
12b30 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
12b40 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65  X_OUTPUTS(sqlite
12b50 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
12b60 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
12b70 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
12b80 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
12b90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
12ba0 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
12bb0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
12bc0 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65  gPrintf("  usage
12bd0 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64  [%d]: argvIdx=%d
12be0 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20   omit=%d\n",.   
12bf0 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
12c00 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
12c10 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a  e[i].argvIndex,.
12c20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
12c30 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d  raintUsage[i].om
12c40 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  it);.  }.  sqlit
12c50 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
12c60 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70   idxNum=%d\n", p
12c70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c  ->idxNum);.  sql
12c80 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
12c90 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c  "  idxStr=%s\n",
12ca0 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73   p->idxStr);.  s
12cb0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
12cc0 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73  f("  orderByCons
12cd0 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f  umed=%d\n", p->o
12ce0 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b  rderByConsumed);
12cf0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
12d00 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74  rintf("  estimat
12d10 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d  edCost=%g\n", p-
12d20 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
12d30 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
12d40 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
12d50 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41  S(A).#define TRA
12d60 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41  CE_IDX_OUTPUTS(A
12d70 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ).#endif..#ifnde
12d80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12d90 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
12da0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
12db0 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
12dc0 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69  use term pTerm i
12dd0 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72  s of a form wher
12de0 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  e it.** could be
12df0 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
12e00 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53  dex to access pS
12e10 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20  rc, assuming an 
12e20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69  appropriate.** i
12e30 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f  ndex existed..*/
12e40 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d  .static int term
12e50 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20  CanDriveIndex(. 
12e60 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
12e70 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
12e80 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
12e90 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f  term to check */
12ea0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
12eb0 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20  t_item *pSrc,   
12ec0 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72    /* Table we ar
12ed0 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65  e trying to acce
12ee0 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ss */.  Bitmask 
12ef0 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20  notReady        
12f00 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
12f10 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20   in outer loops 
12f20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29  of the join */.)
12f30 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20  {.  char aff;.  
12f40 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
12f50 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75  ursor!=pSrc->iCu
12f60 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rsor ) return 0;
12f70 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  .  if( (pTerm->e
12f80 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
12f90 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
12fa0 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70  .  if( (pTerm->p
12fb0 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
12fc0 52 65 61 64 79 29 21 3d 30 20 29 20 72 65 74 75  Ready)!=0 ) retu
12fd0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72  rn 0;.  if( pTer
12fe0 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c  m->u.leftColumn<
12ff0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
13000 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  aff = pSrc->pTab
13010 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e  ->aCol[pTerm->u.
13020 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  leftColumn].affi
13030 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c  nity;.  if( !sql
13040 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
13050 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  yOk(pTerm->pExpr
13060 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e 20  , aff) ) return 
13070 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  0;.  return 1;.}
13080 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65  .#endif...#ifnde
13090 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
130a0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
130b0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
130c0 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  e to construct t
130d0 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
130e0 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  for an automatic
130f0 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f   index.** and to
13100 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65 72   set up the Wher
13110 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c  eLevel object pL
13120 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65  evel so that the
13130 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
13140 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20  ** makes use of 
13150 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
13160 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
13170 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74  oid constructAut
13180 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50  omaticIndex(.  P
13190 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
131a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
131b0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
131c0 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
131d0 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
131e0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
131f0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
13200 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
13210 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
13220 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
13230 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74 20  to get the next 
13240 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61  index */.  Bitma
13250 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
13260 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
13270 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
13280 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
13290 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
132a0 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20   *pLevel        
132b0 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69    /* Write new i
132c0 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ndex here */.){.
132d0 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20    int nColumn;  
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
132f0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
13300 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  ns in the constr
13310 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  ucted index */. 
13320 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
13330 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
13340 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
13350 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
13360 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
13370 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20   *pWCEnd;       
13380 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43     /* End of pWC
13390 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ->a[] */.  int n
133a0 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
133b0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
133c0 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20  f memory needed 
133d0 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e  for pIdx */.  In
133e0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
133f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
13400 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20 74  ect describing t
13410 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  he transient ind
13420 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ex */.  Vdbe *v;
13430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13440 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20      /* Prepared 
13450 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
13460 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
13470 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20    int addrInit; 
13480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13490 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
134a0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62  initialization b
134b0 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20  ypass jump */.  
134c0 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20  Table *pTable;  
134d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
134e0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69  he table being i
134f0 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65 79 49  ndexed */.  KeyI
13500 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b 20 20  nfo *pKeyinfo;  
13510 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69          /* Key i
13520 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
13530 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20 0a 20  he index */   . 
13540 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13560 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78  Top of the index
13570 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20   fill loop */.  
13580 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
13590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
135a0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
135b0 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  an index record 
135c0 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135e0 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74   /* Column count
135f0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  er */.  int i;  
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13610 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
13620 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42  ter */.  int mxB
13630 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  itCol;          
13640 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
13650 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e  column in pSrc->
13660 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c  colUsed */.  Col
13670 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
13680 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
13690 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
136a0 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  o on a column */
136b0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
136c0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oop;           /
136d0 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63  * The Loop objec
136e0 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  t */.  Bitmask i
136f0 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  dxCols;         
13700 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
13710 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72  columns used for
13720 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42   indexing */.  B
13730 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73  itmask extraCols
13740 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69  ;          /* Bi
13750 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e  tmap of addition
13760 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  al columns */.  
13770 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d  u8 sentWarning =
13780 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
13790 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69 6e  rue if a warnnin
137a0 67 20 68 61 73 20 62 65 65 6e 20 69 73 73 75 65  g has been issue
137b0 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  d */..  /* Gener
137c0 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70  ate code to skip
137d0 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74 69   over the creati
137e0 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  on and initializ
137f0 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  ation of the.  *
13800 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  * transient inde
13810 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62  x on 2nd and sub
13820 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f  sequent iteratio
13830 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ns of the loop. 
13840 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
13850 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
13860 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72  ( v!=0 );.  addr
13870 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43 6f  Init = sqlite3Co
13880 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
13890 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
138a0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
138b0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61  s that will be a
138c0 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  dded to the inde
138d0 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65 64 20  x.  ** and used 
138e0 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45 20 63  to match WHERE c
138f0 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
13900 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d  s */.  nColumn =
13910 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70   0;.  pTable = p
13920 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43  Src->pTab;.  pWC
13930 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57  End = &pWC->a[pW
13940 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f  C->nTerm];.  pLo
13950 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
13960 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  oop;.  idxCols =
13970 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
13980 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
13990 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
139a0 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
139b0 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
139c0 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
139d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
139e0 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
139f0 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
13a00 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
13a10 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
13a20 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
13a30 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
13a40 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
13a50 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74  ==BMS );.      t
13a60 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
13a70 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-1 );.      if
13a80 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29  ( !sentWarning )
13a90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13aa0 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
13ab0 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a  NING_AUTOINDEX,.
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75 74              "aut
13ad0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20  omatic index on 
13ae0 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d  %s(%s)", pTable-
13af0 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
13b00 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
13b10 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  [iCol].zName);. 
13b20 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69         sentWarni
13b30 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ng = 1;.      }.
13b40 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
13b50 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
13b60 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68  {.        if( wh
13b70 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50  ereLoopResize(pP
13b80 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c  arse->db, pLoop,
13b90 20 6e 43 6f 6c 75 6d 6e 2b 31 29 20 29 20 72 65   nColumn+1) ) re
13ba0 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4c  turn;.        pL
13bb0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 43 6f 6c  oop->aLTerm[nCol
13bc0 75 6d 6e 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a  umn++] = pTerm;.
13bd0 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
13be0 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
13bf0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
13c00 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20  sert( nColumn>0 
13c10 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  );.  pLoop->u.bt
13c20 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  ree.nEq = pLoop-
13c30 3e 6e 4c 54 65 72 6d 20 3d 20 6e 43 6f 6c 75 6d  >nLTerm = nColum
13c40 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  n;.  pLoop->wsFl
13c50 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
13c60 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44  MN_EQ | WHERE_ID
13c70 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49  X_ONLY | WHERE_I
13c80 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20 20 20  NDEXED.         
13c90 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57 48              | WH
13ca0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a  ERE_AUTO_INDEX;.
13cb0 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
13cc0 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69  number of additi
13cd0 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
13ce0 64 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a  ded to create a.
13cf0 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e    ** covering in
13d00 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e  dex.  A "coverin
13d10 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69  g index" is an i
13d20 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
13d30 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75  ns all.  ** colu
13d40 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 65 65  mns that are nee
13d50 64 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79  ded by the query
13d60 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65 72 69  .  With a coveri
13d70 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20  ng index, the.  
13d80 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
13d90 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  e never needs to
13da0 20 62 65 20 61 63 63 65 73 73 65 64 2e 20 20 41   be accessed.  A
13db0 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73  utomatic indices
13dc0 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20   must.  ** be a 
13dd0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62  covering index b
13de0 65 63 61 75 73 65 20 74 68 65 20 69 6e 64 65 78  ecause the index
13df0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64   will not be upd
13e00 61 74 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a  ated if the.  **
13e10 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
13e20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20  changes and the 
13e30 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
13e40 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75  cannot both be u
13e50 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79  sed.  ** if they
13e60 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e   go out of sync.
13e70 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c  .  */.  extraCol
13e80 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  s = pSrc->colUse
13e90 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20  d & (~idxCols | 
13ea0 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b  MASKBIT(BMS-1));
13eb0 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70  .  mxBitCol = (p
13ec0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42  Table->nCol >= B
13ed0 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20  MS-1) ? BMS-1 : 
13ee0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20  pTable->nCol;.  
13ef0 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65  testcase( pTable
13f00 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
13f10 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
13f20 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32  ble->nCol==BMS-2
13f30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
13f40 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
13f50 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
13f60 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20  ls & MASKBIT(i) 
13f70 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d  ) nColumn++;.  }
13f80 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
13f90 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
13fa0 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 43 6f  MS-1) ){.    nCo
13fb0 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d 3e  lumn += pTable->
13fc0 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a  nCol - BMS + 1;.
13fd0 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46    }.  pLoop->wsF
13fe0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
13ff0 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f  LUMN_EQ | WHERE_
14000 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f 2a 20  IDX_ONLY;..  /* 
14010 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  Construct the In
14020 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65  dex object to de
14030 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65  scribe this inde
14040 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73  x */.  nByte = s
14050 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20  izeof(Index);.  
14060 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
14070 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20  *sizeof(int);   
14080 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c    /* Index.aiCol
14090 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  umn */.  nByte +
140a0 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
140b0 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e  (char*);   /* In
140c0 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20  dex.azColl */.  
140d0 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
140e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
140f0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74    /* Index.aSort
14100 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78 20  Order */.  pIdx 
14110 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
14120 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
14130 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
14140 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
14150 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ;.  pLoop->u.btr
14160 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
14170 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ;.  pIdx->azColl
14180 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64 78   = (char**)&pIdx
14190 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  [1];.  pIdx->aiC
141a0 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70  olumn = (int*)&p
141b0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c  Idx->azColl[nCol
141c0 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53  umn];.  pIdx->aS
141d0 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
141e0 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  &pIdx->aiColumn[
141f0 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78  nColumn];.  pIdx
14200 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d  ->zName = "auto-
14210 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e  index";.  pIdx->
14220 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d  nColumn = nColum
14230 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c  n;.  pIdx->pTabl
14240 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20  e = pTable;.  n 
14250 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  = 0;.  idxCols =
14260 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
14270 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
14280 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
14290 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
142a0 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
142b0 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
142c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
142d0 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
142e0 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
142f0 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
14300 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
14310 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
14320 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
14330 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
14340 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
14350 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
14360 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66  =BMS );.      if
14370 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61  ( (idxCols & cMa
14380 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
14390 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
143a0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
143b0 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
143c0 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ask;.        pId
143d0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
143e0 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
143f0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43  lumn;.        pC
14400 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
14410 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
14420 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
14430 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
14440 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
14450 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41  azColl[n] = ALWA
14460 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c  YS(pColl) ? pCol
14470 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41  l->zName : "BINA
14480 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b  RY";.        n++
14490 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
144a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75    }.  assert( (u
144b0 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62  32)n==pLoop->u.b
144c0 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f  tree.nEq );..  /
144d0 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c  * Add additional
144e0 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
144f0 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f  to make the auto
14500 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f  matic index into
14510 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67  .  ** a covering
14520 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28   index */.  for(
14530 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b  i=0; i<mxBitCol;
14540 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65   i++){.    if( e
14550 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42  xtraCols & MASKB
14560 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70  IT(i) ){.      p
14570 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
14580 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
14590 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
145a0 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b  INARY";.      n+
145b0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
145c0 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
145d0 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   & MASKBIT(BMS-1
145e0 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42  ) ){.    for(i=B
145f0 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  MS-1; i<pTable->
14600 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
14610 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
14620 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70  [n] = i;.      p
14630 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
14640 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
14650 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
14660 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43 6f    assert( n==nCo
14670 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43 72  lumn );..  /* Cr
14680 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74  eate the automat
14690 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 4b  ic index */.  pK
146a0 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyinfo = sqlite3
146b0 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61  IndexKeyinfo(pPa
146c0 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 61 73  rse, pIdx);.  as
146d0 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49  sert( pLevel->iI
146e0 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c  dxCur>=0 );.  pL
146f0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
14700 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
14710 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14720 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75  Op4(v, OP_OpenAu
14730 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d  toindex, pLevel-
14740 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f 6c 75 6d  >iIdxCur, nColum
14750 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  n+1, 0,.        
14760 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
14770 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20 50 34 5f  r*)pKeyinfo, P4_
14780 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
14790 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
147a0 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54  (v, "for %s", pT
147b0 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  able->zName));..
147c0 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75    /* Fill the au
147d0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69  tomatic index wi
147e0 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  th content */.  
147f0 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
14800 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
14810 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c  P_Rewind, pLevel
14820 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 72 65  ->iTabCur);.  re
14830 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
14840 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
14850 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65  se);.  sqlite3Ge
14860 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
14870 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65  Parse, pIdx, pLe
14880 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65  vel->iTabCur, re
14890 67 52 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b 0a  gRecord, 1, 0);.
148a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
148b0 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
148c0 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
148d0 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
148e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
148f0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
14900 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
14910 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14920 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
14930 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
14940 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20  r, addrTop+1);. 
14950 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
14960 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53  geP5(v, SQLITE_S
14970 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
14980 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  DEX);.  sqlite3V
14990 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
149a0 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
149b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
149c0 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
149d0 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d  rd);.  .  /* Jum
149e0 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70  p here when skip
149f0 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
14a00 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  ization */.  sql
14a10 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
14a20 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d  (v, addrInit);.}
14a30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
14a40 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
14a50 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64  _INDEX */..#ifnd
14a60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
14a70 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
14a80 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70  * Allocate and p
14a90 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74  opulate an sqlit
14aa0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
14ab0 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74  ructure. It is t
14ac0 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
14ad0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
14ae0 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
14af0 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74  y release the st
14b00 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61  ructure.** by pa
14b10 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65  ssing the pointe
14b20 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
14b30 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73  is function to s
14b40 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
14b50 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
14b60 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c  _index_info *all
14b70 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a  ocateIndexInfo(.
14b80 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
14b90 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
14ba0 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72  pWC,.  struct Sr
14bb0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
14bc0 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ,.  ExprList *pO
14bd0 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20  rderBy.){.  int 
14be0 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72  i, j;.  int nTer
14bf0 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  m;.  struct sqli
14c00 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
14c10 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
14c20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
14c30 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a  _index_orderby *
14c40 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73  pIdxOrderBy;.  s
14c50 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
14c60 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
14c70 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
14c80 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
14c90 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
14ca0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
14cb0 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
14cc0 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
14cd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73  e number of poss
14ce0 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  ible WHERE claus
14cf0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
14d00 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  ferring.  ** to 
14d10 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62  this virtual tab
14d20 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54  le */.  for(i=nT
14d30 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  erm=0, pTerm=pWC
14d40 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
14d50 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
14d60 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
14d70 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
14d80 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
14d90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
14da0 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
14db0 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
14dc0 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
14dd0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
14de0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
14df0 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
14e00 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
14e10 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
14e20 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69  _ISNULL );.    i
14e30 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
14e40 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
14e50 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
14e60 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
14e70 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
14e80 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
14e90 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a    nTerm++;.  }..
14ea0 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45    /* If the ORDE
14eb0 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74  R BY clause cont
14ec0 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e  ains only column
14ed0 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
14ee0 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74   .  ** virtual t
14ef0 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61  able then alloca
14f00 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
14f10 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f   aOrderBy part o
14f20 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  f.  ** the sqlit
14f30 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
14f40 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  ructure..  */.  
14f50 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
14f60 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
14f70 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64      int n = pOrd
14f80 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
14f90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
14fa0 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
14fb0 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
14fc0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
14fd0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
14fe0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
14ff0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
15000 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
15010 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
15020 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20   if( i==n){.    
15030 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a    nOrderBy = n;.
15040 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15050 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
15060 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
15070 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20  structure.  */. 
15080 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69   pIdxInfo = sqli
15090 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
150a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
150b0 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20  of(*pIdxInfo).  
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 20 2b 20 28 73 69 7a 65           + (size
150e0 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20  of(*pIdxCons) + 
150f0 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29  sizeof(*pUsage))
15100 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  *nTerm.         
15110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15120 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78    + sizeof(*pIdx
15130 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42  OrderBy)*nOrderB
15140 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  y );.  if( pIdxI
15150 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  nfo==0 ){.    sq
15160 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15170 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65  arse, "out of me
15180 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75  mory");.    retu
15190 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
151a0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
151b0 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73  tructure.  The s
151c0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
151d0 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  o structure cont
151e0 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66  ains.  ** many f
151f0 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64  ields that are d
15200 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20  eclared "const" 
15210 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74  to prevent xBest
15220 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20  Index from.  ** 
15230 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20  changing them.  
15240 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  We have to do so
15250 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67  me funky casting
15260 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a   in order to.  *
15270 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f  * initialize tho
15280 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a  se fields..  */.
15290 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74    pIdxCons = (st
152a0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
152b0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26  ex_constraint*)&
152c0 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70  pIdxInfo[1];.  p
152d0 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74  IdxOrderBy = (st
152e0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
152f0 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64  ex_orderby*)&pId
15300 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20  xCons[nTerm];.  
15310 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74  pUsage = (struct
15320 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
15330 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
15340 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f  )&pIdxOrderBy[nO
15350 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74  rderBy];.  *(int
15360 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  *)&pIdxInfo->nCo
15370 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d  nstraint = nTerm
15380 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
15390 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
153a0 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73   nOrderBy;.  *(s
153b0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
153c0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
153d0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
153e0 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f  straint = pIdxCo
153f0 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  ns;.  *(struct s
15400 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
15410 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f  erby**)&pIdxInfo
15420 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64  ->aOrderBy = pId
15430 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  xOrderBy;.  *(st
15440 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
15450 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
15460 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  age**)&pIdxInfo-
15470 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
15480 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154c0 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a         pUsage;..
154d0 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
154e0 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
154f0 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
15500 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f  erm++){.    u8 o
15510 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  p;.    if( pTerm
15520 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
15530 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
15540 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
15550 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
15560 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
15570 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
15580 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
15590 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
155a0 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
155b0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
155c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
155d0 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
155e0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
155f0 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
15600 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
15610 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
15620 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
15630 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
15640 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
15650 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e  Column = pTerm->
15660 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
15670 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54    pIdxCons[j].iT
15680 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20  ermOffset = i;. 
15690 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72     op = (u8)pTer
156a0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
156b0 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f  O_ALL;.    if( o
156c0 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20  p==WO_IN ) op = 
156d0 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64 78 43  WO_EQ;.    pIdxC
156e0 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a  ons[j].op = op;.
156f0 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
15700 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20  t assignment in 
15710 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e  the previous lin
15720 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e  e is possible on
15730 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a  ly because.    *
15740 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51  * the WO_ and SQ
15750 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
15760 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65  RAINT_ codes are
15770 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65   identical.  The
15780 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
15790 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79  g asserts verify
157a0 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
157b0 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51     assert( WO_EQ
157c0 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
157d0 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a  ONSTRAINT_EQ );.
157e0 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c      assert( WO_L
157f0 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
15800 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b  CONSTRAINT_LT );
15810 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
15820 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LE==SQLITE_INDEX
15830 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29  _CONSTRAINT_LE )
15840 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
15850 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GT==SQLITE_INDE
15860 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20  X_CONSTRAINT_GT 
15870 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
15880 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GE==SQLITE_IND
15890 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45  EX_CONSTRAINT_GE
158a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
158b0 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45  WO_MATCH==SQLITE
158c0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
158d0 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61  T_MATCH );.    a
158e0 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
158f0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e  perator & (WO_IN
15900 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_EQ|WO_LT|WO_
15910 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  LE|WO_GT|WO_GE|W
15920 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20  O_MATCH) );.    
15930 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  j++;.  }.  for(i
15940 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
15950 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
15960 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
15970 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
15980 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
15990 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72  .iColumn = pExpr
159a0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  ->iColumn;.    p
159b0 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  IdxOrderBy[i].de
159c0 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  sc = pOrderBy->a
159d0 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
159e0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64   }..  return pId
159f0 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xInfo;.}../*.** 
15a00 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74  The table object
15a10 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73 65   reference passe
15a20 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
15a30 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
15a40 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
15a50 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76 69  t represent a vi
15a60 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69  rtual table. Thi
15a70 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b  s function invok
15a80 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  es the xBestInde
15a90 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66  x().** method of
15aa0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
15ab0 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c 69  le with the sqli
15ac0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f  te3_index_info o
15ad0 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f  bject that.** co
15ae0 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20 33 72  mes in as the 3r
15af0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
15b00 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
15b10 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
15b20 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73  ccurs, pParse is
15b30 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
15b40 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
15b50 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65   and a.** non-ze
15b60 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  ro value is retu
15b70 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
15b80 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 61   0 is returned a
15b90 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
15ba0 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c   part of the sql
15bb0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
15bc0 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65 66  structure is lef
15bd0 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a  t populated..**.
15be0 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
15bf0 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  t an error is re
15c00 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68  turned, it is th
15c10 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
15c20 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
15c30 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
15c40 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69  free p->idxStr i
15c50 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  f p->needToFreeI
15c60 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a  dxStr indicates.
15c70 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ** that this is 
15c80 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
15c90 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73 74  tic int vtabBest
15ca0 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
15cb0 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
15cc0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  , sqlite3_index_
15cd0 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69  info *p){.  sqli
15ce0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
15cf0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  = sqlite3GetVTab
15d00 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  le(pParse->db, p
15d10 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69  Tab)->pVtab;.  i
15d20 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
15d30 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  .  TRACE_IDX_INP
15d40 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70  UTS(p);.  rc = p
15d50 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  Vtab->pModule->x
15d60 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c  BestIndex(pVtab,
15d70 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58   p);.  TRACE_IDX
15d80 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20  _OUTPUTS(p);..  
15d90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15da0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
15db0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
15dc0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
15dd0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15de0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
15df0 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d  f( !pVtab->zErrM
15e00 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  sg ){.      sqli
15e10 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15e20 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  se, "%s", sqlite
15e30 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20  3ErrStr(rc));.  
15e40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
15e50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15e60 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74  Parse, "%s", pVt
15e70 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
15e80 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
15e90 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45  3_free(pVtab->zE
15ea0 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d  rrMsg);.  pVtab-
15eb0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20  >zErrMsg = 0;.. 
15ec0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
15ed0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
15ee0 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43  {.    if( !p->aC
15ef0 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
15f00 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74  ble && p->aConst
15f10 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
15f20 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20  gvIndex>0 ){.   
15f30 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15f40 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
15f50 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a        "table %s:
15f60 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74 75   xBestIndex retu
15f70 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20  rned an invalid 
15f80 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  plan", pTab->zNa
15f90 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  me);.    }.  }..
15fa0 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
15fb0 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20  >nErr;.}.#endif 
15fc0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
15fd0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
15fe0 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23 69 66 64 65  ABLE) */...#ifde
15ff0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
16000 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
16010 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f  mate the locatio
16020 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61  n of a particula
16030 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20  r key among all 
16040 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e  keys in an.** in
16050 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20  dex.  Store the 
16060 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74  results in aStat
16070 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
16080 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20  **    aStat[0]  
16090 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
160a0 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61  of rows less tha
160b0 6e 20 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74  n pVal.**    aSt
160c0 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20  at[1]      Est. 
160d0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65  number of rows e
160e0 71 75 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a  qual to pVal.**.
160f0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
16100 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
16110 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
16120 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50  ereKeyStats(.  P
16130 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
16140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
16150 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
16160 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
16170 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
16180 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63     /* Index to c
16190 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f  onsider domain o
161a0 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  f */.  UnpackedR
161b0 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20  ecord *pRec,    
161c0 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20     /* Vector of 
161d0 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64  values to consid
161e0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e  er */.  int roun
161f0 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  dUp,            
16200 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20      /* Round up 
16210 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20  if true.  Round 
16220 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f  down if false */
16230 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61  .  tRowcnt *aSta
16240 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
16250 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69  * OUT: stats wri
16260 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
16270 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61    IndexSample *a
16280 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61  Sample = pIdx->a
16290 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 3b  Sample;.  int i;
162a0 0a 20 20 69 6e 74 20 69 73 45 71 20 3d 20 30 3b  .  int isEq = 0;
162b0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
162c0 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b  Idx->nSample; i+
162d0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 20  +){.    int res 
162e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
162f0 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
16300 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
16310 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20  [i].p, pRec);.  
16320 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 7b 0a    if( res>=0 ){.
16330 20 20 20 20 20 20 69 73 45 71 20 3d 20 28 72 65        isEq = (re
16340 73 3d 3d 30 29 3b 0a 20 20 20 20 20 20 62 72 65  s==0);.      bre
16350 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
16360 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
16370 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73  t, aSample[i] is
16380 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c   the first sampl
16390 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
163a0 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65  r than.  ** or e
163b0 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f  qual to pVal.  O
163c0 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  r if i==pIdx->nS
163d0 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20  ample, then all 
163e0 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65 73 73  samples are less
163f0 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e  .  ** than pVal.
16400 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d    If aSample[i]=
16410 3d 70 56 61 6c 2c 20 74 68 65 6e 20 69 73 45 71  =pVal, then isEq
16420 3d 3d 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ==1..  */.  if( 
16430 69 73 45 71 20 29 7b 0a 20 20 20 20 61 73 73 65  isEq ){.    asse
16440 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  rt( i<pIdx->nSam
16450 70 6c 65 20 29 3b 0a 20 20 20 20 61 53 74 61 74  ple );.    aStat
16460 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [0] = aSample[i]
16470 2e 61 6e 4c 74 5b 30 5d 3b 0a 20 20 20 20 61 53  .anLt[0];.    aS
16480 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65  tat[1] = aSample
16490 5b 69 5d 2e 61 6e 45 71 5b 30 5d 3b 0a 20 20 7d  [i].anEq[0];.  }
164a0 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e  else{.    tRowcn
164b0 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72  t iLower, iUpper
164c0 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20  , iGap;.    if( 
164d0 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  i==0 ){.      iL
164e0 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ower = 0;.      
164f0 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65  iUpper = aSample
16500 5b 30 5d 2e 61 6e 4c 74 5b 30 5d 3b 0a 20 20 20  [0].anLt[0];.   
16510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55   }else{.      iU
16520 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e  pper = i>=pIdx->
16530 6e 53 61 6d 70 6c 65 20 3f 20 70 49 64 78 2d 3e  nSample ? pIdx->
16540 61 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 61 53  aiRowEst[0] : aS
16550 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 30 5d  ample[i].anLt[0]
16560 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  ;.      iLower =
16570 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e   aSample[i-1].an
16580 45 71 5b 30 5d 20 2b 20 61 53 61 6d 70 6c 65 5b  Eq[0] + aSample[
16590 69 2d 31 5d 2e 61 6e 4c 74 5b 30 5d 3b 0a 20 20  i-1].anLt[0];.  
165a0 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d    }.    aStat[1]
165b0 20 3d 20 70 49 64 78 2d 3e 61 76 67 45 71 3b 0a   = pIdx->avgEq;.
165c0 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d      if( iLower>=
165d0 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  iUpper ){.      
165e0 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65  iGap = 0;.    }e
165f0 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
16600 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
16610 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
16620 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20   roundUp ){.    
16630 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32    iGap = (iGap*2
16640 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )/3;.    }else{.
16650 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61        iGap = iGa
16660 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  p/3;.    }.    a
16670 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72  Stat[0] = iLower
16680 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 20 20 72   + iGap;.  }.  r
16690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
166a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
166b0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
166c0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
166d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
166e0 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
166f0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
16700 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73  that will be vis
16710 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e  ited.** by scann
16720 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72  ing an index for
16730 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75   a range of valu
16740 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61  es. The range ma
16750 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a  y have an upper.
16760 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65  ** bound, a lowe
16770 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68  r bound, or both
16780 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  . The WHERE clau
16790 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65  se terms that se
167a0 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61  t the upper.** a
167b0 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20  nd lower bounds 
167c0 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20  are represented 
167d0 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  by pLower and pU
167e0 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c  pper respectivel
167f0 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  y. For.** exampl
16800 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  e, assuming that
16810 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74   index p is on t
16820 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  1(a):.**.**   ..
16830 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
16840 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
16850 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
16860 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f            |_____
16870 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20  |   |_____|.**  
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16890 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
168a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
168b0 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20          pLower  
168c0 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49    pUpper.**.** I
168d0 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  f either of the 
168e0 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62  upper or lower b
168f0 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73  ound is not pres
16900 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69  ent, then NULL i
16910 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70  s passed in.** p
16920 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72  lace of the corr
16930 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54  esponding WhereT
16940 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  erm..**.** The n
16950 45 71 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  Eq parameter is 
16960 70 61 73 73 65 64 20 74 68 65 20 69 6e 64 65 78  passed the index
16970 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f   of the index co
16980 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20  lumn subject to 
16990 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63 6f 6e  the.** range con
169a0 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75  straint. Or, equ
169b0 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e  ivalently, the n
169c0 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74  umber of equalit
169d0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  y constraints.**
169e0 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68   optimized by th
169f0 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78  e proposed index
16a00 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70   scan. For examp
16a10 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 6e 64  le, assuming ind
16a20 65 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20 74 31  ex p is.** on t1
16a30 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20  (a, b), and the 
16a40 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  SQL query is:.**
16a50 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
16a60 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e  1 WHERE a = ? AN
16a70 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20  D b > ? AND b < 
16a80 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ? ....**.** then
16a90 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70   nEq should be p
16aa0 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20  assed the value 
16ab0 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20  1 (as the range 
16ac0 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d  restricted colum
16ad0 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68 65 20  n,.** b, is the 
16ae0 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73 74  second left-most
16af0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
16b00 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68  ndex). Or, if th
16b10 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a  e query is:.**.*
16b20 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
16b30 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
16b40 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  a < ? ....**.** 
16b50 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20  then nEq should 
16b60 62 65 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a  be passed 0..**.
16b70 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
16b80 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 74 65  value is an inte
16b90 67 65 72 20 64 69 76 69 73 6f 72 20 74 6f 20 72  ger divisor to r
16ba0 65 64 75 63 65 20 74 68 65 20 65 73 74 69 6d 61  educe the estima
16bb0 74 65 64 0a 2a 2a 20 73 65 61 72 63 68 20 73 70  ted.** search sp
16bc0 61 63 65 2e 20 20 41 20 72 65 74 75 72 6e 20 76  ace.  A return v
16bd0 61 6c 75 65 20 6f 66 20 31 20 6d 65 61 6e 73 20  alue of 1 means 
16be0 74 68 61 74 20 72 61 6e 67 65 20 63 6f 6e 73 74  that range const
16bf0 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 6e 6f  raints are.** no
16c00 20 68 65 6c 70 20 61 74 20 61 6c 6c 2e 20 20 41   help at all.  A
16c10 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
16c20 20 32 20 6d 65 61 6e 73 20 72 61 6e 67 65 20 63   2 means range c
16c30 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 2a  onstraints are.*
16c40 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 72 65  * expected to re
16c50 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20  duce the search 
16c60 73 70 61 63 65 20 62 79 20 68 61 6c 66 2e 20 20  space by half.  
16c70 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 2e 2e 0a  And so forth....
16c80 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73  **.** In the abs
16c90 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73  ence of sqlite_s
16ca0 74 61 74 33 20 41 4e 41 4c 59 5a 45 20 64 61 74  tat3 ANALYZE dat
16cb0 61 2c 20 65 61 63 68 20 72 61 6e 67 65 20 69 6e  a, each range in
16cc0 65 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75  equality.** redu
16cd0 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73  ces the search s
16ce0 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f 72  pace by a factor
16cf0 20 6f 66 20 34 2e 20 20 48 65 6e 63 65 20 61 20   of 4.  Hence a 
16d00 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e  single constrain
16d10 74 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c  t (x>?).** resul
16d20 74 73 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f  ts in a return o
16d30 66 20 34 20 61 6e 64 20 61 20 72 61 6e 67 65 20  f 4 and a range 
16d40 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 20  constraint (x>? 
16d50 41 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c 74 73  AND x<?) results
16d60 0a 2a 2a 20 69 6e 20 61 20 72 65 74 75 72 6e 20  .** in a return 
16d70 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74 61 74 69 63  of 16..*/.static
16d80 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53   int whereRangeS
16d90 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
16da0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
16db0 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
16dc0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
16dd0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
16de0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
16df0 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72 6d  der,.  WhereTerm
16e00 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c   *pLower,   /* L
16e10 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  ower bound on th
16e20 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e  e range. ex: "x>
16e30 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55  123" Might be NU
16e40 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  LL */.  WhereTer
16e50 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20  m *pUpper,   /* 
16e60 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Upper bound on t
16e70 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
16e80 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e  <455" Might be N
16e90 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ULL */.  WhereCo
16ea0 73 74 20 2a 70 52 61 6e 67 65 44 69 76 20 2f 2a  st *pRangeDiv /*
16eb0 20 4f 55 54 3a 20 52 65 64 75 63 65 20 73 65 61   OUT: Reduce sea
16ec0 72 63 68 20 73 70 61 63 65 20 62 79 20 74 68 69  rch space by thi
16ed0 73 20 64 69 76 69 73 6f 72 20 2a 2f 0a 29 7b 0a  s divisor */.){.
16ee0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16ef0 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51  E_OK;..#ifdef SQ
16f00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
16f10 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  4.  Index *p = p
16f20 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
16f30 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
16f40 20 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c   int nEq = pBuil
16f50 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
16f60 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 6e  ee.nEq;..  if( n
16f70 45 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52  Eq==pBuilder->nR
16f80 65 63 56 61 6c 69 64 20 0a 20 20 20 26 26 20 70  ecValid .   && p
16f90 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 26 26  ->nSample .   &&
16fa0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
16fb0 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
16fc0 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29 20 0a   SQLITE_Stat3) .
16fd0 20 20 29 7b 0a 20 20 20 20 55 6e 70 61 63 6b 65    ){.    Unpacke
16fe0 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
16ff0 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
17000 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77      tRowcnt iLow
17010 65 72 20 3d 20 30 3b 0a 20 20 20 20 74 52 6f 77  er = 0;.    tRow
17020 63 6e 74 20 69 55 70 70 65 72 20 3d 20 70 2d 3e  cnt iUpper = p->
17030 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
17040 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20   tRowcnt a[2];. 
17050 20 20 20 75 38 20 61 66 66 20 3d 20 70 2d 3e 70     u8 aff = p->p
17060 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
17070 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69  iColumn[0]].affi
17080 6e 69 74 79 3b 0a 20 20 20 20 69 66 28 20 70 4c  nity;.    if( pL
17090 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e  ower ){.      in
170a0 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20  t bOk;          
170b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
170c0 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78  e if value is ex
170d0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
170e0 70 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  pr */.      Expr
170f0 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72   *pExpr = pLower
17100 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
17110 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
17120 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
17130 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  r & (WO_GT|WO_GE
17140 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ))!=0 );.      r
17150 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
17160 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50  ProbeSetValue(pP
17170 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20  arse, p, &pRec, 
17180 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c  pExpr, aff, nEq,
17190 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 69 66   &bOk);.      if
171a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
171b0 26 26 20 62 4f 6b 0a 20 20 20 20 20 20 20 26 26  && bOk.       &&
171c0 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
171d0 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
171e0 30 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0, a)==SQLITE_OK
171f0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
17200 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b    iLower = a[0];
17210 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c  .        if( (pL
17220 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
17230 26 20 57 4f 5f 47 54 29 21 3d 30 20 29 20 69 4c  & WO_GT)!=0 ) iL
17240 6f 77 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20  ower += a[1];.  
17250 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
17260 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17270 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20  K && pUpper ){. 
17280 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172a0 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
172b0 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
172c0 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
172d0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
172e0 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
172f0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73  pRight;.      as
17300 73 65 72 74 28 20 28 70 55 70 70 65 72 2d 3e 65  sert( (pUpper->e
17310 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
17320 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a  T|WO_LE))!=0 );.
17330 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17340 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
17350 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
17360 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66  &pRec, pExpr, af
17370 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20  f, nEq, &bOk);. 
17380 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
17390 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 0a 20 20  ITE_OK && bOk.  
173a0 20 20 20 20 20 26 26 20 77 68 65 72 65 4b 65 79       && whereKey
173b0 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
173c0 20 70 52 65 63 2c 20 31 2c 20 61 29 3d 3d 53 51   pRec, 1, a)==SQ
173d0 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29 7b  LITE_OK.      ){
173e0 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
173f0 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  = a[0];.        
17400 69 66 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70  if( (pUpper->eOp
17410 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21  erator & WO_LE)!
17420 3d 30 20 29 20 69 55 70 70 65 72 20 2b 3d 20 61  =0 ) iUpper += a
17430 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [1];.      }.   
17440 20 7d 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d   }.    pBuilder-
17450 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20  >pRec = pRec;.  
17460 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17470 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 57 68 65  _OK ){.      Whe
17480 72 65 43 6f 73 74 20 69 42 61 73 65 20 3d 20 77  reCost iBase = w
17490 68 65 72 65 43 6f 73 74 28 70 2d 3e 61 69 52 6f  hereCost(p->aiRo
174a0 77 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20  wEst[0]);.      
174b0 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65  if( iUpper>iLowe
174c0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 42 61  r ){.        iBa
174d0 73 65 20 2d 3d 20 77 68 65 72 65 43 6f 73 74 28  se -= whereCost(
174e0 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29  iUpper - iLower)
174f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17500 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 4d  if( pBuilder->nM
17510 61 78 52 6f 77 63 6e 74 20 26 26 20 69 42 61 73  axRowcnt && iBas
17520 65 3c 70 42 75 69 6c 64 65 72 2d 3e 6e 4d 61 78  e<pBuilder->nMax
17530 52 6f 77 63 6e 74 20 29 7b 0a 20 20 20 20 20 20  Rowcnt ){.      
17540 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 70    *pRangeDiv = p
17550 42 75 69 6c 64 65 72 2d 3e 6e 4d 61 78 52 6f 77  Builder->nMaxRow
17560 63 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  cnt;.      }else
17570 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 61 6e 67  {.        *pRang
17580 65 44 69 76 20 3d 20 69 42 61 73 65 3b 0a 20 20  eDiv = iBase;.  
17590 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52      }.      WHER
175a0 45 54 52 41 43 45 28 30 78 31 30 30 2c 20 28 22  ETRACE(0x100, ("
175b0 72 61 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f  range scan regio
175c0 6e 73 3a 20 25 75 2e 2e 25 75 20 20 64 69 76 3d  ns: %u..%u  div=
175d0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
175e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175f0 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33  (u32)iLower, (u3
17600 32 29 69 55 70 70 65 72 2c 20 2a 70 52 61 6e 67  2)iUpper, *pRang
17610 65 44 69 76 29 29 3b 0a 20 20 20 20 20 20 72 65  eDiv));.      re
17620 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17630 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
17640 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
17650 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e  ER(pParse);.  UN
17660 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
17670 42 75 69 6c 64 65 72 29 3b 0a 23 65 6e 64 69 66  Builder);.#endif
17680 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65  .  assert( pLowe
17690 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20  r || pUpper );. 
176a0 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 30 3b   *pRangeDiv = 0;
176b0 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 45  .  /* TUNING:  E
176c0 61 63 68 20 69 6e 65 71 75 61 6c 69 74 79 20 63  ach inequality c
176d0 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63 65  onstraint reduce
176e0 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
176f0 63 65 20 34 2d 66 6f 6c 64 2e 0a 20 20 2a 2a 20  ce 4-fold..  ** 
17700 41 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  A BETWEEN operat
17710 6f 72 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 72  or, therefore, r
17720 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
17730 68 20 73 70 61 63 65 20 31 36 2d 66 6f 6c 64 20  h space 16-fold 
17740 2a 2f 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20  */.  if( pLower 
17750 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c  && (pLower->wtFl
17760 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
17770 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 61  )==0 ){.    *pRa
17780 6e 67 65 44 69 76 20 2b 3d 20 32 30 3b 20 20 61  ngeDiv += 20;  a
17790 73 73 65 72 74 28 20 32 30 3d 3d 77 68 65 72 65  ssert( 20==where
177a0 43 6f 73 74 28 34 29 20 29 3b 0a 20 20 7d 0a 20  Cost(4) );.  }. 
177b0 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20   if( pUpper ){. 
177c0 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 2b 3d     *pRangeDiv +=
177d0 20 32 30 3b 20 20 61 73 73 65 72 74 28 20 32 30   20;  assert( 20
177e0 3d 3d 77 68 65 72 65 43 6f 73 74 28 34 29 20 29  ==whereCost(4) )
177f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17800 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
17810 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
17820 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
17830 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
17840 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
17850 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
17860 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
17870 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
17880 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
17890 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
178a0 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
178b0 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
178c0 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
178d0 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
178e0 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
178f0 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
17900 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
17910 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
17920 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
17930 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
17940 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
17950 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
17960 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
17970 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
17980 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
17990 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
179a0 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
179b0 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
179c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
179d0 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
179e0 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
179f0 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
17a00 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
17a10 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
17a20 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
17a30 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
17a40 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
17a50 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
17a60 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
17a70 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
17a80 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
17a90 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
17aa0 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
17ab0 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
17ac0 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
17ad0 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
17ae0 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
17af0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
17b00 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
17b10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
17b20 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
17b30 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
17b40 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
17b50 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
17b60 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
17b70 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
17b80 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
17b90 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
17ba0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
17bb0 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20  ssion for VALUE 
17bc0 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63  in the x=VALUE c
17bd0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74  onstraint */.  t
17be0 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
17bf0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
17c00 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
17c10 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
17c20 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42  .  Index *p = pB
17c30 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
17c40 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
17c50 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64  int nEq = pBuild
17c60 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
17c70 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65  e.nEq;.  Unpacke
17c80 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
17c90 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
17ca0 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20    u8 aff;       
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
17cc0 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a  olumn affinity *
17cd0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17cf0 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
17d00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52  urn code */.  tR
17d10 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20  owcnt a[2];     
17d20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69          /* Stati
17d30 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62  stics */.  int b
17d40 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  Ok;..  assert( n
17d50 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  Eq>=1 );.  asser
17d60 74 28 20 6e 45 71 3c 3d 28 70 2d 3e 6e 43 6f 6c  t( nEq<=(p->nCol
17d70 75 6d 6e 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  umn+1) );.  asse
17d80 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d  rt( p->aSample!=
17d90 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
17da0 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
17db0 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
17dc0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71  r->nRecValid<nEq
17dd0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c   );..  /* If val
17de0 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69  ues are not avai
17df0 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69  lable for all fi
17e00 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65  elds of the inde
17e10 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20  x to the left.  
17e20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20  ** of this one, 
17e30 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20  no estimate can 
17e40 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20  be made. Return 
17e50 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e  SQLITE_NOTFOUND.
17e60 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64   */.  if( pBuild
17e70 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e  er->nRecValid<(n
17e80 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  Eq-1) ){.    ret
17e90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
17ea0 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  UND;.  }..  if( 
17eb0 6e 45 71 3e 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  nEq>p->nColumn )
17ec0 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31  {.    *pnRow = 1
17ed0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17ee0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61  ITE_OK;.  }..  a
17ef0 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  ff = p->pTable->
17f00 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e  aCol[p->aiColumn
17f10 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  [0]].affinity;. 
17f20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
17f30 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
17f40 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
17f50 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
17f60 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42  q-1, &bOk);.  pB
17f70 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70  uilder->pRec = p
17f80 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  Rec;.  if( rc!=S
17f90 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
17fa0 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d  n rc;.  if( bOk=
17fb0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
17fc0 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70  TE_NOTFOUND;.  p
17fd0 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
17fe0 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 72 63 20  id = nEq;..  rc 
17ff0 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  = whereKeyStats(
18000 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
18010 20 30 2c 20 61 29 3b 0a 20 20 69 66 28 20 72 63   0, a);.  if( rc
18020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18030 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
18040 31 30 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73  100,("equality s
18050 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c  can regions: %d\
18060 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b  n", (int)a[1]));
18070 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b  .    *pnRow = a[
18080 31 5d 3b 0a 20 20 20 20 69 66 28 20 70 42 75 69  1];.    if( pBui
18090 6c 64 65 72 2d 3e 6e 4d 61 78 52 6f 77 63 6e 74  lder->nMaxRowcnt
180a0 20 26 26 20 2a 70 6e 52 6f 77 3e 70 42 75 69 6c   && *pnRow>pBuil
180b0 64 65 72 2d 3e 6e 4d 61 78 52 6f 77 63 6e 74 20  der->nMaxRowcnt 
180c0 29 7b 0a 20 20 20 20 20 20 2a 70 6e 52 6f 77 20  ){.      *pnRow 
180d0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 4d 61 78  = pBuilder->nMax
180e0 52 6f 77 63 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  Rowcnt;.    }.  
180f0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
18100 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
18110 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
18120 45 5f 53 54 41 54 34 29 20 2a 2f 0a 0a 23 69 66  E_STAT4) */..#if
18130 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18140 45 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  E_STAT4./*.** Es
18150 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
18160 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
18170 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
18180 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49  based on.** an I
18190 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65  N constraint whe
181a0 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  re the right-han
181b0 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
181c0 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
181d0 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  a list of values
181e0 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
181f0 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20 78  *        WHERE x
18200 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a   IN (1,2,3,4).**
18210 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73  .** Write the es
18220 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e  timated row coun
18230 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e  t into *pnRow an
18240 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
18250 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c  OK. .** If unabl
18260 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74  e to make an est
18270 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e  imate, leave *pn
18280 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  Row unchanged an
18290 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
182a0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  zero..**.** This
182b0 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69   routine can fai
182c0 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c  l if it is unabl
182d0 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c  e to load a coll
182e0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a  ating sequence.*
182f0 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  * required for s
18300 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e  tring comparison
18310 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74  , or if unable t
18320 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
18330 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63  y.** for a UTF c
18340 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72  onversion requir
18350 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ed for compariso
18360 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73  n.  The error is
18370 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
18380 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
18390 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
183a0 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74  t whereInScanEst
183b0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
183c0 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
183d0 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
183e0 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
183f0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
18400 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
18410 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
18420 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c  ,     /* The val
18430 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52  ue list on the R
18440 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c  HS of "x IN (v1,
18450 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20  v2,v3,...)" */. 
18460 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20   tRowcnt *pnRow 
18470 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
18480 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65  he revised row e
18490 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a  stimate here */.
184a0 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
184b0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
184c0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
184d0 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20    int nRecValid 
184e0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  = pBuilder->nRec
184f0 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  Valid;.  int rc 
18500 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
18510 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20   /* Subfunction 
18520 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
18530 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20   tRowcnt nEst;  
18540 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18550 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61  er of rows for a
18560 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a   single term */.
18570 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73    tRowcnt nRowEs
18580 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77  t = 0;    /* New
18590 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
185a0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
185b0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
185d0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
185e0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53  .  assert( p->aS
185f0 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f  ample!=0 );.  fo
18600 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
18610 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d  E_OK && i<pList-
18620 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
18630 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f    nEst = p->aiRo
18640 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20  wEst[0];.    rc 
18650 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  = whereEqualScan
18660 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
18670 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  lder, pList->a[i
18680 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b  ].pExpr, &nEst);
18690 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20  .    nRowEst += 
186a0 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69 6c 64  nEst;.    pBuild
186b0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
186c0 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a  nRecValid;.  }..
186d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
186e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
186f0 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69 52 6f  RowEst > p->aiRo
18700 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45 73  wEst[0] ) nRowEs
18710 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  t = p->aiRowEst[
18720 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 42 75 69  0];.    if( pBui
18730 6c 64 65 72 2d 3e 6e 4d 61 78 52 6f 77 63 6e 74  lder->nMaxRowcnt
18740 20 26 26 20 6e 52 6f 77 45 73 74 3e 70 42 75 69   && nRowEst>pBui
18750 6c 64 65 72 2d 3e 6e 4d 61 78 52 6f 77 63 6e 74  lder->nMaxRowcnt
18760 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 52 6f 77   ){.      *pnRow
18770 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 4d 61   = pBuilder->nMa
18780 78 52 6f 77 63 6e 74 3b 0a 20 20 20 20 7d 65 6c  xRowcnt;.    }el
18790 73 65 7b 0a 20 20 20 20 20 20 2a 70 6e 52 6f 77  se{.      *pnRow
187a0 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20   = nRowEst;.    
187b0 7d 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  }.    WHERETRACE
187c0 28 30 78 31 30 30 2c 28 22 49 4e 20 72 6f 77 20  (0x100,("IN row 
187d0 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 67  estimate: est=%g
187e0 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a  \n", nRowEst));.
187f0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
18800 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
18810 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a  d==nRecValid );.
18820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
18830 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
18840 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
18850 54 41 54 34 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TAT4) */../*.** 
18860 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69  Disable a term i
18870 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
18880 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20  se.  Except, do 
18890 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20  not disable the 
188a0 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f  term.** if it co
188b0 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55  ntrols a LEFT OU
188c0 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20  TER JOIN and it 
188d0 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
188e0 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f  e in the ON.** o
188f0 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
18900 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a  f that join..**.
18910 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
18920 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69  term t2.z='ok' i
18930 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
18940 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  queries:.**.**  
18950 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (1)  SELECT * F
18960 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
18970 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
18980 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27   WHERE t2.z='ok'
18990 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43  .**   (2)  SELEC
189a0 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
189b0 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
189c0 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
189d0 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45  ok'.**   (3)  SE
189e0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
189f0 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32  t2 WHERE t1.a=t2
18a00 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
18a10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d  .**.** The t2.z=
18a20 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64  'ok' is disabled
18a30 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62   in the in (2) b
18a40 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e  ecause it origin
18a50 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  ates.** in the O
18a60 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74  N clause.  The t
18a70 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20  erm is disabled 
18a80 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69  in (3) because i
18a90 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a  t is not part.**
18aa0 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
18ab0 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20   JOIN.  In (1), 
18ac0 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  the term is not 
18ad0 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  disabled..**.** 
18ae0 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d  Disabling a term
18af0 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72   causes that ter
18b00 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74  m to not be test
18b10 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ed in the inner 
18b20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a  loop.** of the j
18b30 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  oin.  Disabling 
18b40 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
18b50 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20  on.  When terms 
18b60 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
18b70 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20   by indices, we 
18b80 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20  disable them to 
18b90 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e  prevent redundan
18ba0 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69  t tests in the i
18bb0 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57  nner.** loop.  W
18bc0 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20  e would get the 
18bd0 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20  correct results 
18be0 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20  if nothing were 
18bf0 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a  ever disabled,.*
18c00 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68  * but joins migh
18c10 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
18c20 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63  lower.  The tric
18c30 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20  k is to disable 
18c40 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65  as much.** as we
18c50 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73   can without dis
18c60 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e  abling too much.
18c70 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64    If we disabled
18c80 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65   in (1), we'd ge
18c90 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61  t.** the wrong a
18ca0 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b  nswer.  See tick
18cb0 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74  et #813..*/.stat
18cc0 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54  ic void disableT
18cd0 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a  erm(WhereLevel *
18ce0 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72  pLevel, WhereTer
18cf0 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28  m *pTerm){.  if(
18d00 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20   pTerm.      && 
18d10 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
18d20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30  & TERM_CODED)==0
18d30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65  .      && (pLeve
18d40 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20  l->iLeftJoin==0 
18d50 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
18d60 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
18d70 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20   EP_FromJoin)). 
18d80 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77   ){.    pTerm->w
18d90 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
18da0 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54  ODED;.    if( pT
18db0 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20  erm->iParent>=0 
18dc0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
18dd0 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54  rm *pOther = &pT
18de0 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
18df0 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
18e00 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72     if( (--pOther
18e10 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a  ->nChild)==0 ){.
18e20 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
18e30 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68  erm(pLevel, pOth
18e40 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
18e50 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
18e60 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e  Code an OP_Affin
18e70 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70  ity opcode to ap
18e80 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  ply the column a
18e90 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a  ffinity string z
18ea0 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20  Aff.** to the n 
18eb0 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
18ec0 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a  ng at base. .**.
18ed0 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ** As an optimiz
18ee0 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46  ation, SQLITE_AF
18ef0 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28  F_NONE entries (
18f00 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73  which are no-ops
18f10 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69  ) at the.** begi
18f20 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66  nning and end of
18f30 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65   zAff are ignore
18f40 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69  d.  If all entri
18f50 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a  es in zAff are.*
18f60 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
18f70 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20  E, then no code 
18f80 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a  gets generated..
18f90 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18fa0 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e  ne makes its own
18fb0 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f   copy of zAff so
18fc0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
18fd0 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d   is free.** to m
18fe0 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72  odify zAff after
18ff0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
19000 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
19010 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41   void codeApplyA
19020 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
19030 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c  Parse, int base,
19040 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41   int n, char *zA
19050 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ff){.  Vdbe *v =
19060 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
19070 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b    if( zAff==0 ){
19080 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
19090 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
190a0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
190b0 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
190c0 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  t( v!=0 );..  /*
190d0 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64   Adjust base and
190e0 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20   n to skip over 
190f0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
19100 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62  entries at the b
19110 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e  eginning.  ** an
19120 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66  d end of the aff
19130 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20  inity string..  
19140 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  */.  while( n>0 
19150 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49  && zAff[0]==SQLI
19160 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
19170 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65     n--;.    base
19180 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a  ++;.    zAff++;.
19190 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31    }.  while( n>1
191a0 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53   && zAff[n-1]==S
191b0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
191c0 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a  {.    n--;.  }..
191d0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50    /* Code the OP
191e0 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
191f0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
19200 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f  thing left to do
19210 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29  . */.  if( n>0 )
19220 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
19230 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66  eAddOp2(v, OP_Af
19240 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29  finity, base, n)
19250 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19260 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
19270 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73   zAff, n);.    s
19280 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
19290 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
192a0 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  arse, base, n);.
192b0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
192c0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
192d0 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
192e0 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
192f0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
19300 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
19310 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
19320 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
19330 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
19340 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
19350 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
19360 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
19370 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
19380 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20  aint is left in 
19390 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a  register iReg..*
193a0 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74  *.** For a const
193b0 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  raint of the for
193c0 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78  m X=expr, the ex
193d0 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
193e0 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a  uated and its.**
193f0 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20   result is left 
19400 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46  on the stack.  F
19410 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
19420 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20  f the form X IN 
19430 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f  (...).** this ro
19440 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
19450 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69  loop that will i
19460 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20  terate over all 
19470 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a  values of X..*/.
19480 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45  static int codeE
19490 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
194a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
194b0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
194c0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
194d0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
194e0 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
194f0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
19500 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
19510 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
19520 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c  pLevel, /* The l
19530 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d  evel of the FROM
19540 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77   clause we are w
19550 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69  orking on */.  i
19560 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20  nt iEq,         
19570 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
19580 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  he equality term
19590 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76   within this lev
195a0 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  el */.  int bRev
195b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
195c0 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d  rue for reverse-
195d0 6f 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69  order IN operati
195e0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
195f0 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  rget         /* 
19600 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65  Attempt to leave
19610 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73   results in this
19620 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
19630 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
19640 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62  rm->pExpr;.  Vdb
19650 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
19660 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67  Vdbe;.  int iReg
19670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19680 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
19690 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  olding results *
196a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61  /..  assert( iTa
196b0 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20  rget>0 );.  if( 
196c0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b  pX->op==TK_EQ ){
196d0 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
196e0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
196f0 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  t(pParse, pX->pR
19700 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
19710 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e    }else if( pX->
19720 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
19730 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
19740 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  get;.    sqlite3
19750 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19760 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b  _Null, 0, iReg);
19770 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19780 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
19790 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65  }else{.    int e
197a0 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54  Type;.    int iT
197b0 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  ab;.    struct I
197c0 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
197d0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
197e0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
197f0 70 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  p;..    if( (pLo
19800 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
19810 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
19820 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c  )==0.      && pL
19830 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
19840 64 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20  dex!=0.      && 
19850 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
19860 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
19870 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20  r[iEq].    ){.  
19880 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45      testcase( iE
19890 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  q==0 );.      te
198a0 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a  stcase( bRev );.
198b0 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52        bRev = !bR
198c0 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ev;.    }.    as
198d0 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
198e0 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20  _IN );.    iReg 
198f0 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65  = iTarget;.    e
19900 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
19910 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
19920 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 66  , pX, 0);.    if
19930 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
19940 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a  X_INDEX_DESC ){.
19950 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19960 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52  bRev );.      bR
19970 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20  ev = !bRev;.    
19980 7d 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d  }.    iTab = pX-
19990 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c  >iTable;.    sql
199a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
199b0 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
199c0 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54   : OP_Rewind, iT
199d0 61 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  ab, 0);.    asse
199e0 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
199f0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
19a00 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20  I_OR)==0 );.    
19a10 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
19a20 3d 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b  = WHERE_IN_ABLE;
19a30 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
19a40 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a  >u.in.nIn==0 ){.
19a50 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64        pLevel->ad
19a60 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56  drNxt = sqlite3V
19a70 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
19a80 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
19a90 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20  l->u.in.nIn++;. 
19aa0 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
19ab0 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20  aInLoop =.      
19ac0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
19ad0 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e  cOrFree(pParse->
19ae0 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  db, pLevel->u.in
19af0 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20  .aInLoop,.      
19b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b10 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70          sizeof(p
19b20 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
19b30 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e  oop[0])*pLevel->
19b40 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70  u.in.nIn);.    p
19b50 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  In = pLevel->u.i
19b60 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69  n.aInLoop;.    i
19b70 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20  f( pIn ){.      
19b80 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75  pIn += pLevel->u
19b90 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20  .in.nIn - 1;.   
19ba0 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69     pIn->iCur = i
19bb0 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65  Tab;.      if( e
19bc0 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
19bd0 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OWID ){.        
19be0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d  pIn->addrInTop =
19bf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19c00 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
19c10 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20  iTab, iReg);.   
19c20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19c30 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70    pIn->addrInTop
19c40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19c50 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
19c60 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67  n, iTab, 0, iReg
19c70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19c80 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
19c90 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
19ca0 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
19cb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19cc0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
19cd0 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65  l, iReg);.    }e
19ce0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
19cf0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b  l->u.in.nIn = 0;
19d00 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
19d10 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28  }.  disableTerm(
19d20 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
19d30 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
19d40 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
19d50 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
19d60 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20  evaluate all == 
19d70 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
19d80 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64  ts for an.** ind
19d90 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ex..**.** For ex
19da0 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20  ample, consider 
19db0 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64  table t1(a,b,c,d
19dc0 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78  ,e,f) with index
19dd0 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53   i1(a,b,c)..** S
19de0 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45  uppose the WHERE
19df0 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a   clause is this:
19e00 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20    a==5 AND b IN 
19e10 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20  (1,2,3) AND c>5 
19e20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20  AND c<10.** The 
19e30 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e  index has as man
19e40 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c  y as three equal
19e50 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
19e60 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20   but in this.** 
19e70 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69  example, the thi
19e80 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20  rd "c" value is 
19e90 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
19ea0 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20  So only two .** 
19eb0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
19ec0 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75  coded.  This rou
19ed0 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  tine will genera
19ee0 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
19ef0 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20  ate.** a==5 and 
19f00 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54  b IN (1,2,3).  T
19f10 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
19f20 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69  s for a and b wi
19f30 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20  ll be stored.** 
19f40 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  in consecutive r
19f50 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
19f60 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
19f70 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73 20  rst register is 
19f80 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
19f90 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
19fa0 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75  bove nEq==2.  Bu
19fb0 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  t this subroutin
19fc0 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
19fd0 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20  value.** of nEq 
19fe0 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66  including 0.  If
19ff0 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f   nEq==0, this ro
1a000 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20  utine is nearly 
1a010 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20  a no-op..** The 
1a020 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f  only thing it do
1a030 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74  es is allocate t
1a040 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  he pLevel->iMem 
1a050 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a  memory cell and.
1a060 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61  ** compute the a
1a070 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a  ffinity string..
1a080 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a090 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61  ne always alloca
1a0a0 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  tes at least one
1a0b0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
1a0c0 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20   returns.** the 
1a0d0 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65  index of that me
1a0e0 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63  mory cell. The c
1a0f0 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c  ode that.** call
1a100 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
1a110 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d  ill use that mem
1a120 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72  ory cell to stor
1a130 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f  e the terminatio
1a140 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f  n.** key value o
1a150 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20  f the loop.  If 
1a160 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f  one or more IN o
1a170 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c  perators appear,
1a180 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
1a190 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20  utine allocates 
1a1a0 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45  an additional nE
1a1b0 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  q memory cells f
1a1c0 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75  or internal.** u
1a1d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  se..**.** Before
1a1e0 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41   returning, *pzA
1a1f0 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ff is set to poi
1a200 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
1a210 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63  ontaining a.** c
1a220 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
1a230 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
1a240 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  g of the index a
1a250 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a  llocated using.*
1a260 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  * sqlite3DbMallo
1a270 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74  c(). Except, ent
1a280 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79  ries in the copy
1a290 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61   of the string a
1a2a0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
1a2b0 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  h equality const
1a2c0 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20  raints that use 
1a2d0 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72  NONE affinity ar
1a2e0 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49  e set to.** SQLI
1a2f0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69  TE_AFF_NONE. Thi
1a300 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74  s is to deal wit
1a310 68 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68  h SQL such as th
1a320 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
1a330 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
1a340 45 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d  E t1(a TEXT PRIM
1a350 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20  ARY KEY, b);.** 
1a360 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
1a370 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57  M t1 AS t2, t1 W
1a380 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62  HERE t1.a = t2.b
1a390 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ;.**.** In the e
1a3a0 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68  xample above, th
1a3b0 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29  e index on t1(a)
1a3c0 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69   has TEXT affini
1a3d0 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a  ty. But since.**
1a3e0 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
1a3f0 73 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61  side of the equa
1a400 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
1a410 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20  (t2.b) has NONE 
1a420 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20  affinity,.** no 
1a430 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c  conversion shoul
1a440 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62  d be attempted b
1a450 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32  efore using a t2
1a460 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74  .b value as part
1a470 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20   of.** a key to 
1a480 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78  search the index
1a490 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73  . Hence the firs
1a4a0 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65  t byte in the re
1a4b0 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a  turned affinity.
1a4c0 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69  ** string in thi
1a4d0 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20  s example would 
1a4e0 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
1a4f0 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74  _AFF_NONE..*/.st
1a500 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c  atic int codeAll
1a510 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20  EqualityTerms(. 
1a520 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1a530 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1a540 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
1a550 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1a560 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65  l,   /* Which ne
1a570 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
1a580 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64   FROM we are cod
1a590 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ing */.  int bRe
1a5a0 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  v,             /
1a5b0 2a 20 52 65 76 65 72 73 65 20 74 68 65 20 6f 72  * Reverse the or
1a5c0 64 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  der of IN operat
1a5d0 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ors */.  int nEx
1a5e0 74 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f  traReg,        /
1a5f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
1a600 61 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  a registers to a
1a610 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
1a620 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20  r **pzAff       
1a630 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74     /* OUT: Set t
1a640 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e  o point to affin
1a650 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
1a660 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20  .  int nEq;     
1a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a680 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
1a690 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
1a6a0 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a  raints to code *
1a6b0 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
1a6c0 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
1a6d0 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65    /* The vm unde
1a6e0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1a6f0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
1a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a710 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62    /* The index b
1a720 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68  eing used for th
1a730 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65  is loop */.  Whe
1a740 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
1a750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1a760 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e  single constrain
1a770 74 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72  t term */.  Wher
1a780 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
1a790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a7a0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1a7b0 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  t */.  int j;   
1a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7d0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1a7e0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nter */.  int re
1a7f0 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
1a800 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
1a810 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
1a820 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20  t nReg;         
1a830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a840 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65  umber of registe
1a850 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
1a860 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20  /.  char *zAff; 
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a880 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74    /* Affinity st
1a890 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a  ring to return *
1a8a0 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64  /..  /* This mod
1a8b0 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ule is only call
1a8c0 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e  ed on query plan
1a8d0 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e  s that use an in
1a8e0 64 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20  dex. */.  pLoop 
1a8f0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
1a900 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f  ;.  assert( (pLo
1a910 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1a920 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1a930 29 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20  )==0 );.  nEq = 
1a940 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
1a950 45 71 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f  Eq;.  pIdx = pLo
1a960 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1a970 65 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ex;.  assert( pI
1a980 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46  dx!=0 );..  /* F
1a990 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
1a9a0 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  ny memory cells 
1a9b0 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65  we will need the
1a9c0 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e  n allocate them.
1a9d0 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20  .  */.  regBase 
1a9e0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
1a9f0 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f   1;.  nReg = pLo
1aa00 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
1aa10 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70  + nExtraReg;.  p
1aa20 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1aa30 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73  Reg;..  zAff = s
1aa40 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
1aa50 50 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74  Parse->db, sqlit
1aa60 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53  e3IndexAffinityS
1aa70 74 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20  tr(v, pIdx));.  
1aa80 69 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20  if( !zAff ){.   
1aa90 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1aaa0 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
1aab0 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74   }..  /* Evaluat
1aac0 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63  e the equality c
1aad0 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a  onstraints.  */.
1aae0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
1aaf0 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a  nColumn>=nEq );.
1ab00 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71    for(j=0; j<nEq
1ab10 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; j++){.    int 
1ab20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  r1;.    pTerm = 
1ab30 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
1ab40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1ab50 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a  erm!=0 );.    /*
1ab60 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
1ab70 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20  rue for indices 
1ab80 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63  with redundant c
1ab90 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20  olumns. .    ** 
1aba0 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58  Ex: CREATE INDEX
1abb0 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29   i1 ON t1(a,b,a)
1abc0 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
1abd0 74 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44  t1 WHERE a=0 AND
1abe0 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73   b=0; */.    tes
1abf0 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77  tcase( (pTerm->w
1ac00 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
1ac10 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  DED)!=0 );.    t
1ac20 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1ac30 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1ac40 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 72 31  IRTUAL );.    r1
1ac50 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
1ac60 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
1ac70 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52  m, pLevel, j, bR
1ac80 65 76 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a  ev, regBase+j);.
1ac90 20 20 20 20 69 66 28 20 72 31 21 3d 72 65 67 42      if( r1!=regB
1aca0 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69  ase+j ){.      i
1acb0 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20  f( nReg==1 ){.  
1acc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1acd0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1ace0 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20  se, regBase);.  
1acf0 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20        regBase = 
1ad00 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r1;.      }else{
1ad10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ad20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ad30 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42  _SCopy, r1, regB
1ad40 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a  ase+j);.      }.
1ad50 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
1ad60 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
1ad70 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
1ad80 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1ad90 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1ada0 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
1adb0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1adc0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53  perator & (WO_IS
1add0 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20  NULL|WO_IN))==0 
1ade0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1adf0 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70  Right = pTerm->p
1ae00 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
1ae10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1ae20 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c  odeIsNullJump(v,
1ae30 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
1ae40 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  +j, pLevel->addr
1ae50 42 72 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Brk);.      if( 
1ae60 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  zAff ){.        
1ae70 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
1ae80 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68  reAffinity(pRigh
1ae90 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c  t, zAff[j])==SQL
1aea0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
1aeb0 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a            zAff[j
1aec0 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
1aed0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
1aee0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1aef0 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
1af00 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67  inityChange(pRig
1af10 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a  ht, zAff[j]) ){.
1af20 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a            zAff[j
1af30 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
1af40 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
1af50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1af60 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66  .  *pzAff = zAff
1af70 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61  ;.  return regBa
1af80 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  se;.}..#ifndef S
1af90 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
1afa0 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  IN./*.** This ro
1afb0 75 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65  utine is a helpe
1afc0 72 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64  r for explainInd
1afd0 65 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a  exRange() below.
1afe0 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73  **.** pStr holds
1aff0 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20   the text of an 
1b000 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1b010 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20  we are building 
1b020 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61  up one term.** a
1b030 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20  t a time.  This 
1b040 72 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e  routine adds a n
1b050 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65  ew term to the e
1b060 6e 64 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  nd of the expres
1b070 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61  sion..** Terms a
1b080 72 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20  re separated by 
1b090 41 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20 22  AND so add the "
1b0a0 41 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73 65  AND" text for se
1b0b0 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75  cond and subsequ
1b0c0 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c  ent.** terms onl
1b0d0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
1b0e0 64 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54  d explainAppendT
1b0f0 65 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20  erm(.  StrAccum 
1b100 2a 70 53 74 72 2c 20 20 20 20 20 20 20 20 20 20  *pStr,          
1b110 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65     /* The text e
1b120 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20  xpression being 
1b130 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69  built */.  int i
1b140 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
1b150 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1b160 6f 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46  of this term.  F
1b170 69 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a  irst is zero */.
1b180 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1b190 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a  olumn,        /*
1b1a0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
1b1b0 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  umn */.  const c
1b1c0 68 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20  har *zOp        
1b1d0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b1e0 74 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  the operator */.
1b1f0 29 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29  ){.  if( iTerm )
1b200 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1b210 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41  Append(pStr, " A
1b220 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69  ND ", 5);.  sqli
1b230 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1b240 64 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c  d(pStr, zColumn,
1b250 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53   -1);.  sqlite3S
1b260 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
1b270 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73  tr, zOp, 1);.  s
1b280 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
1b290 70 65 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20  pend(pStr, "?", 
1b2a0 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  1);.}../*.** Arg
1b2b0 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73  ument pLevel des
1b2c0 63 72 69 62 65 73 20 61 20 73 74 72 61 74 65 67  cribes a strateg
1b2d0 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  y for scanning t
1b2e0 61 62 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20  able pTab. This 
1b2f0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
1b300 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
1b310 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
1b320 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64  r containing a d
1b330 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66  escription.** of
1b340 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 74   the subset of t
1b350 61 62 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65  able rows scanne
1b360 64 20 62 79 20 74 68 65 20 73 74 72 61 74 65 67  d by the strateg
1b370 79 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66  y in the form of
1b380 20 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65   an.** SQL expre
1b390 73 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c  ssion. Or, if al
1b3a0 6c 20 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e  l rows are scann
1b3b0 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ed, NULL is retu
1b3c0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  rned..**.** For 
1b3d0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1b3e0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53  query:.**.**   S
1b3f0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1b400 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e  WHERE a=1 AND b>
1b410 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20  2;.**.** is run 
1b420 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20  and there is an 
1b430 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c  index on (a, b),
1b440 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
1b450 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a  ion returns a.**
1b460 20 73 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20   string similar 
1b470 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f  to:.**.**   "a=?
1b480 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20   AND b>?".**.** 
1b490 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69  The returned poi
1b4a0 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d  nter points to m
1b4b0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
1b4c0 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  rom sqlite3DbMal
1b4d0 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20  loc()..** It is 
1b4e0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1b4f0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1b500 20 74 6f 20 66 72 65 65 20 74 68 65 20 62 75 66   to free the buf
1b510 66 65 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a  fer when it is.*
1b520 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75  * no longer requ
1b530 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
1b540 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64  char *explainInd
1b550 65 78 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20  exRange(sqlite3 
1b560 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
1b570 70 4c 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54  pLoop, Table *pT
1b580 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ab){.  Index *pI
1b590 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  ndex = pLoop->u.
1b5a0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
1b5b0 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  int nEq = pLoop-
1b5c0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
1b5d0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75  int i, j;.  Colu
1b5e0 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d  mn *aCol = pTab-
1b5f0 3e 61 43 6f 6c 3b 0a 20 20 69 6e 74 20 2a 61 69  >aCol;.  int *ai
1b600 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
1b610 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72  >aiColumn;.  Str
1b620 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66  Accum txt;..  if
1b630 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f  ( nEq==0 && (pLo
1b640 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
1b650 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57  HERE_BTM_LIMIT|W
1b660 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29  HERE_TOP_LIMIT))
1b670 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1b680 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
1b690 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
1b6a0 74 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54  txt, 0, 0, SQLIT
1b6b0 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20  E_MAX_LENGTH);. 
1b6c0 20 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20   txt.db = db;.  
1b6d0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
1b6e0 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 28 22  ppend(&txt, " ("
1b6f0 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 2);.  for(i=0;
1b700 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20   i<nEq; i++){.  
1b710 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
1b720 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 61 43 6f  erm(&txt, i, aCo
1b730 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a  l[aiColumn[i]].z
1b740 4e 61 6d 65 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a  Name, "=");.  }.
1b750 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20  .  j = i;.  if( 
1b760 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57  pLoop->wsFlags&W
1b770 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
1b780 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
1b790 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  (j==pIndex->nCol
1b7a0 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20  umn ) ? "rowid" 
1b7b0 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  : aCol[aiColumn[
1b7c0 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65  j]].zName;.    e
1b7d0 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
1b7e0 28 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22  (&txt, i++, z, "
1b7f0 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  >");.  }.  if( p
1b800 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
1b810 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
1b820 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
1b830 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  j==pIndex->nColu
1b840 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a  mn ) ? "rowid" :
1b850 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a   aCol[aiColumn[j
1b860 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78  ]].zName;.    ex
1b870 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1b880 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22 29  &txt, i, z, "<")
1b890 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
1b8a0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74  trAccumAppend(&t
1b8b0 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 72  xt, ")", 1);.  r
1b8c0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72  eturn sqlite3Str
1b8d0 41 63 63 75 6d 46 69 6e 69 73 68 28 26 74 78 74  AccumFinish(&txt
1b8e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1b8f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1b900 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72  o-op unless curr
1b910 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
1b920 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52   an EXPLAIN QUER
1b930 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e  Y PLAN.** comman
1b940 64 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 20  d. If the query 
1b950 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69  being compiled i
1b960 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45  s an EXPLAIN QUE
1b970 52 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c  RY PLAN, a singl
1b980 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 61  e.** record is a
1b990 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  dded to the outp
1b9a0 75 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  ut to describe t
1b9b0 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74  he table scan st
1b9c0 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c  rategy in .** pL
1b9d0 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
1b9e0 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53  void explainOneS
1b9f0 63 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  can(.  Parse *pP
1ba00 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
1ba10 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
1ba20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
1ba30 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ba50 54 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73 20  Table list this 
1ba60 6c 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20 2a  loop refers to *
1ba70 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
1ba80 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  pLevel,         
1ba90 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77      /* Scan to w
1baa0 72 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20  rite OP_Explain 
1bab0 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20  opcode for */.  
1bac0 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65  /* Value for "le
1baf0 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f  vel" column of o
1bb00 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69  utput */.  int i
1bb10 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
1bb20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1bb30 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20 63  lue for "from" c
1bb40 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20  olumn of output 
1bb50 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
1bb60 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
1bb70 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
1bb80 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
1bb90 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29  hereBegin() */.)
1bba0 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
1bbb0 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
1bbc0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1bbd0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
1bbe0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
1bbf0 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
1bc00 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1bc10 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
1bc20 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74 72   VM being constr
1bc30 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c  ucted */.    sql
1bc40 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1bc50 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61  e->db;     /* Da
1bc60 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
1bc70 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b  .    char *zMsg;
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc90 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64     /* Text to ad
1bca0 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20  d to EQP output 
1bcb0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d  */.    int iId =
1bcc0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
1bcd0 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20 69  Id;  /* Select i
1bce0 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74  d (left-most out
1bcf0 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20  put column) */. 
1bd00 20 20 20 69 6e 74 20 69 73 53 65 61 72 63 68 3b     int isSearch;
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 53   /* True for a S
1bd30 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f 72  EARCH. False for
1bd40 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68   SCAN. */.    Wh
1bd50 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20  ereLoop *pLoop; 
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bd70 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57  he controlling W
1bd80 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
1bd90 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73  */.    u32 flags
1bda0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bdb0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68       /* Flags th
1bdc0 61 74 20 64 65 73 63 72 69 62 65 20 74 68 69 73  at describe this
1bdd0 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 70 4c   loop */..    pL
1bde0 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
1bdf0 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73 20  Loop;.    flags 
1be00 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  = pLoop->wsFlags
1be10 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
1be20 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29  &WHERE_MULTI_OR)
1be30 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26   || (wctrlFlags&
1be40 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
1be50 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  NLY) ) return;..
1be60 20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28      isSearch = (
1be70 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d  flags&(WHERE_BTM
1be80 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
1be90 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20  _LIMIT))!=0.    
1bea0 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61          || ((fla
1beb0 67 73 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c  gs&WHERE_VIRTUAL
1bec0 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c  TABLE)==0 && (pL
1bed0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1bee0 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  >0)).           
1bef0 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26   || (wctrlFlags&
1bf00 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  (WHERE_ORDERBY_M
1bf10 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59  IN|WHERE_ORDERBY
1bf20 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73  _MAX));..    zMs
1bf30 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
1bf40 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73 53  tf(db, "%s", isS
1bf50 65 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a 22  earch?"SEARCH":"
1bf60 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28 20  SCAN");.    if( 
1bf70 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
1bf80 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
1bf90 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1bfa0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55 42  b, zMsg, "%s SUB
1bfb0 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c  QUERY %d", zMsg,
1bfc0 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
1bfd0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1bfe0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1bff0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1c000 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20 25  Msg, "%s TABLE %
1c010 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d  s", zMsg, pItem-
1c020 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a  >zName);.    }..
1c030 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
1c040 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 7a  Alias ){.      z
1c050 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1c060 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1c070 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67  "%s AS %s", zMsg
1c080 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
1c090 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c0a0 28 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  (flags & (WHERE_
1c0b0 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54 55 41  IPK|WHERE_VIRTUA
1c0c0 4c 54 41 42 4c 45 29 29 3d 3d 30 0a 20 20 20 20  LTABLE))==0.    
1c0d0 20 26 26 20 41 4c 57 41 59 53 28 70 4c 6f 6f 70   && ALWAYS(pLoop
1c0e0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1c0f0 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
1c100 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
1c110 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e   explainIndexRan
1c120 67 65 28 64 62 2c 20 70 4c 6f 6f 70 2c 20 70 49  ge(db, pLoop, pI
1c130 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
1c140 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1c150 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1c160 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
1c170 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52    ((flags & WHER
1c180 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 3f 20  E_AUTO_INDEX) ? 
1c190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c1a0 20 20 20 20 22 25 73 20 55 53 49 4e 47 20 41 55      "%s USING AU
1c1b0 54 4f 4d 41 54 49 43 20 25 73 49 4e 44 45 58 25  TOMATIC %sINDEX%
1c1c0 2e 30 73 25 73 22 20 3a 0a 20 20 20 20 20 20 20  .0s%s" :.       
1c1d0 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 20              "%s 
1c1e0 55 53 49 4e 47 20 25 73 49 4e 44 45 58 20 25 73  USING %sINDEX %s
1c1f0 25 73 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20  %s"), .         
1c200 20 20 20 20 20 20 7a 4d 73 67 2c 20 28 28 66 6c        zMsg, ((fl
1c210 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
1c220 4f 4e 4c 59 29 20 3f 20 22 43 4f 56 45 52 49 4e  ONLY) ? "COVERIN
1c230 47 20 22 20 3a 20 22 22 29 2c 0a 20 20 20 20 20  G " : ""),.     
1c240 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
1c250 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
1c260 3e 7a 4e 61 6d 65 2c 20 7a 57 68 65 72 65 29 3b  >zName, zWhere);
1c270 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
1c280 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29  Free(db, zWhere)
1c290 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1c2a0 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  (flags & WHERE_I
1c2b0 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67 73  PK)!=0 && (flags
1c2c0 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41   & WHERE_CONSTRA
1c2d0 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  INT)!=0 ){.     
1c2e0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1c2f0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1c300 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45  , "%s USING INTE
1c310 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
1c320 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20  , zMsg);..      
1c330 69 66 28 20 66 6c 61 67 73 26 28 57 48 45 52 45  if( flags&(WHERE
1c340 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
1c350 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20  _COLUMN_IN) ){. 
1c360 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
1c370 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1c380 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
1c390 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id=?)", zMsg);. 
1c3a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
1c3b0 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48  flags&WHERE_BOTH
1c3c0 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42  _LIMIT)==WHERE_B
1c3d0 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  OTH_LIMIT ){.   
1c3e0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1c3f0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1c400 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
1c410 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22  >? AND rowid<?)"
1c420 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
1c430 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57  else if( flags&W
1c440 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
1c450 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
1c460 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1c470 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
1c480 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29  rowid>?)", zMsg)
1c490 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1c4a0 28 20 41 4c 57 41 59 53 28 66 6c 61 67 73 26 57  ( ALWAYS(flags&W
1c4b0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20  HERE_TOP_LIMIT) 
1c4c0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
1c4d0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1c4e0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1c4f0 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67  (rowid<?)", zMsg
1c500 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1c510 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c520 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1c530 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 28  E.    else if( (
1c540 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  flags & WHERE_VI
1c550 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
1c560 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
1c570 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1c580 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52  b, zMsg, "%s VIR
1c590 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58  TUAL TABLE INDEX
1c5a0 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20   %d:%s", zMsg,. 
1c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5c0 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
1c5d0 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e  dxNum, pLoop->u.
1c5e0 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20  vtab.idxStr);.  
1c5f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7a    }.#endif.    z
1c600 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1c610 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1c620 22 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  "%s", zMsg);.   
1c630 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c640 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
1c650 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69  , iId, iLevel, i
1c660 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  From, zMsg, P4_D
1c670 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  YNAMIC);.  }.}.#
1c680 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78  else.# define ex
1c690 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76  plainOneScan(u,v
1c6a0 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  ,w,x,y,z).#endif
1c6b0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1c6c0 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a  EXPLAIN */.../*.
1c6d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1c6e0 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
1c6f0 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20  f the iLevel-th 
1c700 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52  loop in the WHER
1c710 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c  E clause.** impl
1c720 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72  ementation descr
1c730 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a  ibed by pWInfo..
1c740 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
1c750 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  k codeOneLoopSta
1c760 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  rt(.  WhereInfo 
1c770 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f  *pWInfo,   /* Co
1c780 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69  mplete informati
1c790 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48 45  on about the WHE
1c7a0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
1c7b0 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
1c7c0 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76      /* Which lev
1c7d0 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b  el of pWInfo->a[
1c7e0 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65  ] should be code
1c7f0 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  d */.  Bitmask n
1c800 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57  otReady     /* W
1c810 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20  hich tables are 
1c820 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
1c830 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
1c840 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
1c850 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1c860 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
1c870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c880 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
1c890 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
1c8a0 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20    int addrNxt;  
1c8b0 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
1c8c0 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69  to jump to conti
1c8d0 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
1c8e0 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69  t IN case */.  i
1c8f0 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20  nt omitTable;   
1c900 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
1c910 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20  e use the index 
1c920 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  only */.  int bR
1c930 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
1c940 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65  * True if we nee
1c950 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  d to scan in rev
1c960 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  erse order */.  
1c970 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1c980 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72  el;  /* The wher
1c990 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f  e level to be co
1c9a0 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ded */.  WhereLo
1c9b0 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a  op *pLoop;    /*
1c9c0 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   The WhereLoop o
1c9d0 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64 65  bject being code
1c9e0 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  d */.  WhereClau
1c9f0 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44  se *pWC;    /* D
1ca00 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ecomposition of 
1ca10 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52 45  the entire WHERE
1ca20 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
1ca30 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ca50 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  A WHERE clause t
1ca60 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  erm */.  Parse *
1ca70 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
1ca80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1ca90 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1caa0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
1cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cac0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1cad0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  nection */.  Vdb
1cae0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cb00 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 6d  The prepared stm
1cb10 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
1cb20 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63  tions */.  struc
1cb30 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1cb40 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52  pTabItem;  /* FR
1cb50 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62  OM clause term b
1cb60 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
1cb70 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20  int addrBrk;    
1cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb90 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
1cba0 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
1cbb0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
1cbc0 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20  ddrCont;        
1cbd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
1cbe0 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
1cbf0 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 63 79  nue with next cy
1cc00 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f  cle */.  int iRo
1cc10 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20  widReg = 0;     
1cc20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73     /* Rowid is s
1cc30 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72 65  tored in this re
1cc40 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a  gister, if not z
1cc50 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ero */.  int iRe
1cc60 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20  leaseReg = 0;   
1cc70 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73     /* Temp regis
1cc80 74 65 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f  ter to free befo
1cc90 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a  re returning */.
1cca0 20 20 42 69 74 6d 61 73 6b 20 6e 65 77 4e 6f 74    Bitmask newNot
1ccb0 52 65 61 64 79 3b 20 20 20 20 20 20 2f 2a 20 52  Ready;      /* R
1ccc0 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
1ccd0 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
1cce0 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d  o->pParse;.  v =
1ccf0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1cd00 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d    pWC = &pWInfo-
1cd10 3e 73 57 43 3b 0a 20 20 64 62 20 3d 20 70 50 61  >sWC;.  db = pPa
1cd20 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4c 65 76 65  rse->db;.  pLeve
1cd30 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
1cd40 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20  Level];.  pLoop 
1cd50 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
1cd60 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26  ;.  pTabItem = &
1cd70 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1cd80 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
1cd90 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61  m];.  iCur = pTa
1cda0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
1cdb0 20 20 62 52 65 76 20 3d 20 28 70 57 49 6e 66 6f    bRev = (pWInfo
1cdc0 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65  ->revMask>>iLeve
1cdd0 6c 29 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c  l)&1;.  omitTabl
1cde0 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  e = (pLoop->wsFl
1cdf0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
1ce00 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20  ONLY)!=0 .      
1ce10 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
1ce20 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
1ce30 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29  ERE_FORCE_TABLE)
1ce40 3d 3d 30 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  ==0;.  VdbeNoopC
1ce50 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
1ce60 6e 20 4a 6f 69 6e 20 4c 6f 6f 70 20 25 64 22 2c  n Join Loop %d",
1ce70 20 69 4c 65 76 65 6c 29 29 3b 0a 0a 20 20 2f 2a   iLevel));..  /*
1ce80 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66   Create labels f
1ce90 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61  or the "break" a
1cea0 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e  nd "continue" in
1ceb0 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20  structions.  ** 
1cec0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1ced0 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61  loop.  Jump to a
1cee0 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20  ddrBrk to break 
1cef0 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20  out of a loop.. 
1cf00 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74   ** Jump to cont
1cf10 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65   to go immediate
1cf20 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  ly to the next i
1cf30 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  teration of the.
1cf40 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a    ** loop..  **.
1cf50 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20    ** When there 
1cf60 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  is an IN operato
1cf70 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20  r, we also have 
1cf80 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  a "addrNxt" labe
1cf90 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e  l that.  ** mean
1cfa0 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  s to continue wi
1cfb0 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76  th the next IN v
1cfc0 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  alue combination
1cfd0 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65  .  When.  ** the
1cfe0 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65  re are no IN ope
1cff0 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f  rators in the co
1d000 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22  nstraints, the "
1d010 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20  addrNxt" label. 
1d020 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
1d030 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20  as "addrBrk"..  
1d040 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70  */.  addrBrk = p
1d050 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d  Level->addrBrk =
1d060 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
1d070 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1d080 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64  keLabel(v);.  ad
1d090 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d  drCont = pLevel-
1d0a0 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69  >addrCont = sqli
1d0b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1d0c0 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (v);..  /* If th
1d0d0 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20  is is the right 
1d0e0 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
1d0f0 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f  OUTER JOIN, allo
1d100 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e  cate and.  ** in
1d110 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72  itialize a memor
1d120 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f  y cell that reco
1d130 72 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c  rds if this tabl
1d140 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20  e matches any.  
1d150 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65  ** row of the le
1d160 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ft table of the 
1d170 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  join..  */.  if(
1d180 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30   pLevel->iFrom>0
1d190 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d   && (pTabItem[0]
1d1a0 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
1d1b0 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  EFT)!=0 ){.    p
1d1c0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1d1d0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1d1e0 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
1d1f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1d200 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65  nteger, 0, pLeve
1d210 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
1d220 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1d230 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f  v, "init LEFT JO
1d240 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67  IN no-match flag
1d250 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  "));.  }..  /* S
1d260 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61  pecial case of a
1d270 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62   FROM clause sub
1d280 71 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65  query implemente
1d290 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e  d as a co-routin
1d2a0 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 49  e */.  if( pTabI
1d2b0 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  tem->viaCoroutin
1d2c0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  e ){.    int reg
1d2d0 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d  Yield = pTabItem
1d2e0 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20  ->regReturn;.   
1d2f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d300 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1d310 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72  , pTabItem->addr
1d320 46 69 6c 6c 53 75 62 2d 31 2c 20 72 65 67 59 69  FillSub-1, regYi
1d330 65 6c 64 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  eld);.    pLevel
1d340 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56  ->p2 =  sqlite3V
1d350 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
1d360 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29  Yield, regYield)
1d370 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
1d380 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20  t((v, "next row 
1d390 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65 20 25 73  of co-routine %s
1d3a0 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  ", pTabItem->pTa
1d3b0 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
1d3c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d3d0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 59  2(v, OP_If, regY
1d3e0 69 65 6c 64 2b 31 2c 20 61 64 64 72 42 72 6b 29  ield+1, addrBrk)
1d3f0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1d400 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65   = OP_Goto;.  }e
1d410 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse..#ifndef SQL
1d420 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1d430 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c  TABLE.  if(  (pL
1d440 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1d450 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1d460 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  E)!=0 ){.    /* 
1d470 43 61 73 65 20 31 3a 20 20 54 68 65 20 74 61 62  Case 1:  The tab
1d480 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d  le is a virtual-
1d490 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20  table.  Use the 
1d4a0 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78  VFilter and VNex
1d4b0 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
1d4c0 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20    to access the 
1d4d0 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
1d4e0 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20   int iReg;   /* 
1d4f0 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P3 Value for OP_
1d500 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69  VFilter */.    i
1d510 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b  nt addrNotFound;
1d520 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
1d530 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c  aint = pLoop->nL
1d540 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Term;..    sqlit
1d550 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1d560 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65  pParse);.    iRe
1d570 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1d580 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1d590 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a  nConstraint+2);.
1d5a0 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64      addrNotFound
1d5b0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
1d5c0 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  rk;.    for(j=0;
1d5d0 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   j<nConstraint; 
1d5e0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  j++){.      int 
1d5f0 69 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a  iTarget = iReg+j
1d600 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  +2;.      pTerm 
1d610 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1d620 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  j];.      if( pT
1d630 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  erm==0 ) continu
1d640 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  e;.      if( pTe
1d650 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1d660 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20  WO_IN ){.       
1d670 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
1d680 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
1d690 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76   pLevel, j, bRev
1d6a0 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , iTarget);.    
1d6b0 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64      addrNotFound
1d6c0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
1d6d0 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
1d6e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d6f0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1d700 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
1d710 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b  Right, iTarget);
1d720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d740 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1d750 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  er, pLoop->u.vta
1d760 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b  b.idxNum, iReg);
1d770 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d780 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1d790 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  eger, nConstrain
1d7a0 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20  t, iReg+1);.    
1d7b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d7c0 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c  4(v, OP_VFilter,
1d7d0 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f   iCur, addrNotFo
1d7e0 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20  und, iReg,.     
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d800 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
1d810 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20  dxStr,.         
1d820 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
1d830 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  op->u.vtab.needF
1d840 72 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46  ree ? P4_MPRINTF
1d850 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20   : P4_STATIC);. 
1d860 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
1d870 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
1d880 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
1d890 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31  onstraint && j<1
1d8a0 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  6; j++){.      i
1d8b0 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  f( (pLoop->u.vta
1d8c0 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31  b.omitMask>>j)&1
1d8d0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
1d8e0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1d8f0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
1d900 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1d910 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1d920 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20  = OP_VNext;.    
1d930 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
1d940 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
1d950 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
1d960 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1d970 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1d980 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
1d990 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72  e, iReg, nConstr
1d9a0 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c  aint+2);.    sql
1d9b0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1d9c0 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d  (pParse, 1);.  }
1d9d0 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
1d9e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1d9f0 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66  ALTABLE */..  if
1da00 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1da10 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d  s & WHERE_IPK)!=
1da20 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  0.   && (pLoop->
1da30 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1da40 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45  _COLUMN_IN|WHERE
1da50 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a  _COLUMN_EQ))!=0.
1da60 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65    ){.    /* Case
1da70 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65   2:  We can dire
1da80 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61  ctly reference a
1da90 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e   single row usin
1daa0 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  g an.    **     
1dab0 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
1dac0 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
1dad0 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
1dae0 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20  .  Or.    **    
1daf0 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e        we referen
1db00 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ce multiple rows
1db10 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20   using a "rowid 
1db20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  IN (...)".    **
1db30 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72            constr
1db40 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  uct..    */.    
1db50 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75  assert( pLoop->u
1db60 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b  .btree.nEq==1 );
1db70 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67  .    iReleaseReg
1db80 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1db90 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1dba0 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
1dbb0 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20  >aLTerm[0];.    
1dbc0 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
1dbd0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1dbe0 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20  pTerm->pExpr!=0 
1dbf0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
1dc00 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
1dc10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1dc20 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1dc30 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1dc40 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f    iRowidReg = co
1dc50 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
1dc60 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
1dc70 65 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20 69  evel, 0, bRev, i
1dc80 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20  ReleaseReg);.   
1dc90 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
1dca0 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20  l->addrNxt;.    
1dcb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1dcc0 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
1dcd0 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64  t, iRowidReg, ad
1dce0 64 72 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c 69  drNxt);.    sqli
1dcf0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1dd00 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
1dd10 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52  Cur, addrNxt, iR
1dd20 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 73 71  owidReg);.    sq
1dd30 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1dd40 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
1dd50 72 73 65 2c 20 69 52 6f 77 69 64 52 65 67 2c 20  rse, iRowidReg, 
1dd60 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  1);.    sqlite3E
1dd70 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
1dd80 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
1dd90 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1dda0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1ddb0 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76  "pk"));.    pLev
1ddc0 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  el->op = OP_Noop
1ddd0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
1dde0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1ddf0 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20  WHERE_IPK)!=0.  
1de00 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70         && (pLoop
1de10 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1de20 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29 21  E_COLUMN_RANGE)!
1de30 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43  =0.  ){.    /* C
1de40 61 73 65 20 33 3a 20 20 57 65 20 68 61 76 65 20  ase 3:  We have 
1de50 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  an inequality co
1de60 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
1de70 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
1de80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1de90 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f   testOp = OP_Noo
1dea0 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  p;.    int start
1deb0 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64  ;.    int memEnd
1dec0 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57  Value = 0;.    W
1ded0 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74  hereTerm *pStart
1dee0 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73  , *pEnd;..    as
1def0 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
1df00 3d 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b  =0 );.    j = 0;
1df10 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45  .    pStart = pE
1df20 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  nd = 0;.    if( 
1df30 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1df40 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
1df50 20 29 20 70 53 74 61 72 74 20 3d 20 70 4c 6f 6f   ) pStart = pLoo
1df60 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a  p->aLTerm[j++];.
1df70 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1df80 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
1df90 4f 50 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64 20  OP_LIMIT ) pEnd 
1dfa0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1dfb0 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  j++];.    assert
1dfc0 28 20 70 53 74 61 72 74 21 3d 30 20 7c 7c 20 70  ( pStart!=0 || p
1dfd0 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  End!=0 );.    if
1dfe0 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
1dff0 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a  pTerm = pStart;.
1e000 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70        pStart = p
1e010 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  End;.      pEnd 
1e020 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  = pTerm;.    }. 
1e030 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
1e040 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e060 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
1e070 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
1e080 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20  start bound */. 
1e090 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65       int r1, rTe
1e0a0 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  mp;        /* Re
1e0b0 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64  gisters for hold
1e0c0 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62 6f  ing the start bo
1e0d0 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20  undary */..     
1e0e0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1e0f0 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20  g constant maps 
1e100 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f  TK_xx codes into
1e110 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a   corresponding .
1e120 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70        ** seek op
1e130 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e  codes.  It depen
1e140 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ds on a particul
1e150 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54  ar ordering of T
1e160 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20  K_xx.      */.  
1e170 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f      const u8 aMo
1e180 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  veOp[] = {.     
1e190 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a        /* TK_GT *
1e1a0 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20  /  OP_SeekGt,.  
1e1b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
1e1c0 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c  E */  OP_SeekLe,
1e1d0 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
1e1e0 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LT */  OP_Seek
1e1f0 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Lt,.           /
1e200 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53  * TK_GE */  OP_S
1e210 65 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20  eekGe.      };. 
1e220 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e230 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20  LE==TK_GT+1 );  
1e240 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
1e250 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20   the ordering.. 
1e260 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1e270 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20   TK_LT==TK_GT+2 
1e280 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
1e290 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c  of the TK_xx val
1e2a0 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  ues... */.      
1e2b0 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
1e2c0 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f  K_GT+3 );      /
1e2d0 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63  *  ... is correc
1e2e0 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73  ct. */..      as
1e2f0 73 65 72 74 28 20 28 70 53 74 61 72 74 2d 3e 77  sert( (pStart->w
1e300 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
1e310 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ULL)==0 );.     
1e320 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72   testcase( pStar
1e330 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
1e340 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
1e350 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e     pX = pStart->
1e360 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1e370 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
1e380 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
1e390 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72  tart->leftCursor
1e3a0 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 74 72 61  !=iCur ); /* tra
1e3b0 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
1e3c0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 72 31 20  nts */.      r1 
1e3d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e3e0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58  eTemp(pParse, pX
1e3f0 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70  ->pRight, &rTemp
1e400 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e410 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d  VdbeAddOp3(v, aM
1e420 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f  oveOp[pX->op-TK_
1e430 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  GT], iCur, addrB
1e440 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56  rk, r1);.      V
1e450 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1e460 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  pk"));.      sql
1e470 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
1e480 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
1e490 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20  se, r1, 1);.    
1e4a0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1e4b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1e4c0 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69  rTemp);.      di
1e4d0 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1e4e0 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d  , pStart);.    }
1e4f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1e500 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e510 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20   bRev ? OP_Last 
1e520 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  : OP_Rewind, iCu
1e530 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  r, addrBrk);.   
1e540 20 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20   }.    if( pEnd 
1e550 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1e560 58 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45  X;.      pX = pE
1e570 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nd->pExpr;.     
1e580 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
1e590 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e5a0 28 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  (pEnd->wtFlags &
1e5b0 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
1e5c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e5d0 65 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72  e( pEnd->leftCur
1e5e0 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20  sor!=iCur ); /* 
1e5f0 54 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74  Transitive const
1e600 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
1e610 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e  testcase( pEnd->
1e620 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1e630 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
1e640 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b  memEndValue = ++
1e650 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1e660 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e670 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  ode(pParse, pX->
1e680 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61  pRight, memEndVa
1e690 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  lue);.      if( 
1e6a0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pX->op==TK_LT ||
1e6b0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29   pX->op==TK_GT )
1e6c0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
1e6d0 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20   = bRev ? OP_Le 
1e6e0 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d  : OP_Ge;.      }
1e6f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
1e700 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
1e710 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20  _Lt : OP_Gt;.   
1e720 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62     }.      disab
1e730 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1e740 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  End);.    }.    
1e750 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  start = sqlite3V
1e760 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1e770 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
1e780 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
1e790 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
1e7a0 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
1e7b0 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Cur;.    pLevel-
1e7c0 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20  >p2 = start;.   
1e7d0 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
1e7e0 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  >p5==0 );.    if
1e7f0 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f  ( testOp!=OP_Noo
1e800 70 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69  p ){.      iRowi
1e810 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52  dReg = iReleaseR
1e820 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
1e830 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
1e840 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e850 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
1e860 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69  wid, iCur, iRowi
1e870 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
1e880 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1e890 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
1e8a0 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
1e8b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e8c0 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74  beAddOp3(v, test
1e8d0 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c  Op, memEndValue,
1e8e0 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64   addrBrk, iRowid
1e8f0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1e900 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1e910 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  v, SQLITE_AFF_NU
1e920 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a  MERIC | SQLITE_J
1e930 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1e940 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c  }.  }else if( pL
1e950 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1e960 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
1e970 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 41      /* Case 4: A
1e980 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69   scan using an i
1e990 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
1e9a0 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
1e9b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79  WHERE clause may
1e9c0 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72   contain zero or
1e9d0 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a   more equality .
1e9e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1e9f0 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49  erms ("==" or "I
1ea00 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68  N" operators) th
1ea10 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
1ea20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  N.    **        
1ea30 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
1ea40 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ns of the index.
1ea50 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e   It may also con
1ea60 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  tain.    **     
1ea70 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63      inequality c
1ea80 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c  onstraints (>, <
1ea90 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74  , >= or <=) on t
1eaa0 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a  he indexed.    *
1eab0 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
1eac0 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c   that immediatel
1ead0 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20  y follows the N 
1eae0 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79  equalities. Only
1eaf0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1eb00 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1eb10 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e  column can be an
1eb20 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68   inequality - th
1eb30 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20  e rest must.    
1eb40 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74  **         use t
1eb50 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22  he "==" and "IN"
1eb60 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20   operators. For 
1eb70 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1eb80 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1eb90 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79  index is on (x,y
1eba0 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  ,z), then the fo
1ebb0 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20  llowing clauses 
1ebc0 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  are all .    ** 
1ebd0 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65          optimize
1ebe0 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d:.    **.    **
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a              x=5.
1ec00 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1ec10 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20    x=5 AND y=10. 
1ec20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1ec30 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   x=5 AND y<10.  
1ec40 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1ec50 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20  x=5 AND y>5 AND 
1ec60 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y<10.    **     
1ec70 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1ec80 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20  =5 AND z<=10.   
1ec90 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1eca0 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d     The z<10 term
1ecb0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1ecc0 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  g cannot be used
1ecd0 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20  , only.    **   
1ece0 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65        the x=5 te
1ecf0 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rm:.    **.    *
1ed00 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1ed10 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a   AND z<10.    **
1ed20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ed30 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66  N may be zero if
1ed40 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
1ed50 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1ed60 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s..    **       
1ed70 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
1ed80 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  o inequality con
1ed90 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e  straints, then N
1eda0 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20   is at.    **   
1edb0 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e        least one.
1edc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1edd0 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65         This case
1ede0 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
1edf0 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
1ee00 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
1ee10 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73   **         cons
1ee20 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69  traints but an i
1ee30 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64  ndex is selected
1ee40 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65   anyway, in orde
1ee50 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
1ee60 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75   to force the ou
1ee70 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f  tput order to co
1ee80 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45  nform to an ORDE
1ee90 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20  R BY..    */  . 
1eea0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1eeb0 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20  u8 aStartOp[] = 
1eec0 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  {.      0,.     
1eed0 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77   0,.      OP_Rew
1eee0 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ind,           /
1eef0 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 2: (!start_con
1ef00 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
1ef10 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a  tEq &&  !bRev) *
1ef20 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c  /.      OP_Last,
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ef40 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  3: (!start_const
1ef50 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
1ef60 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a  q &&   bRev) */.
1ef70 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c        OP_SeekGt,
1ef80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a             /* 4:
1ef90 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1efa0 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
1efb0 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
1efc0 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20      OP_SeekLt,  
1efd0 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28           /* 5: (
1efe0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1eff0 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
1f000 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
1f010 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20    OP_SeekGe,    
1f020 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74         /* 6: (st
1f030 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1f040 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
1f050 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1f060 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20  OP_SeekLe       
1f070 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72       /* 7: (star
1f080 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1f090 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62  &  startEq &&  b
1f0a0 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
1f0b0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1f0c0 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a  u8 aEndOp[] = {.
1f0d0 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20        OP_Noop,  
1f0e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a             /* 0:
1f0f0 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e   (!end_constrain
1f100 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ts) */.      OP_
1f110 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20  IdxGE,          
1f120 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e    /* 1: (end_con
1f130 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65  straints && !bRe
1f140 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  v) */.      OP_I
1f150 64 78 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  dxLT            
1f160 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 2: (end_cons
1f170 74 72 61 69 6e 74 73 20 26 26 20 62 52 65 76 29  traints && bRev)
1f180 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   */.    };.    i
1f190 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
1f1a0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20 2f 2a  u.btree.nEq;  /*
1f1b0 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   Number of == or
1f1c0 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20   IN terms */.   
1f1d0 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20   int isMinQuery 
1f1e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1f1f0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
1f200 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43   optimized SELEC
1f210 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20  T min(x).. */.  
1f220 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20    int regBase;  
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f240 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20  * Base register 
1f250 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69  holding constrai
1f260 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20  nt values */.   
1f270 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20   int r1;        
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f290 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a   Temp register *
1f2a0 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
1f2b0 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30  *pRangeStart = 0
1f2c0 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79  ;  /* Inequality
1f2d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
1f2e0 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20  ange start */.  
1f2f0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
1f300 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f  ngeEnd = 0;    /
1f310 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
1f320 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
1f330 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20   end */.    int 
1f340 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20  startEq;        
1f350 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1f360 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20   if range start 
1f370 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
1f380 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64  = */.    int end
1f390 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
1f3a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1f3b0 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20   range end uses 
1f3c0 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
1f3d0 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f      int start_co
1f3e0 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20  nstraints;      
1f3f0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e   /* Start of ran
1f400 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  ge is constraine
1f410 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  d */.    int nCo
1f420 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20  nstraint;       
1f430 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f440 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  of constraint te
1f450 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  rms */.    Index
1f460 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
1f470 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1f480 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20  ndex we will be 
1f490 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  using */.    int
1f4a0 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20   iIdxCur;       
1f4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f4c0 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
1f4d0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
1f4e0 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20    int nExtraReg 
1f4f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1f500 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
1f510 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64  a registers need
1f520 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70  ed */.    int op
1f530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f540 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75         /* Instru
1f550 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ction opcode */.
1f560 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74      char *zStart
1f570 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
1f580 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72   /* Affinity for
1f590 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   start of range 
1f5a0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
1f5b0 20 20 63 68 61 72 20 2a 7a 45 6e 64 41 66 66 3b    char *zEndAff;
1f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f5d0 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65  * Affinity for e
1f5e0 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  nd of range cons
1f5f0 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 70  traint */..    p
1f600 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
1f610 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
1f620 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
1f630 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a 20 20 20  l->iIdxCur;..   
1f640 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70   /* If this loop
1f650 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72   satisfies a sor
1f660 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42  t order (pOrderB
1f670 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20  y) request that 
1f680 0a 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73  .    ** was pass
1f690 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
1f6a0 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ion to implement
1f6b0 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
1f6c0 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71  ) ..." .    ** q
1f6d0 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63  uery, then the c
1f6e0 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  aller will only 
1f6f0 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74  allow the loop t
1f700 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a  o run for.    **
1f710 20 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74   a single iterat
1f720 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
1f730 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72  that the first r
1f740 6f 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20  ow returned.    
1f750 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  ** should not ha
1f760 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ve a NULL value 
1f770 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49  stored in 'x'. I
1f780 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a  f column 'x' is.
1f790 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
1f7a0 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e   one after the n
1f7b0 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  Eq equality cons
1f7c0 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69  traints in the i
1f7d0 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69  ndex,.    ** thi
1f7e0 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20  s requires some 
1f7f0 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
1f800 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1f810 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
1f820 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
1f830 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20  BY_MIN)!=0.     
1f840 26 26 20 28 70 57 49 6e 66 6f 2d 3e 62 4f 42 53  && (pWInfo->bOBS
1f850 61 74 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28  at!=0).     && (
1f860 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45  pIdx->nColumn>nE
1f870 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q).    ){.      
1f880 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  /* assert( pOrde
1f890 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  rBy->nExpr==1 );
1f8a0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73 73   */.      /* ass
1f8b0 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 61  ert( pOrderBy->a
1f8c0 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75  [0].pExpr->iColu
1f8d0 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  mn==pIdx->aiColu
1f8e0 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20 20  mn[nEq] ); */.  
1f8f0 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d      isMinQuery =
1f900 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   1;.      nExtra
1f910 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
1f920 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20      /* Find any 
1f930 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1f940 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20  raint terms for 
1f950 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
1f960 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  d .    ** of the
1f970 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a   range. .    */.
1f980 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20      j = nEq;.   
1f990 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1f9a0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
1f9b0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
1f9c0 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c 6f  RangeStart = pLo
1f9d0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1f9e0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
1f9f0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
1fa00 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1fa10 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
1fa20 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52  IMIT ){.      pR
1fa30 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d  angeEnd = pLoop-
1fa40 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
1fa50 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
1fa60 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
1fa70 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1fa80 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63  o evaluate all c
1fa90 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1faa0 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20  using == or IN. 
1fab0 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20     ** and store 
1fac0 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68  the values of th
1fad0 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20  ose terms in an 
1fae0 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
1faf0 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
1fb00 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20  ng at regBase.. 
1fb10 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73     */.    regBas
1fb20 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  e = codeAllEqual
1fb30 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ityTerms(pParse,
1fb40 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74  pLevel,bRev,nExt
1fb50 72 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66 66  raReg,&zStartAff
1fb60 29 3b 0a 20 20 20 20 7a 45 6e 64 41 66 66 20 3d  );.    zEndAff =
1fb70 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
1fb80 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b  (db, zStartAff);
1fb90 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70  .    addrNxt = p
1fba0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
1fbb0 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
1fbc0 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73  e doing a revers
1fbd0 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  e order scan on 
1fbe0 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
1fbf0 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  ex, or.    ** a 
1fc00 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63  forward order sc
1fc10 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69  an on a descendi
1fc20 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63  ng index, interc
1fc30 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a  hange the .    *
1fc40 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  * start and end 
1fc50 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61  terms (pRangeSta
1fc60 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64  rt and pRangeEnd
1fc70 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
1fc80 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f  ( (nEq<pIdx->nCo
1fc90 6c 75 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70  lumn && bRev==(p
1fca0 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
1fcb0 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  nEq]==SQLITE_SO_
1fcc0 41 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62  ASC)).     || (b
1fcd0 52 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f  Rev && pIdx->nCo
1fce0 6c 75 6d 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29  lumn==nEq).    )
1fcf0 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65  {.      SWAP(Whe
1fd00 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65  reTerm *, pRange
1fd10 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74  End, pRangeStart
1fd20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65  );.    }..    te
1fd30 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
1fd40 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74  art && (pRangeSt
1fd50 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
1fd60 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20   WO_LE)!=0 );.  
1fd70 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1fd80 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e  geStart && (pRan
1fd90 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
1fda0 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29  or & WO_GE)!=0 )
1fdb0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1fdc0 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52  pRangeEnd && (pR
1fdd0 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
1fde0 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29  or & WO_LE)!=0 )
1fdf0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1fe00 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52  pRangeEnd && (pR
1fe10 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
1fe20 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29  or & WO_GE)!=0 )
1fe30 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20  ;.    startEq = 
1fe40 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20  !pRangeStart || 
1fe50 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
1fe60 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
1fe70 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45  WO_GE);.    endE
1fe80 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64  q =   !pRangeEnd
1fe90 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   || pRangeEnd->e
1fea0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
1feb0 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74  E|WO_GE);.    st
1fec0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1fed0 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c  = pRangeStart ||
1fee0 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20   nEq>0;..    /* 
1fef0 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63  Seek the index c
1ff00 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61  ursor to the sta
1ff10 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  rt of the range.
1ff20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
1ff30 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
1ff40 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29  f( pRangeStart )
1ff50 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
1ff60 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61  ight = pRangeSta
1ff70 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rt->pExpr->pRigh
1ff80 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
1ff90 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1ffa0 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
1ffb0 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28  +nEq);.      if(
1ffc0 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77   (pRangeStart->w
1ffd0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
1ffe0 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
1fff0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20000 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20  deIsNullJump(v, 
20010 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
20020 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
20030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20040 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20   zStartAff ){.  
20050 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
20060 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
20070 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
20080 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45  ff[nEq])==SQLITE
20090 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20  _AFF_NONE){.    
200a0 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74        /* Since t
200b0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
200c0 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64   to be performed
200d0 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73   with no convers
200e0 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ions.          *
200f0 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65  * applied to the
20100 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74   operands, set t
20110 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61  he affinity to a
20120 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74  pply to pRight t
20130 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  o .          ** 
20140 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
20150 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a    */.          z
20160 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20  StartAff[nEq] = 
20170 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
20180 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20190 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
201a0 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
201b0 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
201c0 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20  zStartAff[nEq]) 
201d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  ){.          zSt
201e0 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  artAff[nEq] = SQ
201f0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
20200 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20210 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72    .      nConstr
20220 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65  aint++;.      te
20230 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
20240 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
20250 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
20260 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d     }else if( isM
20270 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20  inQuery ){.     
20280 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20290 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
202a0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
202b0 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
202c0 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74  t++;.      start
202d0 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  Eq = 0;.      st
202e0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
202f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  = 1;.    }.    c
20300 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
20310 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
20320 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a  , nConstraint, z
20330 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f  StartAff);.    o
20340 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74  p = aStartOp[(st
20350 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c  art_constraints<
20360 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c  <2) + (startEq<<
20370 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20  1) + bRev];.    
20380 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b  assert( op!=0 );
20390 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
203a0 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a  p==OP_Rewind );.
203b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
203c0 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20  ==OP_Last );.   
203d0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
203e0 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20  P_SeekGt );.    
203f0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
20400 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74  _SeekGe );.    t
20410 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
20420 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65  SeekLe );.    te
20430 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
20440 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c  eekLt );.    sql
20450 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
20460 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  t(v, op, iIdxCur
20470 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
20480 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  se, nConstraint)
20490 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
204a0 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  he value for the
204b0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
204c0 74 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e  traint at the en
204d0 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
204e0 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a  range (if any)..
204f0 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73      */.    nCons
20500 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
20510 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20    if( pRangeEnd 
20520 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
20530 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e  Right = pRangeEn
20540 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  d->pExpr->pRight
20550 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
20560 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
20570 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e  Parse, regBase+n
20580 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  Eq, 1);.      sq
20590 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
205a0 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65  arse, pRight, re
205b0 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
205c0 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64    if( (pRangeEnd
205d0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
205e0 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  _VNULL)==0 ){.  
205f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20600 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
20610 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  v, pRight, regBa
20620 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29  se+nEq, addrNxt)
20630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20640 69 66 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20  if( zEndAff ){. 
20650 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
20660 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
20670 79 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66  y(pRight, zEndAf
20680 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f  f[nEq])==SQLITE_
20690 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20  AFF_NONE){.     
206a0 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68       /* Since th
206b0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
206c0 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  to be performed 
206d0 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69  with no conversi
206e0 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ons.          **
206f0 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20   applied to the 
20700 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68  operands, set th
20710 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70  e affinity to ap
20720 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f  ply to pRight to
20730 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53   .          ** S
20740 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20  QLITE_AFF_NONE. 
20750 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45   */.          zE
20760 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c  ndAff[nEq] = SQL
20770 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
20780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20790 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e  if( sqlite3ExprN
207a0 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
207b0 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 45 6e  ange(pRight, zEn
207c0 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20  dAff[nEq]) ){.  
207d0 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b          zEndAff[
207e0 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
207f0 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
20800 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20  }.      }  .    
20810 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
20820 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
20830 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64  ase, nEq+1, zEnd
20840 41 66 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e  Aff);.      nCon
20850 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
20860 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
20870 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  eEnd->wtFlags & 
20880 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
20890 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
208a0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 61  3DbFree(db, zSta
208b0 72 74 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69  rtAff);.    sqli
208c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
208d0 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20  ndAff);..    /* 
208e0 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
208f0 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76  body */.    pLev
20900 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
20910 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
20920 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  v);..    /* Chec
20930 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63  k if the index c
20940 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68  ursor is past th
20950 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  e end of the ran
20960 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20  ge. */.    op = 
20970 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e  aEndOp[(pRangeEn
20980 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b  d || nEq) * (1 +
20990 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73   bRev)];.    tes
209a0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f  tcase( op==OP_No
209b0 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  op );.    testca
209c0 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45  se( op==OP_IdxGE
209d0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
209e0 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29  ( op==OP_IdxLT )
209f0 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50  ;.    if( op!=OP
20a00 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
20a10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
20a20 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43  Int(v, op, iIdxC
20a30 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67  ur, addrNxt, reg
20a40 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
20a50 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
20a60 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
20a70 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a   endEq!=bRev ?1:
20a80 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
20a90 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 69  * If there are i
20aa0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
20ab0 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61  aints, check tha
20ac0 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  t the value.    
20ad0 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
20ae0 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20  column that the 
20af0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72  inequality contr
20b00 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ains is not NULL
20b10 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69  ..    ** If it i
20b20 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e  s, jump to the n
20b30 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
20b40 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a   the loop..    *
20b50 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74  /.    r1 = sqlit
20b60 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
20b70 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  rse);.    testca
20b80 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  se( pLoop->wsFla
20b90 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
20ba0 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74  IMIT );.    test
20bb0 63 61 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46  case( pLoop->wsF
20bc0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
20bd0 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66  _LIMIT );.    if
20be0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
20bf0 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c  s & (WHERE_BTM_L
20c00 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  IMIT|WHERE_TOP_L
20c10 49 4d 49 54 29 29 21 3d 30 20 29 7b 0a 20 20 20  IMIT))!=0 ){.   
20c20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20c30 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
20c40 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c  n, iIdxCur, nEq,
20c50 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
20c60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20c70 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20   OP_IsNull, r1, 
20c80 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d  addrCont);.    }
20c90 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
20ca0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
20cb0 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  e, r1);..    /* 
20cc0 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63  Seek the table c
20cd0 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72  ursor, if requir
20ce0 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c  ed */.    disabl
20cf0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52  eTerm(pLevel, pR
20d00 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
20d10 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
20d20 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a  el, pRangeEnd);.
20d30 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62      if( !omitTab
20d40 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77  le ){.      iRow
20d50 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65  idReg = iRelease
20d60 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
20d70 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
20d80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
20d90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
20da0 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72  dxRowid, iIdxCur
20db0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
20dc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20dd0 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
20de0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
20df0 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
20e00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20e10 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72  v, OP_Seek, iCur
20e20 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f  , iRowidReg);  /
20e30 2a 20 44 65 66 65 72 72 65 64 20 73 65 65 6b 20  * Deferred seek 
20e40 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  */.    }..    /*
20e50 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74   Record the inst
20e60 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  ruction used to 
20e70 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
20e80 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20  op. Disable .   
20e90 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   ** WHERE clause
20ea0 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75   terms made redu
20eb0 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64  ndant by the ind
20ec0 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20  ex range scan.. 
20ed0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
20ee0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
20ef0 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20  HERE_ONEROW ){. 
20f00 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
20f10 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d  = OP_Noop;.    }
20f20 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b  else if( bRev ){
20f30 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
20f40 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20  p = OP_Prev;.   
20f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
20f60 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65  evel->op = OP_Ne
20f70 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  xt;.    }.    pL
20f80 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43  evel->p1 = iIdxC
20f90 75 72 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  ur;.    if( (pLo
20fa0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
20fb0 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d  ERE_CONSTRAINT)=
20fc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  =0 ){.      pLev
20fd0 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f  el->p5 = SQLITE_
20fe0 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
20ff0 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65  CAN_STEP;.    }e
21000 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
21010 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30  t( pLevel->p5==0
21020 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   );.    }.  }els
21030 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e..#ifndef SQLIT
21040 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
21050 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f  ZATION.  if( pLo
21060 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
21070 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a  ERE_MULTI_OR ){.
21080 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20      /* Case 5:  
21090 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  Two or more sepa
210a0 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74  rately indexed t
210b0 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
210c0 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y OR.    **.    
210d0 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
210e0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  **.    **   CREA
210f0 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c  TE TABLE t1(a,b,
21100 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  c,d);.    **   C
21110 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
21120 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20  N t1(a);.    ** 
21130 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
21140 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20  2 ON t1(b);.    
21150 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
21160 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20  X i3 ON t1(c);. 
21170 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
21180 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
21190 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37  WHERE a=5 OR b=7
211a0 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d   OR (c=11 AND d=
211b0 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  13).    **.    *
211c0 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
211d0 2c 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65  , there are thre
211e0 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20  e indexed terms 
211f0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e  connected by OR.
21200 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20  .    ** The top 
21210 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b  of the loop look
21220 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20  s like this:.   
21230 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
21240 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31      Null       1
21250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21260 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65  # Zero the rowse
21270 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a  t in reg 1.    *
21280 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66  *.    ** Then, f
21290 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20  or each indexed 
212a0 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  term, the follow
212b0 69 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ing. The argumen
212c0 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77  ts to.    ** Row
212d0 53 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68  SetTest are such
212e0 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20   that the rowid 
212f0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
21300 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20  ow is inserted. 
21310 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52     ** into the R
21320 6f 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20  owSet. If it is 
21330 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c  already present,
21340 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74   control skips t
21350 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20  he.    ** Gosub 
21360 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73  opcode and jumps
21370 20 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65   straight to the
21380 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
21390 62 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20  by WhereEnd().. 
213a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
213b0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
213c0 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20  Begin(<term>).  
213d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f    **          Ro
213e0 77 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20  wSetTest        
213f0 20 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65            # Inse
21400 72 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f  rt rowid into ro
21410 77 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  wset.    **     
21420 20 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20       Gosub      
21430 32 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  2 A.    **      
21440 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
21450 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  d().    **.    *
21460 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * Following the 
21470 61 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74  above, code to t
21480 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
21490 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20  p. Label A, the 
214a0 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66  target.    ** of
214b0 20 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65   the Gosub above
214c0 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69  , jumps to the i
214d0 6e 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74  nstruction right
214e0 20 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e   after the Goto.
214f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
21500 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20          Null    
21510 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
21520 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72      # Zero the r
21530 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20  owset in reg 1. 
21540 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47     **          G
21550 6f 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20  oto       B     
21560 20 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65             # The
21570 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65   loop is finishe
21580 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
21590 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20         A: <loop 
215a0 62 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20  body>           
215b0 20 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64        # Return d
215c0 61 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20  ata, whatever.. 
215d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
215e0 20 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20        Return    
215f0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
21600 20 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f    # Jump back to
21610 20 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a   the Gosub.    *
21620 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42  *.    **       B
21630 3a 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f  : <after the loo
21640 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f  p>.    **.    */
21650 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65  .    WhereClause
21660 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54   *pOrWc;    /* T
21670 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f  he OR-clause bro
21680 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62  ken out into sub
21690 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63  terms */.    Src
216a0 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20  List *pOrTab;   
216b0 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64      /* Shortened
216c0 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f   table list or O
216d0 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74  R-clause generat
216e0 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  ion */.    Index
216f0 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20   *pCov = 0;     
21700 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e          /* Poten
21710 74 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e  tial covering in
21720 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  dex (or NULL) */
21730 0a 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72  .    int iCovCur
21740 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
21750 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73  +;  /* Cursor us
21760 65 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61  ed for index sca
21770 6e 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a  ns (if any) */..
21780 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75 72      int regRetur
21790 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
217a0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  em;           /*
217b0 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20 77   Register used w
217c0 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a  ith OP_Gosub */.
217d0 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65      int regRowse
217e0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21800 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f   Register for Ro
21810 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  wSet object */. 
21820 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20     int regRowid 
21830 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21850 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
21860 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e   rowid */.    in
21870 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71  t iLoopBody = sq
21880 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
21890 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74  el(v);  /* Start
218a0 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f   of loop body */
218b0 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69  .    int iRetIni
218c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
218e0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65 67  * Address of reg
218f0 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20  Return init */. 
21900 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54     int untestedT
21910 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20  erms = 0;       
21920 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65        /* Some te
21930 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  rms not complete
21940 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20  ly tested */.   
21950 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21970 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
21980 74 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  ter */.    Expr 
21990 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20  *pAndExpr = 0;  
219a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
219b0 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e   An ".. AND (...
219c0 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  )" expression */
219d0 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d  .   .    pTerm =
219e0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30   pLoop->aLTerm[0
219f0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
21a00 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61  Term!=0 );.    a
21a10 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
21a20 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20  perator & WO_OR 
21a30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
21a40 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
21a50 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30   TERM_ORINFO)!=0
21a60 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20   );.    pOrWc = 
21a70 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
21a80 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65  o->wc;.    pLeve
21a90 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72  l->op = OP_Retur
21aa0 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  n;.    pLevel->p
21ab0 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a  1 = regReturn;..
21ac0 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20      /* Set up a 
21ad0 6e 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70  new SrcList in p
21ae0 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67  OrTab containing
21af0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
21b00 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20   scanned.    ** 
21b10 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20  by this loop in 
21b20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e  the a[0] slot an
21b30 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74  d all notReady t
21b40 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20  ables in a[1..] 
21b50 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68  slots..    ** Th
21b60 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53  is becomes the S
21b70 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65  rcList in the re
21b80 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20  cursive call to 
21b90 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
21ba0 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n()..    */.    
21bb0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
21bc0 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  el>1 ){.      in
21bd0 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20  t nNotReady;    
21be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21bf0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f  The number of no
21c00 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f  tReady tables */
21c10 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
21c20 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67  cList_item *orig
21c30 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  Src;     /* Orig
21c40 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62  inal list of tab
21c50 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f  les */.      nNo
21c60 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d  tReady = pWInfo-
21c70 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c  >nLevel - iLevel
21c80 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54   - 1;.      pOrT
21c90 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63  ab = sqlite3Stac
21ca0 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20  kAllocRaw(db,.  
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cc0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
21cd0 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52  (*pOrTab)+ nNotR
21ce0 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54  eady*sizeof(pOrT
21cf0 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  ab->a[0]));.    
21d00 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20    if( pOrTab==0 
21d10 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64  ) return notRead
21d20 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d  y;.      pOrTab-
21d30 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e  >nAlloc = (u8)(n
21d40 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20  NotReady + 1);. 
21d50 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72       pOrTab->nSr
21d60 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c  c = pOrTab->nAll
21d70 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  oc;.      memcpy
21d80 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62  (pOrTab->a, pTab
21d90 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54  Item, sizeof(*pT
21da0 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20  abItem));.      
21db0 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f  origSrc = pWInfo
21dc0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  ->pTabList->a;. 
21dd0 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
21de0 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29  =nNotReady; k++)
21df0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
21e00 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20  (&pOrTab->a[k], 
21e10 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b  &origSrc[pLevel[
21e20 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f  k].iFrom], sizeo
21e30 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29  f(pOrTab->a[k]))
21e40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
21e50 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61  lse{.      pOrTa
21e60 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  b = pWInfo->pTab
21e70 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  List;.    }..   
21e80 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
21e90 68 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74  he rowset regist
21ea0 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55  er to contain NU
21eb0 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20  LL. An SQL NULL 
21ec0 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76  is .    ** equiv
21ed0 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74  alent to an empt
21ee0 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a  y rowset..    **
21ef0 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69  .    ** Also ini
21f00 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72  tialize regRetur
21f10 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  n to contain the
21f20 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
21f30 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20  instruction .   
21f40 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   ** immediately 
21f50 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50  following the OP
21f60 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65 20 62  _Return at the b
21f70 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
21f80 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69  p. This.    ** i
21f90 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 61 20  s required in a 
21fa0 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54  few obscure LEFT
21fb0 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72   JOIN cases wher
21fc0 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a  e control jumps.
21fd0 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20      ** over the 
21fe0 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  top of the loop 
21ff0 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  into the body of
22000 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73   it. In this cas
22010 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f  e the .    ** co
22020 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66  rrect response f
22030 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f  or the end-of-lo
22040 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f  op code (the OP_
22050 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20  Return) is to . 
22060 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75     ** fall throu
22070 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
22080 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74  nstruction, just
22090 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64   as an OP_Next d
220a0 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61  oes if.    ** ca
220b0 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69  lled on an unini
220c0 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e  tialized cursor.
220d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
220e0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
220f0 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
22100 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b  ICATES_OK)==0 ){
22110 0a 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74  .      regRowset
22120 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
22130 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69  m;.      regRowi
22140 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
22150 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
22160 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22170 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f  P_Null, 0, regRo
22180 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  wset);.    }.   
22190 20 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69   iRetInit = sqli
221a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
221b0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
221c0 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20  regReturn);..   
221d0 20 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69   /* If the origi
221e0 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  nal WHERE clause
221f0 20 69 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72   is z of the for
22200 6d 3a 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52  m:  (x1 OR x2 OR
22210 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20   ...) AND y.    
22220 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72  ** Then for ever
22230 79 20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75  y term xN, evalu
22240 61 74 65 20 61 73 20 74 68 65 20 73 75 62 65 78  ate as the subex
22250 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44  pression: xN AND
22260 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77   z.    ** That w
22270 61 79 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74  ay, terms in y t
22280 68 61 74 20 61 72 65 20 66 61 63 74 6f 72 65 64  hat are factored
22290 20 69 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e   into the disjun
222a0 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a  ction will.    *
222b0 2a 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 62  * be picked up b
222c0 79 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  y the recursive 
222d0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
222e0 57 68 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c  WhereBegin() bel
222f0 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ow..    **.    *
22300 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68  * Actually, each
22310 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
22320 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22  s converted to "
22330 78 4e 20 41 4e 44 20 77 22 20 77 68 65 72 65 20  xN AND w" where 
22340 77 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  w is.    ** the 
22350 22 69 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65  "interesting" te
22360 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73  rms of z - terms
22370 20 74 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72   that did not or
22380 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20  iginate in the. 
22390 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e     ** ON or USIN
223a0 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  G clause of a LE
223b0 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72  FT JOIN, and ter
223c0 6d 73 20 74 68 61 74 20 61 72 65 20 75 73 61 62  ms that are usab
223d0 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e  le as .    ** in
223e0 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  dices..    **.  
223f0 20 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69    ** This optimi
22400 7a 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79  zation also only
22410 20 61 70 70 6c 69 65 73 20 69 66 20 74 68 65 20   applies if the 
22420 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e  (x1 OR x2 OR ...
22430 29 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73  ) term.    ** is
22440 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
22450 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  n the ON clause 
22460 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a  of a LEFT JOIN..
22470 20 20 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65      ** See ticke
22480 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c  t http://www.sql
22490 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f  ite.org/src/info
224a0 2f 66 32 33 36 39 33 30 34 65 34 0a 20 20 20 20  /f2369304e4.    
224b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e  */.    if( pWC->
224c0 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20  nTerm>1 ){.     
224d0 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20   int iTerm;.    
224e0 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69    for(iTerm=0; i
224f0 54 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  Term<pWC->nTerm;
22500 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   iTerm++){.     
22510 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
22520 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70   pWC->a[iTerm].p
22530 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Expr;.        if
22540 28 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  ( &pWC->a[iTerm]
22550 20 3d 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74   == pTerm ) cont
22560 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
22570 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
22580 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
22590 4a 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65  Join) ) continue
225a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
225b0 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c  C->a[iTerm].wtFl
225c0 61 67 73 20 26 20 28 54 45 52 4d 5f 4f 52 49 4e  ags & (TERM_ORIN
225d0 46 4f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  FO) ) continue;.
225e0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43          if( (pWC
225f0 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72  ->a[iTerm].eOper
22600 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d  ator & WO_ALL)==
22610 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
22620 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
22630 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
22640 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
22650 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73      pAndExpr = s
22660 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
22670 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70  , pAndExpr, pExp
22680 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
22690 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29    if( pAndExpr )
226a0 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78  {.        pAndEx
226b0 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
226c0 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44  r(pParse, TK_AND
226d0 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30  , 0, pAndExpr, 0
226e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
226f0 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
22700 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b  ii<pOrWc->nTerm;
22710 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68   ii++){.      Wh
22720 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
22730 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d   = &pOrWc->a[ii]
22740 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
22750 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
22760 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72  =iCur || (pOrTer
22770 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
22780 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20  O_AND)!=0 ){.   
22790 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a       WhereInfo *
227a0 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20  pSubWInfo;      
227b0 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20      /* Info for 
227c0 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73  single OR-term s
227d0 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  can */.        E
227e0 78 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70  xpr *pOrExpr = p
227f0 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20  OrTerm->pExpr;. 
22800 20 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45         if( pAndE
22810 78 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50  xpr && !ExprHasP
22820 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c  roperty(pOrExpr,
22830 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
22840 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45  .          pAndE
22850 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72  xpr->pLeft = pOr
22860 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
22870 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78  pOrExpr = pAndEx
22880 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
22890 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
228a0 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72  rough table entr
228b0 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ies that match t
228c0 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a  erm pOrTerm. */.
228d0 20 20 20 20 20 20 20 20 70 53 75 62 57 49 6e 66          pSubWInf
228e0 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
228f0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f  Begin(pParse, pO
22900 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30  rTab, pOrExpr, 0
22910 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
22930 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
22940 53 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f  SE | WHERE_AND_O
22950 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20  NLY |.          
22960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
22970 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20  ERE_FORCE_TABLE 
22980 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  | WHERE_ONETABLE
22990 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b  _ONLY, iCovCur);
229a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
229b0 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50   pSubWInfo || pP
229c0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
229d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
229e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
229f0 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  ubWInfo ){.     
22a00 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
22a10 70 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  pSubLoop;.      
22a20 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63      explainOneSc
22a30 61 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  an(.            
22a40 20 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62    pParse, pOrTab
22a50 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b  , &pSubWInfo->a[
22a60 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76  0], iLevel, pLev
22a70 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20  el->iFrom, 0.   
22a80 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
22a90 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
22aa0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
22ab0 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f  ERE_DUPLICATES_O
22ac0 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  K)==0 ){.       
22ad0 20 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20       int iSet = 
22ae0 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65  ((ii==pOrWc->nTe
22af0 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20  rm-1)?-1:ii);.  
22b00 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b            int r;
22b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d  .            r =
22b20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22b30 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
22b40 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  , pTabItem->pTab
22b50 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20  , -1, iCur, .   
22b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b80 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20        regRowid, 
22b90 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
22ba0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22bb0 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65  4Int(v, OP_RowSe
22bc0 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74  tTest, regRowset
22bd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
22c00 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20  rrentAddr(v)+2, 
22c10 72 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20  r, iSet);.      
22c20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22c30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22c40 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
22c50 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42  egReturn, iLoopB
22c60 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ody);..         
22c70 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66   /* The pSubWInf
22c80 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
22c90 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74   flag means that
22ca0 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20   this OR term.  
22cb0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
22cc0 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ined one or more
22cd0 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61   AND term from a
22ce0 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e   notReady table.
22cf0 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 20 20    The.          
22d00 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  ** terms from th
22d10 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  e notReady table
22d20 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65   could not be te
22d30 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20  sted and will.  
22d40 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20          ** need 
22d50 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61 74  to be tested lat
22d60 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  er..          */
22d70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
22d80 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  SubWInfo->untest
22d90 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74  edTerms ) untest
22da0 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20  edTerms = 1;..  
22db0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
22dc0 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e  l of the OR-conn
22dd0 65 63 74 65 64 20 74 65 72 6d 73 20 61 72 65 20  ected terms are 
22de0 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20  optimized using 
22df0 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20  the same.       
22e00 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64     ** index, and
22e10 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 70   the index is op
22e20 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ened using the s
22e30 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ame cursor numbe
22e40 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  r.          ** b
22e50 79 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73  y each call to s
22e60 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
22e70 28 29 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  () made by this 
22e80 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20 20  loop, it may.   
22e90 20 20 20 20 20 20 20 2a 2a 20 62 65 20 70 6f 73         ** be pos
22ea0 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68 61  sible to use tha
22eb0 74 20 69 6e 64 65 78 20 61 73 20 61 20 63 6f 76  t index as a cov
22ec0 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20  ering index..   
22ed0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
22ee0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61      ** If the ca
22ef0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
22f00 72 65 42 65 67 69 6e 28 29 20 61 62 6f 76 65 20  reBegin() above 
22f10 72 65 73 75 6c 74 65 64 20 69 6e 20 61 20 73 63  resulted in a sc
22f20 61 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  an that.        
22f30 20 20 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e 64    ** uses an ind
22f40 65 78 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20  ex, and this is 
22f50 65 69 74 68 65 72 20 74 68 65 20 66 69 72 73 74  either the first
22f60 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
22f70 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  rm.          ** 
22f80 70 72 6f 63 65 73 73 65 64 20 6f 72 20 74 68 65  processed or the
22f90 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 73 61   index is the sa
22fa0 6d 65 20 61 73 20 74 68 61 74 20 75 73 65 64 20  me as that used 
22fb0 62 79 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a  by all previous.
22fc0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72            ** ter
22fd0 6d 73 2c 20 73 65 74 20 70 43 6f 76 20 74 6f 20  ms, set pCov to 
22fe0 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 63 6f  the candidate co
22ff0 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74  vering index. Ot
23000 68 65 72 77 69 73 65 2c 20 73 65 74 20 0a 20 20  herwise, set .  
23010 20 20 20 20 20 20 20 20 2a 2a 20 70 43 6f 76 20          ** pCov 
23020 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63  to NULL to indic
23030 61 74 65 20 74 68 61 74 20 6e 6f 20 63 61 6e 64  ate that no cand
23040 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69  idate covering i
23050 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20 20 20 20  ndex will .     
23060 20 20 20 20 20 2a 2a 20 62 65 20 61 76 61 69 6c       ** be avail
23070 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  able..          
23080 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  */.          pSu
23090 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e 66  bLoop = pSubWInf
230a0 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a  o->a[0].pWLoop;.
230b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
230c0 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46  ( (pSubLoop->wsF
230d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
230e0 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20  O_INDEX)==0 );. 
230f0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 53           if( (pS
23100 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  ubLoop->wsFlags 
23110 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
23120 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
23130 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62  & (ii==0 || pSub
23140 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
23150 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20  ndex==pCov).    
23160 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
23170 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
23180 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64  bWInfo->a[0].iId
23190 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b  xCur==iCovCur );
231a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
231b0 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e  v = pSubLoop->u.
231c0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
231d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
231e0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20             pCov 
231f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
23200 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ..          /* F
23210 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74  inish the loop t
23220 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74  hrough table ent
23230 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20  ries that match 
23240 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f  term pOrTerm. */
23250 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23260 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62 57  e3WhereEnd(pSubW
23270 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d  Info);.        }
23280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23290 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f     pLevel->u.pCo
232a0 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20  vidx = pCov;.   
232b0 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76   if( pCov ) pLev
232c0 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43  el->iIdxCur = iC
232d0 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70  ovCur;.    if( p
232e0 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20  AndExpr ){.     
232f0 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
23300 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
23310 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
23320 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20  , pAndExpr);.   
23330 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
23340 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52  beChangeP1(v, iR
23350 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56  etInit, sqlite3V
23360 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
23370 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
23380 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23390 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
233a0 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73  >addrBrk);.    s
233b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
233c0 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42  eLabel(v, iLoopB
233d0 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ody);..    if( p
233e0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
233f0 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72  ) sqlite3StackFr
23400 65 65 28 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a  ee(db, pOrTab);.
23410 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74 65      if( !unteste
23420 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65  dTerms ) disable
23430 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
23440 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  rm);.  }else.#en
23450 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
23460 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
23470 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f  ON */..  {.    /
23480 2a 20 43 61 73 65 20 36 3a 20 20 54 68 65 72 65  * Case 6:  There
23490 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e   is no usable in
234a0 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f  dex.  We must do
234b0 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20   a complete.    
234c0 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e  **          scan
234d0 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
234e0 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
234f0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
23500 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f   aStep[] = { OP_
23510 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b  Next, OP_Prev };
23520 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
23530 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20  t u8 aStart[] = 
23540 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f  { OP_Rewind, OP_
23550 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65  Last };.    asse
23560 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62  rt( bRev==0 || b
23570 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 70 4c  Rev==1 );.    pL
23580 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70  evel->op = aStep
23590 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76  [bRev];.    pLev
235a0 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
235b0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
235c0 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
235d0 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b  ddOp2(v, aStart[
235e0 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64  bRev], iCur, add
235f0 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65  rBrk);.    pLeve
23600 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
23610 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
23620 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e  AN_STEP;.  }.  n
23630 65 77 4e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74  ewNotReady = not
23640 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b  Ready & ~getMask
23650 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
23660 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a  et, iCur);..  /*
23670 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20   Insert code to 
23680 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78  test every subex
23690 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61  pression that ca
236a0 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a  n be completely.
236b0 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73    ** computed us
236c0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
236d0 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20  set of tables.. 
236e0 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
236f0 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
23700 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
23710 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
23720 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73 74  pr *pE;.    test
23730 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
23740 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
23750 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  UAL );.    testc
23760 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
23770 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
23780 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72   );.    if( pTer
23790 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
237a0 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
237b0 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
237c0 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  e;.    if( (pTer
237d0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
237e0 65 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  ewNotReady)!=0 )
237f0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
23800 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
23810 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20  edTerms==0.     
23820 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57            && (pW
23830 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
23840 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
23850 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20  E_ONLY)!=0 );.  
23860 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65      pWInfo->unte
23870 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20  stedTerms = 1;. 
23880 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
23890 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54     }.    pE = pT
238a0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
238b0 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b  assert( pE!=0 );
238c0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
238d0 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45  >iLeftJoin && !E
238e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
238f0 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
23900 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
23910 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  e;.    }.    sql
23920 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
23930 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72  pParse, pE, addr
23940 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
23950 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54  PIFNULL);.    pT
23960 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
23970 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a  TERM_CODED;.  }.
23980 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64  .  /* Insert cod
23990 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d  e to test for im
239a0 70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  plied constraint
239b0 73 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73  s based on trans
239c0 69 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20  itivity.  ** of 
239d0 74 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f  the "==" operato
239e0 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61  r..  **.  ** Exa
239f0 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45  mple: If the WHE
23a00 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  RE clause contai
23a10 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61  ns "t1.a=t2.b" a
23a20 6e 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20  nd "t2.b=123".  
23a30 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f  ** and we are co
23a40 64 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70  ding the t1 loop
23a50 20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70   and the t2 loop
23a60 20 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64   has not yet cod
23a70 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65  ed,.  ** then we
23a80 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20   cannot use the 
23a90 22 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73  "t1.a=t2.b" cons
23aa0 74 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63  traint, but we c
23ab0 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65  an code.  ** the
23ac0 20 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31   implied "t1.a=1
23ad0 32 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  23" constraint..
23ae0 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d    */.  for(pTerm
23af0 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
23b00 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
23b10 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
23b20 78 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b  xpr *pE, *pEAlt;
23b30 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
23b40 70 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54  pAlt;.    if( pT
23b50 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
23b60 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
23b70 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
23b80 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
23b90 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28  rm->eOperator!=(
23ba0 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20  WO_EQUIV|WO_EQ) 
23bb0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
23bc0 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
23bd0 75 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f  ursor!=iCur ) co
23be0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
23bf0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
23c00 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
23c10 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pE = pTerm->pE
23c20 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
23c30 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
23c40 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
23c50 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  n) );.    assert
23c60 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
23c70 52 69 67 68 74 20 26 20 6e 65 77 4e 6f 74 52 65  Right & newNotRe
23c80 61 64 79 29 21 3d 30 20 29 3b 0a 20 20 20 20 70  ady)!=0 );.    p
23c90 41 6c 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  Alt = findTerm(p
23ca0 57 43 2c 20 69 43 75 72 2c 20 70 54 65 72 6d 2d  WC, iCur, pTerm-
23cb0 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e  >u.leftColumn, n
23cc0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57  otReady, WO_EQ|W
23cd0 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  O_IN, 0);.    if
23ce0 28 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74  ( pAlt==0 ) cont
23cf0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 41  inue;.    if( pA
23d00 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  lt->wtFlags & (T
23d10 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
23d20 74 69 6e 75 65 3b 0a 20 20 20 20 74 65 73 74 63  tinue;.    testc
23d30 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72  ase( pAlt->eOper
23d40 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
23d50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41      testcase( pA
23d60 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  lt->eOperator & 
23d70 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 56 64 62  WO_IN );.    Vdb
23d80 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
23d90 20 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69   "begin transiti
23da0 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29  ve constraint"))
23db0 3b 0a 20 20 20 20 70 45 41 6c 74 20 3d 20 73 71  ;.    pEAlt = sq
23dc0 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52  lite3StackAllocR
23dd0 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
23de0 45 41 6c 74 29 29 3b 0a 20 20 20 20 69 66 28 20  EAlt));.    if( 
23df0 70 45 41 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a  pEAlt ){.      *
23e00 70 45 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70  pEAlt = *pAlt->p
23e10 45 78 70 72 3b 0a 20 20 20 20 20 20 70 45 41 6c  Expr;.      pEAl
23e20 74 2d 3e 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70  t->pLeft = pE->p
23e30 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Left;.      sqli
23e40 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
23e50 50 61 72 73 65 2c 20 70 45 41 6c 74 2c 20 61 64  Parse, pEAlt, ad
23e60 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a  drCont, SQLITE_J
23e70 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
23e80 20 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72    sqlite3StackFr
23e90 65 65 28 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20  ee(db, pEAlt);. 
23ea0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
23eb0 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  or a LEFT OUTER 
23ec0 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63  JOIN, generate c
23ed0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ode that will re
23ee0 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
23ef0 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74  at.  ** at least
23f00 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
23f10 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20  right table has 
23f20 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74  matched the left
23f30 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20   table.  .  */. 
23f40 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
23f50 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c  ftJoin ){.    pL
23f60 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20  evel->addrFirst 
23f70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
23f80 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
23f90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23fa0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
23fb0 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  , 1, pLevel->iLe
23fc0 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62  ftJoin);.    Vdb
23fd0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
23fe0 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68  cord LEFT JOIN h
23ff0 69 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  it"));.    sqlit
24000 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
24010 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f  (pParse);.    fo
24020 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
24030 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72  j=0; j<pWC->nTer
24040 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; j++, pTerm++)
24050 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
24060 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
24070 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
24080 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
24090 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
240a0 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29  s & TERM_CODED )
240b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
240c0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
240d0 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|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 20 20 69 66 28 20 28 70 54  e;.      if( (pT
24100 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
24110 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21 3d 30   newNotReady)!=0
24120 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
24130 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65  rt( pWInfo->unte
24140 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20  stedTerms );.   
24150 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
24160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
24170 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
24180 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r );.      sqlit
24190 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
241a0 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
241b0 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pr, addrCont, SQ
241c0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
241d0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
241e0 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
241f0 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
24200 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
24210 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
24220 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20  iReleaseReg);.. 
24230 20 72 65 74 75 72 6e 20 6e 65 77 4e 6f 74 52 65   return newNotRe
24240 61 64 79 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57  ady;.}..#ifdef W
24250 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
24260 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  D./*.** Print a 
24270 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
24280 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70   for debugging p
24290 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69  urposes.*/.stati
242a0 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
242b0 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20  Print(WhereLoop 
242c0 2a 70 2c 20 53 72 63 4c 69 73 74 20 2a 70 54 61  *p, SrcList *pTa
242d0 62 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 6e 62  bList){.  int nb
242e0 20 3d 20 31 2b 28 70 54 61 62 4c 69 73 74 2d 3e   = 1+(pTabList->
242f0 6e 53 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72  nSrc+7)/8;.  str
24300 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
24310 20 2a 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69   *pItem = pTabLi
24320 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b  st->a + p->iTab;
24330 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
24340 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
24350 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24360 74 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78  tf("%c%2d.%0*llx
24370 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64  .%0*llx", p->cId
24380 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24390 20 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20         p->iTab, 
243a0 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c  nb, p->maskSelf,
243b0 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b   nb, p->prereq);
243c0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
243d0 72 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20  rintf(" %12s",. 
243e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243f0 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61      pItem->zAlia
24400 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  s ? pItem->zAlia
24410 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s : pTab->zName)
24420 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  ;.  if( (p->wsFl
24430 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
24440 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a  UALTABLE)==0 ){.
24450 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72      if( p->u.btr
24460 65 65 2e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  ee.pIndex ){.   
24470 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
24480 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65  Name = p->u.btre
24490 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b  e.pIndex->zName;
244a0 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  .      if( zName
244b0 3d 3d 30 20 29 20 7a 4e 61 6d 65 20 3d 20 22 69  ==0 ) zName = "i
244c0 70 6b 22 3b 0a 20 20 20 20 20 20 69 66 28 20 73  pk";.      if( s
244d0 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  trncmp(zName, "s
244e0 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
244f0 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 17)==0 ){.   
24500 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c       int i = sql
24510 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
24520 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  me) - 1;.       
24530 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d   while( zName[i]
24540 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20  !='_' ) i--;.   
24550 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b       zName += i;
24560 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
24570 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24580 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20  f(".%-16s %2d", 
24590 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65  zName, p->u.btre
245a0 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73  e.nEq);.    }els
245b0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
245c0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 32 30  DebugPrintf("%20
245d0 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20  s","");.    }.  
245e0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
245f0 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75  *z;.    if( p->u
24600 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a  .vtab.idxStr ){.
24610 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
24620 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c  3_mprintf("(%d,\
24630 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20  "%s\",%x)",.    
24640 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75              p->u
24650 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
24660 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20  >u.vtab.idxStr, 
24670 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
24680 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  sk);.    }else{.
24690 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
246a0 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25  3_mprintf("(%d,%
246b0 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  x)", p->u.vtab.i
246c0 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
246d0 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
246e0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
246f0 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73  ugPrintf(" %-19s
24700 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", z);.    sqlit
24710 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
24720 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24730 69 6e 74 66 28 22 20 66 20 25 30 34 78 20 4e 20  intf(" f %04x N 
24740 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c  %d", p->wsFlags,
24750 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 73   p->nLTerm);.  s
24760 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24770 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25  f(" cost %d,%d,%
24780 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c  d\n", p->rSetup,
24790 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75   p->rRun, p->nOu
247a0 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
247b0 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b  .** Convert bulk
247c0 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76   memory into a v
247d0 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74  alid WhereLoop t
247e0 68 61 74 20 63 61 6e 20 62 65 20 70 61 73 73 65  hat can be passe
247f0 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f  d.** to whereLoo
24800 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c  pClear harmlessl
24810 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
24820 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28  d whereLoopInit(
24830 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
24840 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e   p->aLTerm = p->
24850 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70  aLTermSpace;.  p
24860 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
24870 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61  p->nLSlot = Arra
24880 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53  ySize(p->aLTermS
24890 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c  pace);.  p->wsFl
248a0 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ags = 0;.}../*.*
248b0 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68 65 72  * Clear the Wher
248c0 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20  eLoop.u union.  
248d0 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e  Leave WhereLoop.
248e0 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a  pLTerm intact..*
248f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
24900 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
24910 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  n(sqlite3 *db, W
24920 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
24930 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26  if( p->wsFlags &
24940 20 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54   (WHERE_VIRTUALT
24950 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f  ABLE|WHERE_AUTO_
24960 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66  INDEX) ){.    if
24970 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
24980 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
24990 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76  LE)!=0 && p->u.v
249a0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a  tab.needFree ){.
249b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
249c0 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ee(p->u.vtab.idx
249d0 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75  Str);.      p->u
249e0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
249f0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76   0;.      p->u.v
24a00 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a  tab.idxStr = 0;.
24a10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
24a20 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
24a30 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
24a40 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70   && p->u.btree.p
24a50 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20  Index!=0 ){.    
24a60 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
24a70 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  db, p->u.btree.p
24a80 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b  Index->zColAff);
24a90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
24aa0 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74  Free(db, p->u.bt
24ab0 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree.pIndex);.   
24ac0 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49     p->u.btree.pI
24ad0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ndex = 0;.    }.
24ae0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61    }.}../*.** Dea
24af0 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c  llocate internal
24b00 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
24b10 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
24b20 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
24b30 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
24b40 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
24b50 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69  ereLoop *p){.  i
24b60 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d  f( p->aLTerm!=p-
24b70 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73  >aLTermSpace ) s
24b80 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
24b90 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77   p->aLTerm);.  w
24ba0 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
24bb0 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65  on(db, p);.  whe
24bc0 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d  reLoopInit(p);.}
24bd0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65  ../*.** Increase
24be0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
24bf0 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70  cation for pLoop
24c00 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65  ->aLTerm[] to be
24c10 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a   at least n..*/.
24c20 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
24c30 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74  LoopResize(sqlit
24c40 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
24c50 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  p *p, int n){.  
24c60 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65  WhereTerm **paNe
24c70 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c  w;.  if( p->nLSl
24c80 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53  ot>=n ) return S
24c90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20  QLITE_OK;.  n = 
24ca0 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65  (n+7)&~7;.  paNe
24cb0 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
24cc0 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
24cd0 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a  f(p->aLTerm[0])*
24ce0 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65 77 3d  n);.  if( paNew=
24cf0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
24d00 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63  TE_NOMEM;.  memc
24d10 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54  py(paNew, p->aLT
24d20 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  erm, sizeof(p->a
24d30 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53  LTerm[0])*p->nLS
24d40 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  lot);.  if( p->a
24d50 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d  LTerm!=p->aLTerm
24d60 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44  Space ) sqlite3D
24d70 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54  bFree(db, p->aLT
24d80 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72  erm);.  p->aLTer
24d90 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e  m = paNew;.  p->
24da0 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65  nLSlot = n;.  re
24db0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  }../*.** Transfe
24dd0 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  r content from t
24de0 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20  he second pLoop 
24df0 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a  into the first..
24e00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
24e10 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69  ereLoopXfer(sqli
24e20 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
24e30 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f  op *pTo, WhereLo
24e40 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66  op *pFrom){.  if
24e50 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
24e60 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d  e(db, pTo, pFrom
24e70 2d 3e 6e 4c 54 65 72 6d 29 20 29 20 72 65 74 75  ->nLTerm) ) retu
24e80 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
24e90 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
24ea0 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b  rUnion(db, pTo);
24eb0 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70  .  memcpy(pTo, p
24ec0 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50  From, WHERE_LOOP
24ed0 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d  _XFER_SZ);.  mem
24ee0 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c  cpy(pTo->aLTerm,
24ef0 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20   pFrom->aLTerm, 
24f00 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65  pTo->nLTerm*size
24f10 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30  of(pTo->aLTerm[0
24f20 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  ]));.  if( pFrom
24f30 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
24f40 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29  E_VIRTUALTABLE )
24f50 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76  {.    pFrom->u.v
24f60 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
24f70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
24f80 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20  From->wsFlags & 
24f90 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
24fa0 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f  )!=0 ){.    pFro
24fb0 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  m->u.btree.pInde
24fc0 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  x = 0;.  }.  ret
24fd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
24fe0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
24ff0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
25000 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
25010 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65   whereLoopDelete
25020 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
25030 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77  ereLoop *p){.  w
25040 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62  hereLoopClear(db
25050 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  , p);.  sqlite3D
25060 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
25070 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68  ./*.** Free a Wh
25080 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
25090 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
250a0 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73   whereInfoFree(s
250b0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
250c0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
250d0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 49    if( ALWAYS(pWI
250e0 6e 66 6f 29 20 29 7b 0a 20 20 20 20 77 68 65 72  nfo) ){.    wher
250f0 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57  eClauseClear(&pW
25100 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20  Info->sWC);.    
25110 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70  while( pWInfo->p
25120 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57  Loops ){.      W
25130 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57  hereLoop *p = pW
25140 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20  Info->pLoops;.  
25150 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f      pWInfo->pLoo
25160 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  ps = p->pNextLoo
25170 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  p;.      whereLo
25180 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  opDelete(db, p);
25190 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
251a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
251b0 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nfo);.  }.}../*.
251c0 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70  ** Insert or rep
251d0 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lace a WhereLoop
251e0 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65   entry using the
251f0 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69   template suppli
25200 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69  ed..**.** An exi
25210 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
25220 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f  entry might be o
25230 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68  verwritten if th
25240 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a  e new template.*
25250 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20  * is better and 
25260 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64  has fewer depend
25270 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20  encies.  Or the 
25280 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65  template will be
25290 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20   ignored.** and 
252a0 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f  no insert will o
252b0 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74  ccur if an exist
252c0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
252d0 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a   faster and has.
252e0 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  ** fewer depende
252f0 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74  ncies than the t
25300 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77  emplate.  Otherw
25310 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c  ise a new WhereL
25320 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  oop is.** added 
25330 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d  based on the tem
25340 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  plate..**.** If 
25350 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
25360 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
25370 6e 20 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61  n we only care a
25380 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  bout only the.**
25390 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61   prerequisites a
253a0 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74  nd rRun and nOut
253b0 20 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20   costs of the N 
253c0 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61  best loops.  Tha
253d0 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  t.** information
253e0 20 69 73 20 67 61 74 68 65 72 65 64 20 69 6e 20   is gathered in 
253f0 74 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  the pBuilder->pO
25400 72 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68  rSet object.  Th
25410 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72  is special.** pr
25420 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73  ocessing mode is
25430 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f   used only for O
25440 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  R clause process
25450 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ing..**.** When 
25460 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c  accumulating mul
25470 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65  tiple loops (whe
25480 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  n pBuilder->pOrS
25490 65 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a  et is NULL) we.*
254a0 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76  * still might ov
254b0 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20  erwrite similar 
254c0 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e  loops with the n
254d0 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74  ew template if t
254e0 68 65 0a 2a 2a 20 74 65 6d 70 6c 61 74 65 20 69  he.** template i
254f0 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73  s better.  Loops
25500 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74   may be overwrit
25510 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ten if the follo
25520 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69  wing .** conditi
25530 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ons are met:.**.
25540 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20  **    (1)  They 
25550 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54  have the same iT
25560 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54  ab..**    (2)  T
25570 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d  hey have the sam
25580 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20  e iSortIdx..**  
25590 20 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c    (3)  The templ
255a0 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20  ate has same or 
255b0 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
255c0 65 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  es than the curr
255d0 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28  ent loop.**    (
255e0 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  4)  The template
255f0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72   has the same or
25600 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
25610 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
25620 70 0a 2a 2a 20 20 20 20 28 35 29 20 20 54 68 65  p.**    (5)  The
25630 20 74 65 6d 70 6c 61 74 65 20 75 73 65 73 20 6d   template uses m
25640 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ore terms of the
25650 20 73 61 6d 65 20 69 6e 64 65 78 20 62 75 74 20   same index but 
25660 68 61 73 20 6e 6f 20 61 64 64 69 74 69 6f 6e 61  has no additiona
25670 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 70  l.**         dep
25680 65 6e 64 65 6e 63 69 65 73 20 20 20 20 20 20 20  endencies       
25690 20 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e     .*/.static in
256a0 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  t whereLoopInser
256b0 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  t(WhereLoopBuild
256c0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68  er *pBuilder, Wh
256d0 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
256e0 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  te){.  WhereLoop
256f0 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 2c 20 2a   **ppPrev, *p, *
25700 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 57 68 65  pNext = 0;.  Whe
25710 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
25720 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
25730 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  o;.  sqlite3 *db
25740 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
25750 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  e->db;..  /* If 
25760 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
25770 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
25780 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63  n only keep trac
25790 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20  k of the costs. 
257a0 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e   ** and prereqs.
257b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  .  */.  if( pBui
257c0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20  lder->pOrSet!=0 
257d0 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  ){.#if WHERETRAC
257e0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 75 31  E_ENABLED.    u1
257f0 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  6 n = pBuilder->
25800 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69  pOrSet->n;.    i
25810 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20  nt x =.#endif.  
25820 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28    whereOrInsert(
25830 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
25840 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  , pTemplate->pre
25850 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  req, pTemplate->
25860 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  rRun,.          
25870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25880 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c            pTempl
25890 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20  ate->nOut);.#if 
258a0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
258b0 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
258c0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
258d0 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  x8 ){.      sqli
258e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 78  te3DebugPrintf(x
258f0 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22  ?"   or-%d:  ":"
25900 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b     or-X:  ", n);
25910 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
25920 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
25930 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
25940 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  t);.    }.#endif
25950 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25960 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
25970 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
25980 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
25990 70 20 74 6f 20 6f 76 65 72 77 72 69 74 65 2c 20  p to overwrite, 
259a0 6f 72 20 77 68 69 63 68 20 74 61 6b 65 73 0a 20  or which takes. 
259b0 20 2a 2a 20 70 72 69 6f 72 69 74 79 20 6f 76 65   ** priority ove
259c0 72 20 70 54 65 6d 70 6c 61 74 65 2e 0a 20 20 2a  r pTemplate..  *
259d0 2f 0a 20 20 66 6f 72 28 70 70 50 72 65 76 3d 26  /.  for(ppPrev=&
259e0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
259f0 70 3d 2a 70 70 50 72 65 76 3b 20 70 3b 20 70 70  p=*ppPrev; p; pp
25a00 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f  Prev=&p->pNextLo
25a10 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a  op, p=*ppPrev){.
25a20 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21      if( p->iTab!
25a30 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62  =pTemplate->iTab
25a40 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21   || p->iSortIdx!
25a50 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72  =pTemplate->iSor
25a60 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a  tIdx ){.      /*
25a70 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20 69   If either the i
25a80 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20  Tab or iSortIdx 
25a90 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57  values for two W
25aa0 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66  hereLoop are dif
25ab0 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  ferent.      ** 
25ac0 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65  then those Where
25ad0 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65  Loops need to be
25ae0 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61   considered sepa
25af0 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72  rately.  Neither
25b00 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63   is.      ** a c
25b10 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c  andidate to repl
25b20 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a  ace the other. *
25b30 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
25b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
25b50 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
25b60 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68  plementation, th
25b70 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20 69  e rSetup value i
25b80 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20  s either zero.  
25b90 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74    ** or the cost
25ba0 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20   of building an 
25bb0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
25bc0 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20  (NlogN) and the 
25bd0 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20  NlogN.    ** is 
25be0 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d  the same for com
25bf0 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f  patible WhereLoo
25c00 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ps. */.    asser
25c10 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20  t( p->rSetup==0 
25c20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  || pTemplate->rS
25c30 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20  etup==0 .       
25c40 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
25c50 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74  rSetup==pTemplat
25c60 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
25c70 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64    /* whereLoopAd
25c80 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73 20  dBtree() always 
25c90 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e  generates and in
25ca0 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61  serts the automa
25cb0 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  tic index.    **
25cc0 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48 65   case first.  He
25cd0 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63  nce compatible c
25ce0 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f  andidate WhereLo
25cf0 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20 61  ops never have a
25d00 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72   larger.    ** r
25d10 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73  Setup. Call this
25d20 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
25d30 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
25d40 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70  p->rSetup>=pTemp
25d50 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
25d60 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
25d70 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d  req & pTemplate-
25d80 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65  >prereq)==p->pre
25d90 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e 72  req.     && p->r
25da0 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65  Setup<=pTemplate
25db0 2d 3e 72 53 65 74 75 70 0a 20 20 20 20 20 26 26  ->rSetup.     &&
25dc0 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c   p->rRun<=pTempl
25dd0 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 29 7b  ate->rRun.    ){
25de0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
25df0 72 61 6e 63 68 20 74 61 6b 65 6e 20 77 68 65 6e  ranch taken when
25e00 20 70 20 69 73 20 65 71 75 61 6c 20 6f 72 20 62   p is equal or b
25e10 65 74 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70  etter than pTemp
25e20 6c 61 74 65 20 69 6e 20 0a 20 20 20 20 20 20 2a  late in .      *
25e30 2a 20 61 6c 6c 20 6f 66 20 28 31 29 20 64 65 70  * all of (1) dep
25e40 65 6e 64 65 6e 63 65 73 20 28 32 29 20 73 65 74  endences (2) set
25e50 75 70 2d 63 6f 73 74 2c 20 61 6e 64 20 28 33 29  up-cost, and (3)
25e60 20 72 75 6e 2d 63 6f 73 74 2e 20 2a 2f 0a 20 20   run-cost. */.  
25e70 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
25e80 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65  Setup==pTemplate
25e90 2d 3e 72 53 65 74 75 70 20 29 3b 0a 20 20 20 20  ->rSetup );.    
25ea0 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 3c    if( p->nLTerm<
25eb0 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72  pTemplate->nLTer
25ec0 6d 0a 20 20 20 20 20 20 20 26 26 20 28 70 2d 3e  m.       && (p->
25ed0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25ee0 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
25ef0 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
25f00 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
25f10 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
25f20 20 20 20 20 20 26 26 20 70 2d 3e 75 2e 62 74 72       && p->u.btr
25f30 65 65 2e 70 49 6e 64 65 78 3d 3d 70 54 65 6d 70  ee.pIndex==pTemp
25f40 6c 61 74 65 2d 3e 75 2e 62 74 72 65 65 2e 70 49  late->u.btree.pI
25f50 6e 64 65 78 0a 20 20 20 20 20 20 20 26 26 20 70  ndex.       && p
25f60 2d 3e 70 72 65 72 65 71 3d 3d 70 54 65 6d 70 6c  ->prereq==pTempl
25f70 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20  ate->prereq.    
25f80 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
25f90 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78 69  Overwrite an exi
25fa0 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
25fb0 77 69 74 68 20 61 6e 20 73 69 6d 69 6c 61 72 20  with an similar 
25fc0 6f 6e 65 20 74 68 61 74 20 75 73 65 73 0a 20 20  one that uses.  
25fd0 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 65        ** more te
25fe0 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
25ff0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 78   */.        pNex
26000 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  t = p->pNextLoop
26010 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
26020 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26030 20 20 20 20 20 20 2f 2a 20 70 54 65 6d 70 6c 61        /* pTempla
26040 74 65 20 69 73 20 6e 6f 74 20 68 65 6c 70 66 75  te is not helpfu
26050 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65  l..        ** Re
26060 74 75 72 6e 20 77 69 74 68 6f 75 74 20 63 68 61  turn without cha
26070 6e 67 69 6e 67 20 6f 72 20 61 64 64 69 6e 67 20  nging or adding 
26080 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20  anything */.    
26090 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f      goto whereLo
260a0 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20  opInsert_noop;. 
260b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
260c0 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
260d0 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
260e0 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  req)==pTemplate-
260f0 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26 26 20  >prereq.     && 
26100 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61  p->rRun>=pTempla
26110 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 20 26 26  te->rRun.     &&
26120 20 41 4c 57 41 59 53 28 70 2d 3e 72 53 65 74 75   ALWAYS(p->rSetu
26130 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p>=pTemplate->rS
26140 65 74 75 70 29 20 2f 2a 20 53 65 65 20 53 45 54  etup) /* See SET
26150 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f  UP-INVARIANT abo
26160 76 65 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  ve */.    ){.   
26170 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20     /* Overwrite 
26180 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
26190 65 4c 6f 6f 70 20 77 69 74 68 20 61 20 62 65 74  eLoop with a bet
261a0 74 65 72 20 6f 6e 65 3a 20 6f 6e 65 20 74 68 61  ter one: one tha
261b0 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 65  t is.      ** be
261c0 74 74 65 72 20 61 74 20 6f 6e 65 20 6f 66 20 28  tter at one of (
261d0 31 29 20 64 65 70 65 6e 64 65 6e 63 65 73 2c 20  1) dependences, 
261e0 28 32 29 20 73 65 74 75 70 2d 63 6f 73 74 2c 20  (2) setup-cost, 
261f0 6f 72 20 28 33 29 20 72 75 6e 2d 63 6f 73 74 0a  or (3) run-cost.
26200 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 69 73 20        ** and is 
26210 6e 6f 20 77 6f 72 73 65 20 69 6e 20 61 6e 79 20  no worse in any 
26220 6f 66 20 74 68 6f 73 65 20 63 61 74 65 67 6f 72  of those categor
26230 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ies. */.      pN
26240 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f  ext = p->pNextLo
26250 6f 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  op;.      break;
26260 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
26270 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
26280 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73  s point it means
26290 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d   that either p[]
262a0 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77   should be overw
262b0 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68  ritten.  ** with
262c0 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20   pTemplate[] if 
262d0 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69  p[] exists, or i
262e0 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61  f p==NULL then a
262f0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20  llocate a new.  
26300 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64  ** WhereLoop and
26310 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f   insert it..  */
26320 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
26330 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
26340 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
26350 26 20 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28  & 0x8 ){.    if(
26360 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   p!=0 ){.      s
26370 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26380 66 28 22 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b  f("ins-del:  ");
26390 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
263a0 50 72 69 6e 74 28 70 2c 20 70 57 49 6e 66 6f 2d  Print(p, pWInfo-
263b0 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20  >pTabList);.    
263c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
263d0 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e 65  ugPrintf("ins-ne
263e0 77 3a 20 20 22 29 3b 0a 20 20 20 20 77 68 65 72  w:  ");.    wher
263f0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
26400 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d 3e 70 54  late, pWInfo->pT
26410 61 62 4c 69 73 74 29 3b 0a 20 20 7d 0a 23 65 6e  abList);.  }.#en
26420 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  dif.  if( p==0 )
26430 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
26440 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
26450 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
26460 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  p));.    if( p==
26470 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
26480 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65  E_NOMEM;.    whe
26490 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20  reLoopInit(p);. 
264a0 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58 66   }.  whereLoopXf
264b0 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c  er(db, p, pTempl
264c0 61 74 65 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74  ate);.  p->pNext
264d0 4c 6f 6f 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20  Loop = pNext;.  
264e0 2a 70 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 69  *ppPrev = p;.  i
264f0 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
26500 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
26510 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49  BLE)==0 ){.    I
26520 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70  ndex *pIndex = p
26530 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
26540 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  ;.    if( pIndex
26550 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d   && pIndex->tnum
26560 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
26570 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
26580 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
26590 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
265a0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
265b0 65 20 69 66 20 74 68 65 20 69 6e 73 65 72 74 20  e if the insert 
265c0 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68  is a no-op */.wh
265d0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f  ereLoopInsert_no
265e0 6f 70 3a 0a 23 69 66 20 57 48 45 52 45 54 52 41  op:.#if WHERETRA
265f0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
26600 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
26610 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
26620 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26630 74 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29  tf("ins-noop: ")
26640 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50  ;.    whereLoopP
26650 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
26660 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
26670 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
26680 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26690 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20  ;  .}../*.** We 
266a0 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63  have so far matc
266b0 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  hed pBuilder->pN
266c0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
266d0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
266e0 65 78 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72  ex pIndex..** Tr
266f0 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d  y to match one m
26700 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50  ore..**.** If pP
26710 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74  robe->tnum==0, t
26720 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78  hat means pIndex
26730 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78   is a fake index
26740 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a   used for the.**
26750 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
26760 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   KEY..*/.static 
26770 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
26780 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68  BtreeIndex(.  Wh
26790 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
267a0 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a  pBuilder,     /*
267b0 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66   The WhereLoop f
267c0 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75  actory */.  stru
267d0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
267e0 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46  *pSrc,      /* F
267f0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
26800 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a  being analyzed *
26810 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
26820 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
26830 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
26840 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 57 68 65  on pSrc */.  Whe
26850 72 65 43 6f 73 74 20 6e 49 6e 4d 75 6c 20 20 20  reCost nInMul   
26860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26870 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74  log(Number of it
26880 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20  erations due to 
26890 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  IN) */.){.  Wher
268a0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
268b0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
268c0 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c  ;  /* WHERE anal
268d0 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  yse context */. 
268e0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
268f0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
26900 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
26910 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
26920 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
26930 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
26940 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
26950 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f  ection malloc co
26960 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
26970 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
26980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
26990 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
269a0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
269b0 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ion */.  WhereTe
269c0 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
269d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68           /* A Wh
269e0 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f  ereTerm under co
269f0 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  nsideration */. 
26a00 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20   int opMask;    
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74   /* Valid operat
26a30 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  ors for constrai
26a40 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63  nts */.  WhereSc
26a50 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20  an scan;        
26a60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
26a70 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74  ator for WHERE t
26a80 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
26a90 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20  k saved_prereq; 
26aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
26ab0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
26ac0 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20  New->prereq */. 
26ad0 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72   u16 saved_nLTer
26ae0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
26af0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
26b00 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65  ue of pNew->nLTe
26b10 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  rm */.  int save
26b20 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  d_nEq;          
26b30 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
26b40 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
26b50 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a  w->u.btree.nEq *
26b60 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77 73  /.  u32 saved_ws
26b70 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
26b80 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
26b90 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77  value of pNew->w
26ba0 73 46 6c 61 67 73 20 2a 2f 0a 20 20 57 68 65 72  sFlags */.  Wher
26bb0 65 43 6f 73 74 20 73 61 76 65 64 5f 6e 4f 75 74  eCost saved_nOut
26bc0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;           /* O
26bd0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
26be0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20   pNew->nOut */. 
26bf0 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c10 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
26c20 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
26c30 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  able */.  int rc
26c40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
26c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
26c60 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68  urn code */.  Wh
26c70 65 72 65 43 6f 73 74 20 6e 52 6f 77 45 73 74 3b  ereCost nRowEst;
26c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c90 20 45 73 74 69 6d 61 74 65 64 20 69 6e 64 65 78   Estimated index
26ca0 20 73 65 6c 65 63 74 69 76 69 74 79 20 2a 2f 0a   selectivity */.
26cb0 20 20 57 68 65 72 65 43 6f 73 74 20 72 4c 6f 67    WhereCost rLog
26cc0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
26cd0 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f    /* Logarithm o
26ce0 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a  f table size */.
26cf0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f    WhereTerm *pTo
26d00 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30  p = 0, *pBtm = 0
26d10 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74  ; /* Top and bot
26d20 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  tom range constr
26d30 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77  aints */..  pNew
26d40 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
26d50 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  w;.  if( db->mal
26d60 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
26d70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
26d80 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  ..  assert( (pNe
26d90 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
26da0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
26db0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
26dc0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
26dd0 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
26de0 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  T)==0 );.  if( p
26df0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
26e00 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
26e10 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
26e20 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65  O_LT|WO_LE;.  }e
26e30 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  lse if( pProbe->
26e40 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72 63  tnum<=0 || (pSrc
26e50 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
26e60 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  LEFT)!=0 ){.    
26e70 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  opMask = WO_EQ|W
26e80 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_IN|WO_GT|WO_GE
26e90 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20  |WO_LT|WO_LE;.  
26ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73  }else{.    opMas
26eb0 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  k = WO_EQ|WO_IN|
26ec0 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c  WO_ISNULL|WO_GT|
26ed0 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
26ee0 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  E;.  }.  if( pPr
26ef0 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  obe->bUnordered 
26f00 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f  ) opMask &= ~(WO
26f10 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
26f20 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72  WO_LE);..  asser
26f30 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  t( pNew->u.btree
26f40 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43  .nEq<=pProbe->nC
26f50 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 70  olumn );.  if( p
26f60 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
26f70 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75   < pProbe->nColu
26f80 6d 6e 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  mn ){.    iCol =
26f90 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
26fa0 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  n[pNew->u.btree.
26fb0 6e 45 71 5d 3b 0a 20 20 20 20 6e 52 6f 77 45 73  nEq];.    nRowEs
26fc0 74 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70 50  t = whereCost(pP
26fd0 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 70  robe->aiRowEst[p
26fe0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
26ff0 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 52  +1]);.    if( nR
27000 6f 77 45 73 74 3d 3d 30 20 26 26 20 70 50 72 6f  owEst==0 && pPro
27010 62 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  be->onError==OE_
27020 4e 6f 6e 65 20 29 20 6e 52 6f 77 45 73 74 20 3d  None ) nRowEst =
27030 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
27040 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20   iCol = -1;.    
27050 6e 52 6f 77 45 73 74 20 3d 20 30 3b 0a 20 20 7d  nRowEst = 0;.  }
27060 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  .  pTerm = where
27070 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
27080 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
27090 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43  Src->iCursor, iC
270a0 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
270b0 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61              opMa
270c0 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 73  sk, pProbe);.  s
270d0 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d  aved_nEq = pNew-
270e0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
270f0 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70  saved_nLTerm = p
27100 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73  New->nLTerm;.  s
27110 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70  aved_wsFlags = p
27120 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  New->wsFlags;.  
27130 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70  saved_prereq = p
27140 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73  New->prereq;.  s
27150 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77  aved_nOut = pNew
27160 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e  ->nOut;.  pNew->
27170 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 4c  rSetup = 0;.  rL
27180 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28  ogSize = estLog(
27190 77 68 65 72 65 43 6f 73 74 28 70 50 72 6f 62 65  whereCost(pProbe
271a0 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29 29 3b  ->aiRowEst[0]));
271b0 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
271c0 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21  ITE_OK && pTerm!
271d0 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72  =0; pTerm = wher
271e0 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
271f0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d  ){.    int nIn =
27200 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
27210 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20  E_ENABLE_STAT4. 
27220 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64     int nRecValid
27230 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65   = pBuilder->nRe
27240 63 56 61 6c 69 64 3b 0a 20 20 20 20 69 6e 74 20  cValid;.    int 
27250 6e 4d 61 78 52 6f 77 63 6e 74 20 3d 20 70 42 75  nMaxRowcnt = pBu
27260 69 6c 64 65 72 2d 3e 6e 4d 61 78 52 6f 77 63 6e  ilder->nMaxRowcn
27270 74 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  t;.    if( (pTer
27280 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
27290 4d 5f 56 4e 55 4c 4c 29 21 3d 30 20 26 26 20 70  M_VNULL)!=0 && p
272a0 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  Src->pTab->aCol[
272b0 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b  iCol].notNull ){
272c0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
272d0 20 2f 2a 20 73 6b 69 70 20 49 53 20 4e 4f 54 20   /* skip IS NOT 
272e0 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
272f0 20 6f 6e 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63   on a NOT NULL c
27300 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 7d 0a 23  olumn */.    }.#
27310 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 54  endif.    if( pT
27320 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
27330 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
27340 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  f ) continue;.. 
27350 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
27360 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73   = saved_wsFlags
27370 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
27380 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
27390 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nEq;.    pNew->n
273a0 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
273b0 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68  Term;.    if( wh
273c0 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
273d0 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
273e0 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b  Term+1) ) break;
273f0 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70   /* OOM */.    p
27400 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
27410 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54  ->nLTerm++] = pT
27420 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  erm;.    pNew->p
27430 72 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70  rereq = (saved_p
27440 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70  rereq | pTerm->p
27450 72 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70  rereqRight) & ~p
27460 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  New->maskSelf;. 
27470 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
27480 72 4c 6f 67 53 69 7a 65 3b 20 2f 2a 20 42 61 73  rLogSize; /* Bas
27490 65 6c 69 6e 65 20 63 6f 73 74 20 69 73 20 6c 6f  eline cost is lo
274a0 67 32 28 4e 29 2e 20 20 41 64 6a 75 73 74 6d 65  g2(N).  Adjustme
274b0 6e 74 73 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  nts below */.   
274c0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
274d0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b  rator & WO_IN ){
274e0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
274f0 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
27500 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  r;.      pNew->w
27510 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
27520 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20  COLUMN_IN;.     
27530 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
27540 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
27550 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
27560 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53       /* "x IN (S
27570 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55  ELECT ...)":  TU
27580 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54  NING: the SELECT
27590 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73   returns 25 rows
275a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
275b0 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34  = 46;  assert( 4
275c0 36 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35 29  6==whereCost(25)
275d0 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   );.      }else 
275e0 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
275f0 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78  ->x.pList && pEx
27600 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
27610 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
27620 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20  * "x IN (value, 
27630 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a  value, ...)" */.
27640 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 77 68          nIn = wh
27650 65 72 65 43 6f 73 74 28 70 45 78 70 72 2d 3e 78  ereCost(pExpr->x
27660 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  .pList->nExpr);.
27670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
27680 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 3b  ew->rRun += nIn;
27690 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
276a0 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20  tree.nEq++;.    
276b0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
276c0 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20  RowEst + nInMul 
276d0 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  + nIn;.    }else
276e0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
276f0 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 29 20  rator & (WO_EQ) 
27700 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
27710 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
27720 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
27730 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  NULL|WHERE_COLUM
27740 4e 5f 49 4e 29 29 21 3d 30 0a 20 20 20 20 20 20  N_IN))!=0.      
27750 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6e              || n
27760 49 6e 4d 75 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  InMul==0 );.    
27770 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
27780 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
27790 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  EQ;.      if( iC
277a0 6f 6c 3c 30 20 20 0a 20 20 20 20 20 20 20 7c 7c  ol<0  .       ||
277b0 20 28 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f   (pProbe->onErro
277c0 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 6e 49  r!=OE_None && nI
277d0 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  nMul==0.        
277e0 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74     && pNew->u.bt
277f0 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d  ree.nEq==pProbe-
27800 3e 6e 43 6f 6c 75 6d 6e 2d 31 29 0a 20 20 20 20  >nColumn-1).    
27810 20 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73    ){.        ass
27820 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c  ert( (pNew->wsFl
27830 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
27840 4d 4e 5f 49 4e 29 3d 3d 30 20 7c 7c 20 69 43 6f  MN_IN)==0 || iCo
27850 6c 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  l<0 );.        p
27860 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
27870 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
27880 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
27890 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
278a0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
278b0 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49  t = nRowEst + nI
278c0 6e 4d 75 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  nMul;.    }else 
278d0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
278e0 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
278f0 4c 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  L) ){.      pNew
27900 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
27910 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a  RE_COLUMN_NULL;.
27920 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
27930 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20  ree.nEq++;.     
27940 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 53 20 4e   /* TUNING: IS N
27950 55 4c 4c 20 73 65 6c 65 63 74 73 20 32 20 72 6f  ULL selects 2 ro
27960 77 73 20 2a 2f 0a 20 20 20 20 20 20 6e 49 6e 20  ws */.      nIn 
27970 3d 20 31 30 3b 20 20 61 73 73 65 72 74 28 20 31  = 10;  assert( 1
27980 30 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 29 20  0==whereCost(2) 
27990 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
279a0 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20  Out = nRowEst + 
279b0 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
279c0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
279d0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
279e0 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a  WO_GT|WO_GE) ){.
279f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27a00 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
27a10 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20   & WO_GT );.    
27a20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
27a30 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
27a40 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e  O_GE );.      pN
27a50 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
27a60 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
27a70 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  E|WHERE_BTM_LIMI
27a80 54 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  T;.      pBtm = 
27a90 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f  pTerm;.      pTo
27aa0 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  p = 0;.    }else
27ab0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
27ac0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
27ad0 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
27ae0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
27af0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
27b00 61 74 6f 72 20 26 20 57 4f 5f 4c 54 20 29 3b 0a  ator & WO_LT );.
27b10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27b20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
27b30 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20   & WO_LE );.    
27b40 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
27b50 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
27b60 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f  RANGE|WHERE_TOP_
27b70 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f  LIMIT;.      pTo
27b80 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  p = pTerm;.     
27b90 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77   pBtm = (pNew->w
27ba0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
27bb0 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20  TM_LIMIT)!=0 ?. 
27bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bd0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
27be0 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d  [pNew->nLTerm-2]
27bf0 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   : 0;.    }.    
27c00 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
27c10 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
27c20 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
27c30 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 61  /* Adjust nOut a
27c40 6e 64 20 72 52 75 6e 20 66 6f 72 20 53 54 41 54  nd rRun for STAT
27c50 33 20 72 61 6e 67 65 20 76 61 6c 75 65 73 20 2a  3 range values *
27c60 2f 0a 20 20 20 20 20 20 57 68 65 72 65 43 6f 73  /.      WhereCos
27c70 74 20 72 44 69 76 3b 0a 20 20 20 20 20 20 77 68  t rDiv;.      wh
27c80 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
27c90 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
27ca0 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26 72  , pBtm, pTop, &r
27cb0 44 69 76 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  Div);.      pNew
27cc0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
27cd0 4f 75 74 3e 72 44 69 76 2b 31 30 20 3f 20 73 61  Out>rDiv+10 ? sa
27ce0 76 65 64 5f 6e 4f 75 74 20 2d 20 72 44 69 76 20  ved_nOut - rDiv 
27cf0 3a 20 31 30 3b 0a 20 20 20 20 7d 0a 23 69 66 64  : 10;.    }.#ifd
27d00 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
27d10 5f 53 54 41 54 34 0a 20 20 20 20 69 66 28 20 6e  _STAT4.    if( n
27d20 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 70 50 72 6f  InMul==0 && pPro
27d30 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 4f  be->nSample && O
27d40 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
27d50 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 74  ed(db, SQLITE_St
27d60 61 74 33 29 20 29 7b 0a 20 20 20 20 20 20 45 78  at3) ){.      Ex
27d70 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
27d80 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
27d90 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30  tRowcnt nOut = 0
27da0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
27db0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
27dc0 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
27dd0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
27de0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
27df0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
27e00 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 74  _EQ );.        t
27e10 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
27e20 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
27e30 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  SNULL );.       
27e40 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
27e50 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
27e60 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d  pBuilder, pExpr-
27e70 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b  >pRight, &nOut);
27e80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27e90 20 6e 4f 75 74 3d 3d 30 7c 7c 70 42 75 69 6c 64   nOut==0||pBuild
27ea0 65 72 2d 3e 6e 4d 61 78 52 6f 77 63 6e 74 3d 3d  er->nMaxRowcnt==
27eb0 30 7c 7c 6e 4f 75 74 3c 3d 70 42 75 69 6c 64 65  0||nOut<=pBuilde
27ec0 72 2d 3e 6e 4d 61 78 52 6f 77 63 6e 74 29 3b 0a  r->nMaxRowcnt);.
27ed0 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74          if( nOut
27ee0 20 29 20 70 42 75 69 6c 64 65 72 2d 3e 6e 4d 61   ) pBuilder->nMa
27ef0 78 52 6f 77 63 6e 74 20 3d 20 6e 4f 75 74 3b 0a  xRowcnt = nOut;.
27f00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
27f10 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
27f20 72 20 26 20 57 4f 5f 49 4e 29 0a 20 20 20 20 20  r & WO_IN).     
27f30 20 20 20 20 20 20 20 20 26 26 20 20 21 45 78 70          &&  !Exp
27f40 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
27f50 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
27f60 29 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  )  ){.        rc
27f70 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73   = whereInScanEs
27f80 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
27f90 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  er, pExpr->x.pLi
27fa0 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20  st, &nOut);.    
27fb0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
27fc0 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20 72 63 3d  ( nOut==0 || rc=
27fd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
27fe0 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29 20 70      if( nOut ) p
27ff0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 77 68 65 72  New->nOut = wher
28000 65 43 6f 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20  eCost(nOut);.   
28010 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
28020 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
28030 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   & (WHERE_IDX_ON
28040 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d  LY|WHERE_IPK))==
28050 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 61  0 ){.      /* Ea
28060 63 68 20 72 6f 77 20 69 6e 76 6f 6c 76 65 73 20  ch row involves 
28070 61 20 73 74 65 70 20 6f 66 20 74 68 65 20 69 6e  a step of the in
28080 64 65 78 2c 20 74 68 65 6e 20 61 20 62 69 6e 61  dex, then a bina
28090 72 79 20 73 65 61 72 63 68 20 6f 66 0a 20 20 20  ry search of.   
280a0 20 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 74     ** the main t
280b0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e  able */.      pN
280c0 65 77 2d 3e 72 52 75 6e 20 3d 20 20 77 68 65 72  ew->rRun =  wher
280d0 65 43 6f 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  eCostAdd(pNew->r
280e0 52 75 6e 2c 20 72 4c 6f 67 53 69 7a 65 3e 32 37  Run, rLogSize>27
280f0 20 3f 20 72 4c 6f 67 53 69 7a 65 2d 31 37 20 3a   ? rLogSize-17 :
28100 20 31 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   10);.    }.    
28110 2f 2a 20 53 74 65 70 20 63 6f 73 74 20 66 6f 72  /* Step cost for
28120 20 65 61 63 68 20 6f 75 74 70 75 74 20 72 6f 77   each output row
28130 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52   */.    pNew->rR
28140 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64  un = whereCostAd
28150 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e  d(pNew->rRun, pN
28160 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 2f  ew->nOut);.    /
28170 2a 20 54 42 44 3a 20 41 64 6a 75 73 74 20 6e 4f  * TBD: Adjust nO
28180 75 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ut for additiona
28190 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  l constraints */
281a0 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
281b0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
281c0 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69  er, pNew);.    i
281d0 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  f( (pNew->wsFlag
281e0 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
281f0 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  MIT)==0.     && 
28200 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28210 71 3c 28 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  q<(pProbe->nColu
28220 6d 6e 20 2b 20 28 70 50 72 6f 62 65 2d 3e 7a 4e  mn + (pProbe->zN
28230 61 6d 65 21 3d 30 29 29 0a 20 20 20 20 29 7b 0a  ame!=0)).    ){.
28240 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41        whereLoopA
28250 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
28260 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
28270 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29  obe, nInMul+nIn)
28280 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
28290 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
282a0 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  T4.    pBuilder-
282b0 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65  >nRecValid = nRe
282c0 63 56 61 6c 69 64 3b 0a 20 20 20 20 70 42 75 69  cValid;.    pBui
282d0 6c 64 65 72 2d 3e 6e 4d 61 78 52 6f 77 63 6e 74  lder->nMaxRowcnt
282e0 20 3d 20 6e 4d 61 78 52 6f 77 63 6e 74 3b 0a 23   = nMaxRowcnt;.#
282f0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77  endif.  }.  pNew
28300 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64  ->prereq = saved
28310 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d  _prereq;.  pNew-
28320 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
28330 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77  aved_nEq;.  pNew
28340 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
28350 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65  d_wsFlags;.  pNe
28360 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
28370 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  nOut;.  pNew->nL
28380 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
28390 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  erm;.  return rc
283a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
283b0 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20  n True if it is 
283c0 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70 49  possible that pI
283d0 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75 73  ndex might be us
283e0 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65  eful in.** imple
283f0 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45  menting the ORDE
28400 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70  R BY clause in p
28410 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52  Builder..**.** R
28420 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70  eturn False if p
28430 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74  Builder does not
28440 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45   contain an ORDE
28450 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a  R BY clause or.*
28460 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * if there is no
28470 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20   way for pIndex 
28480 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20  to be useful in 
28490 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61  implementing tha
284a0 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c  t.** ORDER BY cl
284b0 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
284c0 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65  int indexMightHe
284d0 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20  lpWithOrderBy(. 
284e0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
284f0 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49  r *pBuilder,.  I
28500 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20  ndex *pIndex,.  
28510 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20  int iCursor.){. 
28520 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a   ExprList *pOB;.
28530 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20    int ii, jj;.. 
28540 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e   if( pIndex->bUn
28550 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e  ordered ) return
28560 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d   0;.  if( (pOB =
28570 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
28580 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20  o->pOrderBy)==0 
28590 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
285a0 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e  r(ii=0; ii<pOB->
285b0 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
285c0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
285d0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
285e0 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69  ollate(pOB->a[ii
285f0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
28600 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
28610 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
28620 30 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  0;.    if( pExpr
28630 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f  ->iTable==iCurso
28640 72 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  r ){.      for(j
28650 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e  j=0; jj<pIndex->
28660 6e 43 6f 6c 75 6d 6e 3b 20 6a 6a 2b 2b 29 7b 0a  nColumn; jj++){.
28670 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
28680 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64  r->iColumn==pInd
28690 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d  ex->aiColumn[jj]
286a0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
286b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
286c0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
286d0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69 74  .** Return a bit
286e0 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20 69 6e  mask where 1s in
286f0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
28700 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
28710 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74  lumn of.** the t
28720 61 62 6c 65 20 69 73 20 75 73 65 64 20 62 79 20  able is used by 
28730 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20  an index.  Only 
28740 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c  the first 63 col
28750 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65  umns are conside
28760 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  red..*/.static B
28770 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e  itmask columnsIn
28780 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64  Index(Index *pId
28790 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20  x){.  Bitmask m 
287a0 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
287b0 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c  for(j=pIdx->nCol
287c0 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  umn-1; j>=0; j--
287d0 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
287e0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
287f0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
28800 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  x==BMS-1 );.    
28810 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
28820 2d 32 20 29 3b 0a 20 20 20 20 69 66 28 20 78 3c  -2 );.    if( x<
28830 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53  BMS-1 ) m |= MAS
28840 4b 42 49 54 28 78 29 3b 0a 20 20 7d 0a 20 20 72  KBIT(x);.  }.  r
28850 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43  eturn m;.}../* C
28860 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
28870 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77   partial index w
28880 69 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68  ith pPartIndexWh
28890 65 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a  ere can be used.
288a0 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
288b0 74 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e  t query.  Return
288c0 20 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20   true if it can 
288d0 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  be and false if 
288e0 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
288f0 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61  nt whereUsablePa
28900 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69  rtialIndex(int i
28910 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65  Tab, WhereClause
28920 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68   *pWC, Expr *pWh
28930 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ere){.  int i;. 
28940 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
28950 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54  m;.  for(i=0, pT
28960 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
28970 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
28980 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
28990 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
289a0 69 65 73 45 78 70 72 28 70 54 65 72 6d 2d 3e 70  iesExpr(pTerm->p
289b0 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54  Expr, pWhere, iT
289c0 61 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ab) ) return 1;.
289d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
289e0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
289f0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
28a00 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ts for a single 
28a10 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
28a20 6e 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c  n where the tabl
28a30 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64  e.** is idenfied
28a40 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e   by pBuilder->pN
28a50 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20  ew->iTab.  That 
28a60 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74  table is guarant
28a70 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62  eed to be.** a b
28a80 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74  -tree table, not
28a90 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
28aa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28ab0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
28ac0 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  e(.  WhereLoopBu
28ad0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
28ae0 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
28af0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
28b00 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28b20 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65 73   Extra prereques
28b30 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74  ites for using t
28b40 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  his table */.){.
28b50 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
28b60 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nfo;          /*
28b70 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20   WHERE analysis 
28b80 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
28b90 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20  ex *pProbe;     
28ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
28bb0 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c  ndex we are eval
28bc0 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65  uating */.  Inde
28bd0 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20  x sPk;          
28be0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b          /* A fak
28bf0 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66  e index object f
28c00 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  or the primary k
28c10 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  ey */.  tRowcnt 
28c20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20  aiRowEstPk[2];  
28c30 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77      /* The aiRow
28c40 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20  Est[] value for 
28c50 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f  the sPk index */
28c60 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50  .  int aiColumnP
28c70 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f  k = -1;        /
28c80 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20  * The aColumn[] 
28c90 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50  value for the sP
28ca0 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63  k index */.  Src
28cb0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
28cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28cd0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
28ce0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28cf0 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20  item *pSrc;  /* 
28d00 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
28d10 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61 64  btree term to ad
28d20 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  d */.  WhereLoop
28d30 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
28d40 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57     /* Template W
28d50 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
28d60 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
28d70 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
28d80 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
28d90 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49 64  */.  int iSortId
28da0 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  x = 1;          
28db0 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72   /* Index number
28dc0 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20 20   */.  int b;    
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28de0 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76    /* A boolean v
28df0 61 6c 75 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  alue */.  WhereC
28e00 6f 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20  ost rSize;      
28e10 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20        /* number 
28e20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
28e30 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  able */.  WhereC
28e40 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  ost rLogSize;   
28e50 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74        /* Logarit
28e60 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  hm of the number
28e70 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
28e80 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  table */.  Where
28e90 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
28ea0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
28eb0 72 73 65 64 20 57 48 45 52 45 20 63 6c 61 75 73  rsed WHERE claus
28ec0 65 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d  e */.  .  pNew =
28ed0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
28ee0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
28ef0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
28f00 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
28f10 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70  o->pTabList;.  p
28f20 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Src = pTabList->
28f30 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
28f40 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
28f50 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28  ->pWC;.  assert(
28f60 20 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63   !IsVirtual(pSrc
28f70 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66  ->pTab) );..  if
28f80 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29  ( pSrc->pIndex )
28f90 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45  {.    /* An INDE
28fa0 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70  XED BY clause sp
28fb0 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63  ecifies a partic
28fc0 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73  ular index to us
28fd0 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20  e */.    pProbe 
28fe0 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a  = pSrc->pIndex;.
28ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
29000 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45  There is no INDE
29010 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20  XED BY clause.  
29020 43 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e  Create a fake In
29030 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f  dex object in lo
29040 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  cal.    ** varia
29050 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65  ble sPk to repre
29060 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70  sent the rowid p
29070 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
29080 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20  .  Make this.   
29090 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74   ** fake index t
290a0 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68  he first in a ch
290b0 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a  ain of Index obj
290c0 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66  ects with all of
290d0 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a   the real.    **
290e0 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c   indices to foll
290f0 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ow */.    Index 
29100 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *pFirst;        
29110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
29120 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63  st of real indic
29130 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  es on the table 
29140 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
29150 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e  Pk, 0, sizeof(In
29160 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e  dex));.    sPk.n
29170 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20  Column = 1;.    
29180 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26  sPk.aiColumn = &
29190 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20  aiColumnPk;.    
291a0 73 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61  sPk.aiRowEst = a
291b0 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73  iRowEstPk;.    s
291c0 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f  Pk.onError = OE_
291d0 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b  Replace;.    sPk
291e0 2e 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e  .pTable = pSrc->
291f0 70 54 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45  pTab;.    aiRowE
29200 73 74 50 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e  stPk[0] = pSrc->
29210 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20  pTab->nRowEst;. 
29220 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d     aiRowEstPk[1]
29230 20 3d 20 31 3b 0a 20 20 20 20 70 46 69 72 73 74   = 1;.    pFirst
29240 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70   = pSrc->pTab->p
29250 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
29260 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d  Src->notIndexed=
29270 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
29280 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  he real indices 
29290 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  of the table are
292a0 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64   only considered
292b0 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   if the.      **
292c0 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61   NOT INDEXED qua
292d0 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65  lifier is omitte
292e0 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20  d from the FROM 
292f0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
29300 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72  sPk.pNext = pFir
29310 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  st;.    }.    pP
29320 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d  robe = &sPk;.  }
29330 0a 20 20 72 53 69 7a 65 20 3d 20 77 68 65 72 65  .  rSize = where
29340 43 6f 73 74 28 70 53 72 63 2d 3e 70 54 61 62 2d  Cost(pSrc->pTab-
29350 3e 6e 52 6f 77 45 73 74 29 3b 0a 20 20 72 4c 6f  >nRowEst);.  rLo
29360 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72  gSize = estLog(r
29370 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 41 75 74  Size);..  /* Aut
29380 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a  omatic indexes *
29390 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65  /.  if( !pBuilde
293a0 72 2d 3e 70 4f 72 53 65 74 0a 20 20 20 26 26 20  r->pOrSet.   && 
293b0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
293c0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
293d0 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d  ITE_AutoIndex)!=
293e0 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49  0.   && pSrc->pI
293f0 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26 20 21 70  ndex==0.   && !p
29400 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  Src->viaCoroutin
29410 65 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 6e  e.   && !pSrc->n
29420 6f 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26 20  otIndexed.   && 
29430 21 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61  !pSrc->isCorrela
29440 74 65 64 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ted.  ){.    /* 
29450 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e  Generate auto-in
29460 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a  dex WhereLoops *
29470 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
29480 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72  *pTerm;.    Wher
29490 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20  eTerm *pWCEnd = 
294a0 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54  pWC->a + pWC->nT
294b0 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  erm;.    for(pTe
294c0 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53  rm=pWC->a; rc==S
294d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72  QLITE_OK && pTer
294e0 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
294f0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54  +){.      if( pT
29500 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
29510 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
29520 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  f ) continue;.  
29530 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
29540 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
29550 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20   pSrc, 0) ){.   
29560 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
29570 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20  ee.nEq = 1;.    
29580 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
29590 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
295a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
295b0 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
295c0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
295d0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
295e0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d   /* TUNING: One-
295f0 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f  time cost for co
29600 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f  mputing the auto
29610 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20  matic index is. 
29620 20 20 20 20 20 20 20 2a 2a 20 61 70 70 72 6f 78         ** approx
29630 69 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32  imately 7*N*log2
29640 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74  (N) where N is t
29650 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
29660 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  s in.        ** 
29670 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
29680 69 6e 64 65 78 65 64 2e 20 2a 2f 0a 20 20 20 20  indexed. */.    
29690 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
296a0 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53   = rLogSize + rS
296b0 69 7a 65 20 2b 20 32 38 3b 20 20 61 73 73 65 72  ize + 28;  asser
296c0 74 28 20 32 38 3d 3d 77 68 65 72 65 43 6f 73 74  t( 28==whereCost
296d0 28 37 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  (7) );.        /
296e0 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69  * TUNING: Each i
296f0 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c  ndex lookup yiel
29700 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68  ds 20 rows in th
29710 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20  e table.  This. 
29720 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72         ** is mor
29730 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c  e than the usual
29740 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77   guess of 10 row
29750 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  s, since we have
29760 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20   no way.        
29770 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e 67 20 68  ** of knowning h
29780 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74 68 65  ow selective the
29790 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69   index will ulti
297a0 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77  mately be.  It w
297b0 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
297c0 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61  not be unreasona
297d0 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73  ble to make this
297e0 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67   value much larg
297f0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  er. */.        p
29800 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20  New->nOut = 43; 
29810 20 61 73 73 65 72 74 28 20 34 33 3d 3d 77 68 65   assert( 43==whe
29820 72 65 43 6f 73 74 28 32 30 29 20 29 3b 0a 20 20  reCost(20) );.  
29830 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
29840 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   = whereCostAdd(
29850 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e  rLogSize,pNew->n
29860 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Out);.        pN
29870 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
29880 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a  ERE_AUTO_INDEX;.
29890 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
298a0 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c 20  ereq = mExtra | 
298b0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
298c0 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
298d0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
298e0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
298f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29900 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f    }..  /* Loop o
29910 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a  ver all indices.
29920 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d    */.  for(; rc=
29930 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
29940 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72  robe; pProbe=pPr
29950 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72  obe->pNext, iSor
29960 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28  tIdx++){.    if(
29970 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
29980 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26  xWhere!=0.     &
29990 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61  & !whereUsablePa
299a0 72 74 69 61 6c 49 6e 64 65 78 28 70 4e 65 77 2d  rtialIndex(pNew-
299b0 3e 69 54 61 62 2c 20 70 57 43 2c 20 70 50 72 6f  >iTab, pWC, pPro
299c0 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  be->pPartIdxWher
299d0 65 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  e) ){.      cont
299e0 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61  inue;  /* Partia
299f0 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70  l index inapprop
29a00 72 69 61 74 65 20 66 6f 72 20 74 68 69 73 20 71  riate for this q
29a10 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  uery */.    }.  
29a20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
29a30 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  nEq = 0;.    pNe
29a40 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  w->nLTerm = 0;. 
29a50 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
29a60 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  x = 0;.    pNew-
29a70 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
29a80 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
29a90 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65 77  mExtra;.    pNew
29aa0 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
29ab0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
29ac0 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62  e.pIndex = pProb
29ad0 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78  e;.    b = index
29ae0 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
29af0 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70  erBy(pBuilder, p
29b00 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75  Probe, pSrc->iCu
29b10 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68  rsor);.    /* Th
29b20 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  e ONEPASS_DESIRE
29b30 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63  D flags never oc
29b40 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77 69  curs together wi
29b50 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  th ORDER BY */. 
29b60 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49 6e     assert( (pWIn
29b70 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
29b80 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
29b90 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d  ESIRED)==0 || b=
29ba0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
29bb0 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b  robe->tnum<=0 ){
29bc0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65  .      /* Intege
29bd0 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  r primary key in
29be0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  dex */.      pNe
29bf0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
29c00 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f  RE_IPK;..      /
29c10 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  * Full table sca
29c20 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  n */.      pNew-
29c30 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
29c40 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20  iSortIdx : 0;.  
29c50 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
29c60 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c  ost of full tabl
29c70 65 20 73 63 61 6e 20 69 73 20 33 2a 28 4e 20 2b  e scan is 3*(N +
29c80 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20 20   log2(N))..     
29c90 20 2a 2a 20 20 2b 20 20 54 68 65 20 65 78 74 72   **  +  The extr
29ca0 61 20 33 20 66 61 63 74 6f 72 20 69 73 20 74 6f  a 3 factor is to
29cb0 20 65 6e 63 6f 75 72 61 67 65 20 74 68 65 20 75   encourage the u
29cc0 73 65 20 6f 66 20 69 6e 64 65 78 65 64 20 6c 6f  se of indexed lo
29cd0 6f 6b 75 70 73 0a 20 20 20 20 20 20 2a 2a 20 20  okups.      **  
29ce0 20 20 20 6f 76 65 72 20 66 75 6c 6c 20 73 63 61     over full sca
29cf0 6e 73 2e 20 20 41 20 73 6d 61 6c 6c 65 72 20 63  ns.  A smaller c
29d00 6f 6e 73 74 61 6e 74 20 32 20 69 73 20 75 73 65  onstant 2 is use
29d10 64 20 66 6f 72 20 63 6f 76 65 72 69 6e 67 0a 20  d for covering. 
29d20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65       **     inde
29d30 78 20 73 63 61 6e 73 20 73 6f 20 74 68 61 74 20  x scans so that 
29d40 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
29d50 20 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 66 61   scan will be fa
29d60 76 6f 72 65 64 20 6f 76 65 72 0a 20 20 20 20 20  vored over.     
29d70 20 2a 2a 20 20 20 20 20 61 20 74 61 62 6c 65 20   **     a table 
29d80 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 70  scan. */.      p
29d90 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77 68 65 72  New->rRun = wher
29da0 65 43 6f 73 74 41 64 64 28 72 53 69 7a 65 2c 72  eCostAdd(rSize,r
29db0 4c 6f 67 53 69 7a 65 29 20 2b 20 31 36 3b 0a 20  LogSize) + 16;. 
29dc0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
29dd0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
29de0 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
29df0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
29e00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29e10 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53    Bitmask m = pS
29e20 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63  rc->colUsed & ~c
29e30 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50  olumnsInIndex(pP
29e40 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 70 4e 65  robe);.      pNe
29e50 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d  w->wsFlags = (m=
29e60 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58  =0) ? (WHERE_IDX
29e70 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45  _ONLY|WHERE_INDE
29e80 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44  XED) : WHERE_IND
29e90 45 58 45 44 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  EXED;..      /* 
29ea0 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e  Full scan via in
29eb0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
29ec0 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d   b.       || ( m
29ed0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
29ee0 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
29ef0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ed==0.         &
29f00 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
29f10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
29f20 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
29f30 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  0.         && sq
29f40 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
29f50 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 20  g.bUseCis.      
29f60 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
29f70 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f  onEnabled(pWInfo
29f80 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  ->pParse->db, SQ
29f90 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61  LITE_CoverIdxSca
29fa0 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20  n).          ). 
29fb0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
29fc0 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
29fd0 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
29fe0 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  0;.        if( m
29ff0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2a000 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
2a010 20 6f 66 20 61 20 63 6f 76 65 72 69 6e 67 20 69   of a covering i
2a020 6e 64 65 78 20 73 63 61 6e 20 69 73 20 32 2a 28  ndex scan is 2*(
2a030 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20  N + log2(N))..  
2a040 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54          **  +  T
2a050 68 65 20 65 78 74 72 61 20 32 20 66 61 63 74 6f  he extra 2 facto
2a060 72 20 69 73 20 74 6f 20 65 6e 63 6f 75 72 61 67  r is to encourag
2a070 65 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64  e the use of ind
2a080 65 78 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20  exed lookups.   
2a090 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 76         **     ov
2a0a0 65 72 20 69 6e 64 65 78 20 73 63 61 6e 73 2e 20  er index scans. 
2a0b0 20 41 20 74 61 62 6c 65 20 73 63 61 6e 20 75 73   A table scan us
2a0c0 65 73 20 61 20 66 61 63 74 6f 72 20 6f 66 20 33  es a factor of 3
2a0d0 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   so that.       
2a0e0 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20     **     index 
2a0f0 73 63 61 6e 73 20 61 72 65 20 66 61 76 6f 72 65  scans are favore
2a100 64 20 6f 76 65 72 20 74 61 62 6c 65 20 73 63 61  d over table sca
2a110 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns..          **
2a120 20 20 2b 20 20 49 66 20 74 68 69 73 20 63 6f 76    +  If this cov
2a130 65 72 69 6e 67 20 69 6e 64 65 78 20 6d 69 67 68  ering index migh
2a140 74 20 61 6c 73 6f 20 68 65 6c 70 20 73 61 74 69  t also help sati
2a150 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
2a160 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20  .          **   
2a170 20 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74    clause, then t
2a180 68 65 20 63 6f 73 74 20 69 73 20 66 75 64 67 65  he cost is fudge
2a190 64 20 64 6f 77 6e 20 73 6c 69 67 68 74 6c 79 20  d down slightly 
2a1a0 73 6f 20 74 68 61 74 20 74 68 69 73 0a 20 20 20  so that this.   
2a1b0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e         **     in
2a1c0 64 65 78 20 69 73 20 66 61 76 6f 72 65 64 20 61  dex is favored a
2a1d0 62 6f 76 65 20 6f 74 68 65 72 20 69 6e 64 69 63  bove other indic
2a1e0 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 20  es that have no 
2a1f0 68 6f 70 65 20 6f 66 0a 20 20 20 20 20 20 20 20  hope of.        
2a200 20 20 2a 2a 20 20 20 20 20 68 65 6c 70 69 6e 67    **     helping
2a210 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
2a220 42 59 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  BY. */.         
2a230 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 31 30   pNew->rRun = 10
2a240 20 2b 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   + whereCostAdd(
2a250 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20  rSize,rLogSize) 
2a260 2d 20 62 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  - b;.        }el
2a270 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2a280 73 65 72 74 28 20 62 21 3d 30 20 29 3b 20 0a 20  sert( b!=0 ); . 
2a290 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49           /* TUNI
2a2a0 4e 47 3a 20 43 6f 73 74 20 6f 66 20 73 63 61 6e  NG: Cost of scan
2a2b0 6e 69 6e 67 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  ning a non-cover
2a2c0 69 6e 67 20 69 6e 64 65 78 20 69 73 20 28 4e 2b  ing index is (N+
2a2d0 31 29 2a 6c 6f 67 32 28 4e 29 0a 20 20 20 20 20  1)*log2(N).     
2a2e0 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 65       ** which we
2a2f0 20 77 69 6c 6c 20 73 69 6d 70 6c 69 66 79 20 74   will simplify t
2a300 6f 20 6a 75 73 74 20 4e 2a 6c 6f 67 32 28 4e 29  o just N*log2(N)
2a310 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 4e   */.          pN
2a320 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65  ew->rRun = rSize
2a330 20 2b 20 72 4c 6f 67 53 69 7a 65 3b 0a 20 20 20   + rLogSize;.   
2a340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2a350 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2a360 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2a370 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
2a380 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
2a390 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2a3a0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2a3b0 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
2a3c0 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
2a3d0 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53  be, 0);.#ifdef S
2a3e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
2a3f0 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  T4.    sqlite3St
2a400 61 74 34 50 72 6f 62 65 46 72 65 65 28 70 42 75  at4ProbeFree(pBu
2a410 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20  ilder->pRec);.  
2a420 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
2a430 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70  Valid = 0;.    p
2a440 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
2a450 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  0;.#endif..    /
2a460 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
2a470 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
2a480 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74  use, then only t
2a490 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73  hat one index is
2a4a0 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
2a4b0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
2a4c0 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62 72  Src->pIndex ) br
2a4d0 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
2a4e0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
2a4f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2a500 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
2a510 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
2a520 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
2a530 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
2a540 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a  n identified by.
2a550 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  ** pBuilder->pNe
2a560 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
2a570 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
2a580 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74 75  ed to be a virtu
2a590 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
2a5a0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
2a5b0 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57  pAddVirtual(.  W
2a5c0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2a5d0 2a 70 42 75 69 6c 64 65 72 20 20 20 2f 2a 20 57  *pBuilder   /* W
2a5e0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
2a5f0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  rmation */.){.  
2a600 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2a610 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
2a620 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63  WHERE analysis c
2a630 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
2a640 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
2a650 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a660 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
2a670 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
2a680 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
2a690 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
2a6a0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
2a6b0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2a6c0 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  pSrc;   /* The F
2a6d0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
2a6e0 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54  to search */.  T
2a6f0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
2a700 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c  lite3 *db;.  sql
2a710 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
2a720 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72  *pIdxInfo;.  str
2a730 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
2a740 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
2a750 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
2a760 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
2a770 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
2a780 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
2a790 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
2a7a0 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69  nt i, j;.  int i
2a7b0 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20  Term, mxTerm;.  
2a7c0 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  int nConstraint;
2a7d0 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20  .  int seenIn = 
2a7e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2a7f0 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 49 4e  /* True if an IN
2a800 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 65 65   operator is see
2a810 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56  n */.  int seenV
2a820 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
2a830 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2a840 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f   non-constant co
2a850 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65 65 6e  nstraint is seen
2a860 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61 73 65   */.  int iPhase
2a870 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a880 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77     /* 0: const w
2a890 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c  /o IN, 1: const,
2a8a0 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49   2: no IN,  2: I
2a8b0 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  N */.  WhereLoop
2a8c0 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
2a8d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2a8e0 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
2a8f0 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50  er->pWInfo;.  pP
2a900 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
2a910 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
2a920 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20  arse->db;.  pWC 
2a930 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
2a940 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
2a950 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63  er->pNew;.  pSrc
2a960 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62   = &pWInfo->pTab
2a970 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54  List->a[pNew->iT
2a980 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  ab];.  pTab = pS
2a990 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73 65  rc->pTab;.  asse
2a9a0 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  rt( IsVirtual(pT
2a9b0 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e 66  ab) );.  pIdxInf
2a9c0 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65  o = allocateInde
2a9d0 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57  xInfo(pParse, pW
2a9e0 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65  C, pSrc, pBuilde
2a9f0 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  r->pOrderBy);.  
2aa00 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
2aa10 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2aa20 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70  NOMEM;.  pNew->p
2aa30 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65  rereq = 0;.  pNe
2aa40 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
2aa50 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2aa60 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
2aa70 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  BLE;.  pNew->nLT
2aa80 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  erm = 0;.  pNew-
2aa90 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
2aaa0 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20 3d   = 0;.  pUsage =
2aab0 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
2aac0 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e  traintUsage;.  n
2aad0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
2aae0 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
2aaf0 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c  nt;.  if( whereL
2ab00 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
2ab10 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  ew, nConstraint)
2ab20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2ab30 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e  bFree(db, pIdxIn
2ab40 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  fo);.    return 
2ab50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2ab60 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73 65 3d  }..  for(iPhase=
2ab70 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20 69 50  0; iPhase<=3; iP
2ab80 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28  hase++){.    if(
2ab90 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69 50 68   !seenIn && (iPh
2aba0 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20 20 20  ase&1)!=0 ){.   
2abb0 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20     iPhase++;.   
2abc0 20 20 20 69 66 28 20 69 50 68 61 73 65 3e 33 20     if( iPhase>3 
2abd0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
2abe0 20 20 20 69 66 28 20 21 73 65 65 6e 56 61 72 20     if( !seenVar 
2abf0 26 26 20 69 50 68 61 73 65 3e 31 20 29 20 62 72  && iPhase>1 ) br
2ac00 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  eak;.    pIdxCon
2ac10 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
2ac20 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
2ac30 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
2ac40 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
2ac50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2ac60 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
2ac70 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
2ac80 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20  ons++){.      j 
2ac90 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
2aca0 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  mOffset;.      p
2acb0 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
2acc0 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  ];.      switch(
2acd0 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20 20 20   iPhase ){.     
2ace0 20 20 20 63 61 73 65 20 30 3a 20 20 20 20 2f 2a     case 0:    /*
2acf0 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 6f   Constants witho
2ad00 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  ut IN operator *
2ad10 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  /.          pIdx
2ad20 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30  Cons->usable = 0
2ad30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ad40 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2ad50 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
2ad60 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
2ad70 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nIn = 1;.       
2ad80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
2ad90 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
2ada0 52 69 67 68 74 21 3d 30 20 29 7b 0a 20 20 20 20  Right!=0 ){.    
2adb0 20 20 20 20 20 20 20 20 73 65 65 6e 56 61 72 20          seenVar 
2adc0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
2add0 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
2ade0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2adf0 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)==0 ){.      
2ae00 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2ae10 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  usable = 1;.    
2ae20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ae30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2ae40 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a 20 43   case 1:    /* C
2ae50 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 49 4e  onstants with IN
2ae60 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
2ae70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2ae80 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20  seenIn );.      
2ae90 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
2aea0 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70  able = (pTerm->p
2aeb0 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a  rereqRight==0);.
2aec0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2aed0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32 3a  .        case 2:
2aee0 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73      /* Variables
2aef0 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20   without IN */. 
2af00 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2af10 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20 20   seenVar );.    
2af20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2af30 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
2af40 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2af50 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  IN)==0;.        
2af60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2af70 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56   default:   /* V
2af80 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 49 4e  ariables with IN
2af90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
2afa0 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 26 26  sert( seenVar &&
2afb0 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20   seenIn );.     
2afc0 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
2afd0 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  sable = 1;.     
2afe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2aff0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65    }.    }.    me
2b000 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20  mset(pUsage, 0, 
2b010 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d  sizeof(pUsage[0]
2b020 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )*pIdxInfo->nCon
2b030 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69 66  straint);.    if
2b040 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
2b050 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73  ToFreeIdxStr ) s
2b060 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78  qlite3_free(pIdx
2b070 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20  Info->idxStr);. 
2b080 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
2b090 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
2b0a0 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
2b0b0 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
2b0c0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2b0d0 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  r = 0;.    pIdxI
2b0e0 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
2b0f0 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49  umed = 0;.    pI
2b100 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
2b110 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  dCost = SQLITE_B
2b120 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65  IG_DBL / (double
2b130 29 32 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61  )2;.    rc = vta
2b140 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73  bBestIndex(pPars
2b150 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66  e, pTab, pIdxInf
2b160 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
2b170 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
2b180 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
2b190 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
2b1a0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2b1b0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
2b1c0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
2b1d0 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77  traint;.    pNew
2b1e0 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20  ->prereq = 0;.  
2b1f0 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20    mxTerm = -1;. 
2b200 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
2b210 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72  >nLSlot>=nConstr
2b220 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72 28  aint );.    for(
2b230 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
2b240 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61  nt; i++) pNew->a
2b250 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20  LTerm[i] = 0;.  
2b260 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
2b270 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  mitMask = 0;.   
2b280 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
2b290 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
2b2a0 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20  dxCons++){.     
2b2b0 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55   if( (iTerm = pU
2b2c0 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
2b2d0 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20  x - 1)>=0 ){.   
2b2e0 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e       j = pIdxCon
2b2f0 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
2b300 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
2b310 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20  m>=nConstraint. 
2b320 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20          || j<0. 
2b330 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57          || j>=pW
2b340 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  C->nTerm.       
2b350 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72    || pNew->aLTer
2b360 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20  m[iTerm]!=0.    
2b370 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2b380 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2b390 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  OR;.          sq
2b3a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2b3b0 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49  arse, "%s.xBestI
2b3c0 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69  ndex() malfuncti
2b3d0 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  on", pTab->zName
2b3e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
2b3f0 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
2b400 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ab_exit;.       
2b410 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
2b420 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e  ase( iTerm==nCon
2b430 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20  straint-1 );.   
2b440 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
2b450 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
2b460 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d  estcase( j==pWC-
2b470 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20  >nTerm-1 );.    
2b480 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
2b490 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[j];.        
2b4a0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20  pNew->prereq |= 
2b4b0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
2b4c0 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
2b4d0 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e  rt( iTerm<pNew->
2b4e0 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20  nLSlot );.      
2b4f0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69    pNew->aLTerm[i
2b500 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  Term] = pTerm;. 
2b510 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
2b520 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d  >mxTerm ) mxTerm
2b530 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20   = iTerm;.      
2b540 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
2b550 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 20  m==15 );.       
2b560 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
2b570 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20 20  ==16 );.        
2b580 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
2b590 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
2b5a0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
2b5b0 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65  itMask |= 1<<iTe
2b5c0 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
2b5d0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2b5e0 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
2b5f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2b600 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30  Usage[i].omit==0
2b610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b620 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  /* Do not attemp
2b630 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63  t to use an IN c
2b640 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68 65  onstraint if the
2b650 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20   virtual table. 
2b660 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61             ** sa
2b670 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75 69  ys that the equi
2b680 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72  valent EQ constr
2b690 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73  aint cannot be s
2b6a0 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20  afely omitted.. 
2b6b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66             ** If
2b6c0 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74   we do attempt t
2b6d0 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e  o use such a con
2b6e0 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f  straint, some ro
2b6f0 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20  ws might be.    
2b700 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61          ** repea
2b710 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ted in the outpu
2b720 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
2b730 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2b740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
2b750 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * A virtual tabl
2b760 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72  e that is constr
2b770 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63  ained by an IN c
2b780 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20  lause may not.  
2b790 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75          ** consu
2b7a0 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  me the ORDER BY 
2b7b0 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20 28  clause because (
2b7c0 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  1) the order of 
2b7d0 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20  IN terms.       
2b7e0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63     ** is not nec
2b7f0 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64  essarily related
2b800 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66   to the order of
2b810 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e   output terms an
2b820 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28  d.          ** (
2b830 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70  2) Multiple outp
2b840 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  uts from a singl
2b850 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20  e IN value will 
2b860 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20  not merge.      
2b870 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e      ** together.
2b880 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
2b890 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2b8a0 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
2b8b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2b8c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
2b8d0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a  =nConstraint ){.
2b8e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
2b8f0 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20  rm = mxTerm+1;. 
2b900 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
2b910 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d  w->nLTerm<=pNew-
2b920 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
2b930 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
2b940 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xNum = pIdxInfo-
2b950 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70  >idxNum;.      p
2b960 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2b970 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Free = pIdxInfo-
2b980 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2b990 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  r;.      pIdxInf
2b9a0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2b9b0 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Str = 0;.      p
2b9c0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
2b9d0 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  tr = pIdxInfo->i
2b9e0 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65  dxStr;.      pNe
2b9f0 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  w->u.vtab.isOrde
2ba00 72 65 64 20 3d 20 28 75 38 29 28 28 70 49 64 78  red = (u8)((pIdx
2ba10 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 21 3d  Info->nOrderBy!=
2ba20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
2ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba40 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 49          && pIdxI
2ba50 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
2ba60 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 70 4e 65  umed);.      pNe
2ba70 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
2ba80 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2ba90 3d 20 77 68 65 72 65 43 6f 73 74 46 72 6f 6d 44  = whereCostFromD
2baa0 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e  ouble(pIdxInfo->
2bab0 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
2bac0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
2bad0 20 45 76 65 72 79 20 76 69 72 74 75 61 6c 20 74   Every virtual t
2bae0 61 62 6c 65 20 71 75 65 72 79 20 72 65 74 75 72  able query retur
2baf0 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20  ns 25 rows */.  
2bb00 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2bb10 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36   46;  assert( 46
2bb20 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35 29 20  ==whereCost(25) 
2bb30 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
2bb40 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2bb50 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
2bb60 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  if( pNew->u.vtab
2bb70 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
2bb80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2bb90 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69  e(pNew->u.vtab.i
2bba0 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20  dxStr);.        
2bbb0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
2bbc0 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
2bbd0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a   }.    }.  }  ..
2bbe0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
2bbf0 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64  _exit:.  if( pId
2bc00 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2bc10 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
2bc20 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
2bc30 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
2bc40 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
2bc50 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  dxInfo);.  retur
2bc60 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
2bc70 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
2bc80 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
2bc90 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f  *.** Add WhereLo
2bca0 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61  op entries to ha
2bcb0 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20  ndle OR terms.  
2bcc0 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65  This works for e
2bcd0 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20  ither.** btrees 
2bce0 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
2bcf0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2bd00 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
2bd10 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2bd20 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d   *pBuilder, Bitm
2bd30 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57  ask mExtra){.  W
2bd40 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2bd50 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
2bd60 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  nfo;.  WhereClau
2bd70 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
2bd80 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68  Loop *pNew;.  Wh
2bd90 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
2bda0 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72  *pWCEnd;.  int r
2bdb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2bdc0 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
2bdd0 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
2bde0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
2bdf0 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20  der sSubBuild;. 
2be00 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d   WhereOrSet sSum
2be10 2c 20 73 43 75 72 2c 20 73 50 72 65 76 3b 0a 20  , sCur, sPrev;. 
2be20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2be30 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a  item *pItem;.  .
2be40 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
2be50 2d 3e 70 57 43 3b 0a 20 20 69 66 28 20 70 57 49  ->pWC;.  if( pWI
2be60 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2be70 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59  & WHERE_AND_ONLY
2be80 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2be90 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  _OK;.  pWCEnd = 
2bea0 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54  pWC->a + pWC->nT
2beb0 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  erm;.  pNew = pB
2bec0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 0a 20  uilder->pNew;.. 
2bed0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
2bee0 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20  a; pTerm<pWCEnd 
2bef0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2bf00 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
2bf10 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2bf20 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d  rator & WO_OR)!=
2bf30 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
2bf40 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  ->u.pOrInfo->ind
2bf50 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d  exable & pNew->m
2bf60 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20  askSelf)!=0 .   
2bf70 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43   ){.      WhereC
2bf80 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f  lause * const pO
2bf90 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWC = &pTerm->u.
2bfa0 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
2bfb0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63     WhereTerm * c
2bfc0 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20  onst pOrWCEnd = 
2bfd0 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d  &pOrWC->a[pOrWC-
2bfe0 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57  >nTerm];.      W
2bff0 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
2c000 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  m;.      int onc
2c010 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74  e = 1;.      int
2c020 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20   i, j;.    .    
2c030 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f    pItem = pWInfo
2c040 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  ->pTabList->a + 
2c050 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 20 20  pNew->iTab;.    
2c060 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
2c070 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
2c080 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69  SubBuild = *pBui
2c090 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62  lder;.      sSub
2c0a0 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d  Build.pOrderBy =
2c0b0 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75   0;.      sSubBu
2c0c0 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43  ild.pOrSet = &sC
2c0d0 75 72 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70  ur;..      for(p
2c0e0 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b  OrTerm=pOrWC->a;
2c0f0 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e   pOrTerm<pOrWCEn
2c100 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  d; pOrTerm++){. 
2c110 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54         if( (pOrT
2c120 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2c130 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20   WO_AND)!=0 ){. 
2c140 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69           sSubBui
2c150 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72  ld.pWC = &pOrTer
2c160 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77  m->u.pAndInfo->w
2c170 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
2c180 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
2c190 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
2c1a0 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  {.          temp
2c1b0 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d  WC.pWInfo = pWC-
2c1c0 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  >pWInfo;.       
2c1d0 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72     tempWC.pOuter
2c1e0 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20   = pWC;.        
2c1f0 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b    tempWC.op = TK
2c200 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20  _AND;.          
2c210 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31  tempWC.nTerm = 1
2c220 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
2c230 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a  WC.a = pOrTerm;.
2c240 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75            sSubBu
2c250 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57  ild.pWC = &tempW
2c260 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  C;.        }else
2c270 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
2c280 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
2c290 20 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d          sCur.n =
2c2a0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
2c2b0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2c2c0 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28  ABLE.        if(
2c2d0 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
2c2e0 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
2c2f0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2c300 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26 73  oopAddVirtual(&s
2c310 53 75 62 42 75 69 6c 64 29 3b 0a 20 20 20 20 20  SubBuild);.     
2c320 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2c330 73 43 75 72 2e 6e 3b 20 69 2b 2b 29 20 73 43 75  sCur.n; i++) sCu
2c340 72 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 3d  r.a[i].prereq |=
2c350 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 20 20 20   mExtra;.       
2c360 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
2c370 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2c380 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2c390 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75  AddBtree(&sSubBu
2c3a0 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  ild, mExtra);.  
2c3b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c3c0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2c3d0 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d  TE_OK || sCur.n=
2c3e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
2c3f0 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20  ( sCur.n==0 ){. 
2c400 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
2c410 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 0;.          b
2c420 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
2c430 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a  lse if( once ){.
2c440 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
2c450 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43  rMove(&sSum, &sC
2c460 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ur);.          o
2c470 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
2c480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c490 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
2c4a0 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20  Prev, &sSum);.  
2c4b0 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
2c4c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
2c4d0 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e  r(i=0; i<sPrev.n
2c4e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2c4f0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
2c500 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Cur.n; j++){.   
2c510 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
2c520 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20  OrInsert(&sSum, 
2c530 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65  sPrev.a[i].prere
2c540 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72  q | sCur.a[j].pr
2c550 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20  ereq,.          
2c560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c570 20 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 73    whereCostAdd(s
2c580 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20  Prev.a[i].rRun, 
2c590 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c  sCur.a[j].rRun),
2c5a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2c5c0 72 65 43 6f 73 74 41 64 64 28 73 50 72 65 76 2e  reCostAdd(sPrev.
2c5d0 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e  a[i].nOut, sCur.
2c5e0 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20  a[j].nOut));.   
2c5f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2c610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2c620 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  New->nLTerm = 1;
2c630 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  .      pNew->aLT
2c640 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
2c650 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2c660 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54  ags = WHERE_MULT
2c670 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65 77  I_OR;.      pNew
2c680 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
2c690 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
2c6a0 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65  dx = 0;.      me
2c6b0 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30  mset(&pNew->u, 0
2c6c0 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75  , sizeof(pNew->u
2c6d0 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ));.      for(i=
2c6e0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
2c6f0 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b   && i<sSum.n; i+
2c700 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  +){.        /* T
2c710 55 4e 49 4e 47 3a 20 4d 75 6c 74 69 70 6c 65 20  UNING: Multiple 
2c720 62 79 20 33 2e 35 20 66 6f 72 20 74 68 65 20 73  by 3.5 for the s
2c730 65 63 6f 6e 64 61 72 79 20 74 61 62 6c 65 20 6c  econdary table l
2c740 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20 20  ookup */.       
2c750 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53   pNew->rRun = sS
2c760 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31  um.a[i].rRun + 1
2c770 38 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  8;.        pNew-
2c780 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69  >nOut = sSum.a[i
2c790 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  ].nOut;.        
2c7a0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
2c7b0 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b  Sum.a[i].prereq;
2c7c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
2c7d0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
2c7e0 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
2c7f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2c800 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c810 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
2c820 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
2c830 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
2c840 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2c850 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57  hereLoopAddAll(W
2c860 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2c870 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68  *pBuilder){.  Wh
2c880 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
2c890 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
2c8a0 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45  fo;.  Bitmask mE
2c8b0 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69 74 6d  xtra = 0;.  Bitm
2c8c0 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a  ask mPrior = 0;.
2c8d0 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53 72    int iTab;.  Sr
2c8e0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
2c8f0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2c900 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
2c910 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2c920 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2c930 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
2c940 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 54 61 62  ->db;.  int nTab
2c950 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  List = pWInfo->n
2c960 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20  Level;.  int rc 
2c970 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
2c980 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20  8 priorJoinType 
2c990 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  = 0;.  WhereLoop
2c9a0 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20 4c 6f   *pNew;..  /* Lo
2c9b0 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c  op over the tabl
2c9c0 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20  es in the join, 
2c9d0 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
2c9e0 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70  ht */.  pNew = p
2c9f0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
2ca00 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70   whereLoopInit(p
2ca10 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54 61 62  New);.  for(iTab
2ca20 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69  =0, pItem=pTabLi
2ca30 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e 54 61 62  st->a; iTab<nTab
2ca40 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c 20 70 49  List; iTab++, pI
2ca50 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77  tem++){.    pNew
2ca60 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ->iTab = iTab;. 
2ca70 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c     pNew->maskSel
2ca80 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49  f = getMask(&pWI
2ca90 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
2caa0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
2cab0 20 20 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d      if( ((pItem-
2cac0 3e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a  >jointype|priorJ
2cad0 6f 69 6e 54 79 70 65 29 20 26 20 28 4a 54 5f 4c  oinType) & (JT_L
2cae0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
2caf0 30 20 29 7b 0a 20 20 20 20 20 20 6d 45 78 74 72  0 ){.      mExtr
2cb00 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20  a = mPrior;.    
2cb10 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e 54  }.    priorJoinT
2cb20 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69  ype = pItem->joi
2cb30 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20 49  ntype;.    if( I
2cb40 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
2cb50 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 72  pTab) ){.      r
2cb60 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2cb70 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72  Virtual(pBuilder
2cb80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2cb90 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2cba0 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c  opAddBtree(pBuil
2cbb0 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  der, mExtra);.  
2cbc0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2cbd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cbe0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2cbf0 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c  pAddOr(pBuilder,
2cc00 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a   mExtra);.    }.
2cc10 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e      mPrior |= pN
2cc20 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  ew->maskSelf;.  
2cc30 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e    if( rc || db->
2cc40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
2cc50 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72  reak;.  }.  wher
2cc60 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
2cc70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  New);.  return r
2cc80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d  c;.}../*.** Exam
2cc90 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20  ine a WherePath 
2cca0 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69  (with the additi
2ccb0 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  on of the extra 
2ccc0 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65  WhereLoop of the
2ccd0 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65   5th.** paramete
2cce0 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74  rs) to see if it
2ccf0 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e   outputs rows in
2cd00 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f   the requested O
2cd10 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47  RDER BY.** (or G
2cd20 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74  ROUP BY) without
2cd30 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70   requiring a sep
2cd40 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61  arate sort opera
2cd50 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 3a 0a 2a  tion.  Return:.*
2cd60 2a 20 0a 2a 2a 20 20 20 20 30 3a 20 20 4f 52 44  * .**    0:  ORD
2cd70 45 52 20 42 59 20 69 73 20 6e 6f 74 20 73 61 74  ER BY is not sat
2cd80 69 73 66 69 65 64 2e 20 20 53 6f 72 74 69 6e 67  isfied.  Sorting
2cd90 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 20 20 20   required.**    
2cda0 31 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73 20  1:  ORDER BY is 
2cdb0 73 61 74 69 73 66 69 65 64 2e 20 20 20 20 20 20  satisfied.      
2cdc0 4f 6d 69 74 20 73 6f 72 74 69 6e 67 0a 2a 2a 20  Omit sorting.** 
2cdd0 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61    -1:  Unknown a
2cde0 74 20 74 68 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a  t this time.**.*
2cdf0 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63  * Note that proc
2ce00 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45  essing for WHERE
2ce10 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45  _GROUPBY and WHE
2ce20 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73  RE_DISTINCTBY is
2ce30 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63   not as.** stric
2ce40 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50 20 42  t.  With GROUP B
2ce50 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74  Y and DISTINCT t
2ce60 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d  he only requirem
2ce70 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65  ent is that.** e
2ce80 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61  quivalent rows a
2ce90 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c  ppear immediatel
2cea0 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e  y adjacent to on
2ceb0 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55  e another.  GROU
2cec0 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54  P BY.** and DIST
2ced0 49 4e 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69  INT do not requi
2cee0 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61  re rows to appea
2cef0 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75  r in any particu
2cf00 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e  lar order as lon
2cf10 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 65 6c 65  g.** as equivele
2cf20 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75  nt rows are grou
2cf30 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54  ped together.  T
2cf40 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59  hus for GROUP BY
2cf50 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a   and DISTINCT.**
2cf60 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 74 65   the pOrderBy te
2cf70 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68  rms can be match
2cf80 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e  ed in any order.
2cf90 20 20 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c    With ORDER BY,
2cfa0 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42   the .** pOrderB
2cfb0 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20  y terms must be 
2cfc0 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72 69 63  matched in stric
2cfd0 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20  t left-to-right 
2cfe0 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
2cff0 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 61   int wherePathSa
2d000 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a  tisfiesOrderBy(.
2d010 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2d020 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57  nfo,    /* The W
2d030 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2d040 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2d050 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20  rBy,   /* ORDER 
2d060 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f  BY or GROUP BY o
2d070 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73  r DISTINCT claus
2d080 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
2d090 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
2d0a0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ,     /* The Whe
2d0b0 72 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20  rePath to check 
2d0c0 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
2d0d0 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69  ags,       /* Mi
2d0e0 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  ght contain WHER
2d0f0 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57 48 45  E_GROUPBY or WHE
2d100 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 2a 2f  RE_DISTINCTBY */
2d110 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20  .  u16 nLoop,   
2d120 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d130 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
2d140 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20   pPath->aLoop[] 
2d150 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
2d160 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64  pLast,     /* Ad
2d170 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  d this WhereLoop
2d180 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70   to the end of p
2d190 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f  Path->aLoop[] */
2d1a0 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76  .  Bitmask *pRev
2d1b0 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a  Mask     /* OUT:
2d1c0 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f   Mask of WhereLo
2d1d0 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65  ops to run in re
2d1e0 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29  verse order */.)
2d1f0 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20 20  {.  u8 revSet;  
2d200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2d210 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77  e if rev is know
2d220 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20  n */.  u8 rev;  
2d230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d240 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f  Composite sort o
2d250 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76  rder */.  u8 rev
2d260 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
2d270 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72  /* Index sort or
2d280 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72  der */.  u8 isOr
2d290 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f  derDistinct;   /
2d2a0 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72  * All prior Wher
2d2b0 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72  eLoops are order
2d2c0 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75  -distinct */.  u
2d2d0 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  8 distinctColumn
2d2e0 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  s;   /* True if 
2d2f0 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49  the loop has UNI
2d300 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c  QUE NOT NULL col
2d310 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d  umns */.  u8 isM
2d320 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
2d330 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68  /* iColumn match
2d340 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  es a term of the
2d350 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2d360 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d   */.  u16 nColum
2d370 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  n;          /* N
2d380 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
2d390 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20   in pIndex */.  
2d3a0 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  u16 nOrderBy;   
2d3b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d3c0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
2d3d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2d3e0 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20    int iLoop;    
2d3f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2d400 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e   of WhereLoop in
2d410 20 70 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f   pPath being pro
2d420 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  cessed */.  int 
2d430 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
2d440 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2d450 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
2d460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2d470 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
2d480 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65 72 65  or current Where
2d490 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43  Loop */.  int iC
2d4a0 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
2d4b0 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  /* A column numb
2d4c0 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20  er within table 
2d4d0 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c  iCur */.  WhereL
2d4e0 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20  oop *pLoop = 0; 
2d4f0 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65  /* Current Where
2d500 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65  Loop being proce
2d510 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65  ssed. */.  Where
2d520 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
2d530 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
2d540 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
2d550 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
2d560 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20  *pOBExpr;       
2d570 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f   /* An expressio
2d580 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52  n from the ORDER
2d590 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2d5a0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
2d5b0 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45        /* COLLATE
2d5c0 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61   function from a
2d5d0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2d5e0 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65  e term */.  Inde
2d5f0 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
2d600 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61    /* The index a
2d610 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
2d620 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Loop */.  sqlite
2d630 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
2d640 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
2d650 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
2d660 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
2d670 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f   obSat = 0;    /
2d680 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20  * Mask of ORDER 
2d690 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69  BY terms satisfi
2d6a0 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42  ed so far */.  B
2d6b0 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20  itmask obDone;  
2d6c0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
2d6d0 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72  all ORDER BY ter
2d6e0 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
2d6f0 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
2d700 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61  k;  /* Mask of a
2d710 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20  ll well-ordered 
2d720 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61  loops */.  Bitma
2d730 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20 20  sk ready;       
2d740 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
2d750 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f  f inner loops */
2d760 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  /*.  ** We s
2d770 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
2d780 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66   is "one-row" if
2d790 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f   it generates no
2d7a0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20   more than one. 
2d7b0 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75   ** row of outpu
2d7c0 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20  t.  A WhereLoop 
2d7d0 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c  is one-row if al
2d7e0 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
2d7f0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a  ng are true:.  *
2d800 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78  *  (a) All index
2d810 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77   columns match w
2d820 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ith WHERE_COLUMN
2d830 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54  _EQ..  **  (b) T
2d840 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71  he index is uniq
2d850 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72  ue.  ** Any Wher
2d860 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48  eLoop with an WH
2d870 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f  ERE_COLUMN_EQ co
2d880 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
2d890 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77  rowid is one-row
2d8a0 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65  ..  ** Every one
2d8b0 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77  -row WhereLoop w
2d8c0 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48 45  ill have the WHE
2d8d0 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65  RE_ONEROW bit se
2d8e0 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20  t in wsFlags..  
2d8f0 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74  **.  ** We say t
2d900 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  he WhereLoop is 
2d910 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22  "order-distinct"
2d920 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 63   if the set of c
2d930 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a  olumns from.  **
2d940 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20   that WhereLoop 
2d950 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20  that are in the 
2d960 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2d970 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f  are different fo
2d980 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77  r every.  ** row
2d990 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
2d9a0 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f  p.  Every one-ro
2d9b0 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61  w WhereLoop is a
2d9c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a  utomatically.  *
2d9d0 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  * order-distinct
2d9e0 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20  .   A WhereLoop 
2d9f0 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75  that has no colu
2da00 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  mns in the ORDER
2da10 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   BY clause.  ** 
2da20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73  is not order-dis
2da30 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64  tinct. To be ord
2da40 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e  er-distinct is n
2da50 6f 74 20 71 75 69 74 65 20 74 68 65 20 73 61 6d  ot quite the sam
2da60 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20  e as being.  ** 
2da70 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20 55  UNIQUE since a U
2da80 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20  NIQUE column or 
2da90 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d  index can have m
2daa0 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61  ultiple rows tha
2dab0 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c  t .  ** are NULL
2dac0 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73   and NULL values
2dad0 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20   are equivalent 
2dae0 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20  for the purpose 
2daf0 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  of order-distinc
2db00 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72  t..  ** To be or
2db10 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68  der-distinct, th
2db20 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62  e columns must b
2db30 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54  e UNIQUE and NOT
2db40 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   NULL..  **.  **
2db50 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61   The rowid for a
2db60 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73   table is always
2db70 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20   UNIQUE and NOT 
2db80 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72  NULL so whenever
2db90 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20   the.  ** rowid 
2dba0 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f  appears in the O
2dbb0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
2dbc0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2dbd0 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20  g WhereLoop is. 
2dbe0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
2dbf0 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  y order-distinct
2dc00 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ..  */..  assert
2dc10 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ( pOrderBy!=0 );
2dc20 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69  ..  /* Sortabili
2dc30 74 79 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61  ty of virtual ta
2dc40 62 6c 65 73 20 69 73 20 64 65 74 65 72 6d 69 6e  bles is determin
2dc50 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
2dc60 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a  ndex method.  **
2dc70 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
2dc80 74 61 62 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a  table itself */.
2dc90 20 20 69 66 28 20 70 4c 61 73 74 2d 3e 77 73 46    if( pLast->wsF
2dca0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2dcb0 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
2dcc0 20 74 65 73 74 63 61 73 65 28 20 6e 4c 6f 6f 70   testcase( nLoop
2dcd0 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75 65 20 77  >0 );  /* True w
2dce0 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20  hen outer loops 
2dcf0 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61 6e 64 20  are one-row and 
2dd00 6d 61 74 63 68 20 0a 20 20 20 20 20 20 20 20 20  match .         
2dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd20 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   ** no ORDER BY 
2dd30 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 72 65 74  terms */.    ret
2dd40 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76 74 61  urn pLast->u.vta
2dd50 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 7d  b.isOrdered;.  }
2dd60 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20  .  if( nLoop && 
2dd70 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
2dd80 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2dd90 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20  OrderByIdxJoin) 
2dda0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e  ) return 0;..  n
2ddb0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
2ddc0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73  By->nExpr;.  tes
2ddd0 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d  tcase( nOrderBy=
2dde0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20  =BMS-1 );.  if( 
2ddf0 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29  nOrderBy>BMS-1 )
2de00 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
2de10 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f  annot optimize o
2de20 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45  verly large ORDE
2de30 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64  R BYs */.  isOrd
2de40 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a  erDistinct = 1;.
2de50 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42    obDone = MASKB
2de60 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a  IT(nOrderBy)-1;.
2de70 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d    orderDistinctM
2de80 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79  ask = 0;.  ready
2de90 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f   = 0;.  for(iLoo
2dea0 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74  p=0; isOrderDist
2deb0 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62  inct && obSat<ob
2dec0 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e  Done && iLoop<=n
2ded0 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
2dee0 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20      if( iLoop>0 
2def0 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70  ) ready |= pLoop
2df00 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
2df10 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c  pLoop = iLoop<nL
2df20 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f  oop ? pPath->aLo
2df30 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73  op[iLoop] : pLas
2df40 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  t;.    assert( (
2df50 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2df60 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
2df70 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69  BLE)==0 );.    i
2df80 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Cur = pWInfo->pT
2df90 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d  abList->a[pLoop-
2dfa0 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a  >iTab].iCursor;.
2dfb0 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
2dfc0 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65   any ORDER BY te
2dfd0 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20 63  rm X that is a c
2dfe0 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
2dff0 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  le of.    ** the
2e000 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f   current loop fo
2e010 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73  r which there is
2e020 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
2e030 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  RE.    ** clause
2e040 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49   of the form X I
2e050 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68  S NULL or X=? th
2e060 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  at reference onl
2e070 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c  y outer.    ** l
2e080 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oops..    */.   
2e090 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
2e0a0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
2e0b0 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
2e0c0 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
2e0d0 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78  nue;.      pOBEx
2e0e0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
2e0f0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
2e100 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2e110 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42  );.      if( pOB
2e120 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
2e130 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UMN ) continue;.
2e140 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2e150 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20  r->iTable!=iCur 
2e160 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2e170 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
2e180 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  rm(&pWInfo->sWC,
2e190 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e   iCur, pOBExpr->
2e1a0 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
2e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1c0 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  ~ready, WO_EQ|WO
2e1d0 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20  _ISNULL, 0);.   
2e1e0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
2e1f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2e200 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
2e210 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d  perator&WO_EQ)!=
2e220 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43  0 && pOBExpr->iC
2e230 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
2e240 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2e250 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20  z1, *z2;.       
2e260 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2e270 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
2e280 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64  fo->pParse, pOrd
2e290 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2e2a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
2e2b0 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
2e2c0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2e2d0 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c         z1 = pCol
2e2e0 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l->zName;.      
2e2f0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2e300 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
2e310 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65  nfo->pParse, pTe
2e320 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  rm->pExpr);.    
2e330 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2e340 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
2e350 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
2e360 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  z2 = pColl->zNam
2e370 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
2e380 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
2e390 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69  , z2)!=0 ) conti
2e3a0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2e3b0 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
2e3c0 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20  BIT(i);.    }.. 
2e3d0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
2e3e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
2e3f0 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20  NEROW)==0 ){.   
2e400 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
2e410 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
2e420 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  K ){.        pIn
2e430 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dex = 0;.       
2e440 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20   nColumn = 0;.  
2e450 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
2e460 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  Index = pLoop->u
2e470 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d  .btree.pIndex)==
2e480 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e  0 || pIndex->bUn
2e490 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20  ordered ){.     
2e4a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
2e4b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e4c0 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    nColumn = pInd
2e4d0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
2e4e0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
2e4f0 69 6e 63 74 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  inct = pIndex->o
2e500 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b  nError!=OE_None;
2e510 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2e520 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
2e530 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  all columns of t
2e540 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61  he index and dea
2e550 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a  l with the ones.
2e560 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
2e570 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  e not constraine
2e580 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20  d by == or IN.. 
2e590 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
2e5a0 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a  v = revSet = 0;.
2e5b0 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
2e5c0 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  lumns = 0;.     
2e5d0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 3d 6e 43 6f   for(j=0; j<=nCo
2e5e0 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
2e5f0 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20      u8 bOnce;   
2e600 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74  /* True to run t
2e610 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72  he ORDER BY sear
2e620 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20  ch loop */..    
2e630 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72      /* Skip over
2e640 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20   == and IS NULL 
2e650 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20  terms */.       
2e660 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e   if( j<pLoop->u.
2e670 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
2e680 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f     && ((i = pLoo
2e690 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f  p->aLTerm[j]->eO
2e6a0 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45  perator) & (WO_E
2e6b0 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30  Q|WO_ISNULL))!=0
2e6c0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2e6d0 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f        if( i & WO
2e6e0 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
2e6f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2e700 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2e710 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2e720 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2e730 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
2e740 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
2e750 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d  nue;  .        }
2e760 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
2e770 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
2e780 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
2e790 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
2e7a0 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
2e7b0 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
2e7c0 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
2e7d0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
2e7e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2e7f0 20 20 69 66 28 20 6a 3c 6e 43 6f 6c 75 6d 6e 20    if( j<nColumn 
2e800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2e810 4e 6f 72 6d 61 6c 20 69 6e 64 65 78 20 63 6f 6c  Normal index col
2e820 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  umns */.        
2e830 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    iColumn = pInd
2e840 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  ex->aiColumn[j];
2e850 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
2e860 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72  x = pIndex->aSor
2e870 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
2e880 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
2e890 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ==pIndex->pTable
2e8a0 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d  ->iPKey ) iColum
2e8b0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2e8c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2e8d0 20 2f 2a 20 54 68 65 20 52 4f 57 49 44 20 63 6f   /* The ROWID co
2e8e0 6c 75 6d 6e 20 61 74 20 74 68 65 20 65 6e 64 20  lumn at the end 
2e8f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
2e900 65 72 74 28 20 6a 3d 3d 6e 43 6f 6c 75 6d 6e 20  ert( j==nColumn 
2e910 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  );.          iCo
2e920 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
2e930 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b       revIdx = 0;
2e940 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2e950 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73      /* An uncons
2e960 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74  trained column t
2e970 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  hat might be NUL
2e980 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  L means that thi
2e990 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65  s.        ** Whe
2e9a0 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65  reLoop is not we
2e9b0 6c 6c 2d 6f 72 64 65 72 65 64 20 0a 20 20 20 20  ll-ordered .    
2e9c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2e9d0 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
2e9e0 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 69  ct.         && i
2e9f0 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20  Column>=0.      
2ea00 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e     && j>=pLoop->
2ea10 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20  u.btree.nEq.    
2ea20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e       && pIndex->
2ea30 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
2ea40 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  lumn].notNull==0
2ea50 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2ea60 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
2ea70 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
2ea80 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
2ea90 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20   Find the ORDER 
2eaa0 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72  BY term that cor
2eab0 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
2eac0 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20  j-th column.    
2ead0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e      ** of the in
2eae0 64 65 78 20 61 6e 64 20 61 6e 64 20 6d 61 72 6b  dex and and mark
2eaf0 20 74 68 61 74 20 4f 52 44 45 52 20 42 59 20 74   that ORDER BY t
2eb00 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20  erm off .       
2eb10 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e 63   */.        bOnc
2eb20 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  e = 1;.        i
2eb30 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
2eb40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e      for(i=0; bOn
2eb50 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79  ce && i<nOrderBy
2eb60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2eb70 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
2eb80 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
2eb90 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  nue;.          p
2eba0 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
2ebb0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
2ebc0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2ebd0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
2ebe0 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
2ebf0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
2ec00 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20  OUPBY );.       
2ec10 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
2ec20 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2ec30 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20  DISTINCTBY );.  
2ec40 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74          if( (wct
2ec50 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  rlFlags & (WHERE
2ec60 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44  _GROUPBY|WHERE_D
2ec70 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29  ISTINCTBY))==0 )
2ec80 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20   bOnce = 0;.    
2ec90 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2eca0 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
2ecb0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2ecc0 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
2ecd0 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
2ece0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2ecf0 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
2ed00 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f  pr->iColumn!=iCo
2ed10 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
2ed20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2ed30 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
2ed40 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
2ed50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2ed60 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
2ed70 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
2ed80 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
2ed90 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
2eda0 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
2edb0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2edc0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2edd0 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
2ede0 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e  >zName, pIndex->
2edf0 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20  azColl[j])!=0 ) 
2ee00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2ee10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ee20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20  isMatch = 1;.   
2ee30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2ee40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ee50 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20  if( isMatch ){. 
2ee60 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
2ee70 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
2ee80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ee90 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d  distinctColumns=
2eea0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2eeb0 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
2eec0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
2eed0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53   }.          obS
2eee0 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
2eef0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ef00 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2ef10 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
2ef20 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PBY)==0 ){.     
2ef30 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
2ef40 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64  ure the sort ord
2ef50 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  er is compatible
2ef60 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
2ef70 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20  clause..        
2ef80 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65      ** Sort orde
2ef90 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20  r is irrelevant 
2efa0 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63  for a GROUP BY c
2efb0 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20  lause. */.      
2efc0 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74        if( revSet
2efd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2efe0 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65 76    if( (rev ^ rev
2eff0 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e  Idx)!=pOrderBy->
2f000 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29  a[i].sortOrder )
2f010 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
2f020 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2f030 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20              rev 
2f040 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65  = revIdx ^ pOrde
2f050 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
2f060 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  der;.           
2f070 20 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52     if( rev ) *pR
2f080 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  evMask |= MASKBI
2f090 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  T(iLoop);.      
2f0a0 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d          revSet =
2f0b0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2f0c0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2f0d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f0e0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74         /* No mat
2f0f0 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  ch found */.    
2f100 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c        if( j==0 |
2f110 7c 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  | j<nColumn ){. 
2f120 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2f130 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
2f140 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  inct!=0 );.     
2f150 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2f160 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
2f170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f180 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2f190 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e   }.      } /* en
2f1a0 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  d Loop over all 
2f1b0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f  index columns */
2f1c0 0a 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69  .      if( disti
2f1d0 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20  nctColumns ){.  
2f1e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2f1f0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d  isOrderDistinct=
2f200 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73  =0 );.        is
2f210 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2f220 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2f230 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f   /* end-if not o
2f240 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f  ne-row */..    /
2f250 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f  * Mark off any o
2f260 74 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65  ther ORDER BY te
2f270 72 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e  rms that referen
2f280 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20  ce pLoop */.    
2f290 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
2f2a0 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  nct ){.      ord
2f2b0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c  erDistinctMask |
2f2c0 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  = pLoop->maskSel
2f2d0 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  f;.      for(i=0
2f2e0 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
2f2f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
2f300 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28   *p;.        if(
2f310 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
2f320 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
2f330 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64          p = pOrd
2f340 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2f350 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65  ;.        if( (e
2f360 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 26 70  xprTableUsage(&p
2f370 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
2f380 20 70 29 26 7e 6f 72 64 65 72 44 69 73 74 69 6e   p)&~orderDistin
2f390 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  ctMask)==0 ){.  
2f3a0 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
2f3b0 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
2f3c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2f3d0 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20     }.  } /* End 
2f3e0 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c  the loop over al
2f3f0 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f  l WhereLoops fro
2f400 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77  m outer-most dow
2f410 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20  n to inner-most 
2f420 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d  */.  if( obSat==
2f430 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20  obDone ) return 
2f440 31 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65  1;.  if( !isOrde
2f450 72 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75  rDistinct ) retu
2f460 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d  rn 0;.  return -
2f470 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45  1;.}..#ifdef WHE
2f480 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
2f490 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67  /* For debugging
2f4a0 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74   use only: */.st
2f4b0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2f4c0 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57  *wherePathName(W
2f4d0 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c  herePath *pPath,
2f4e0 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72   int nLoop, Wher
2f4f0 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20  eLoop *pLast){. 
2f500 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61   static char zNa
2f510 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b  me[65];.  int i;
2f520 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c  .  for(i=0; i<nL
2f530 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65  oop; i++){ zName
2f540 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f  [i] = pPath->aLo
2f550 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20  op[i]->cId; }.  
2f560 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d  if( pLast ) zNam
2f570 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e  e[i++] = pLast->
2f580 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20  cId;.  zName[i] 
2f590 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e  = 0;.  return zN
2f5a0 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
2f5b0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
2f5c0 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
2f5d0 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49  p objects at pWI
2f5e0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69  nfo->pLoops, thi
2f5f0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74  s routine.** att
2f600 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68  empts to find th
2f610 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
2f620 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20 65  th that visits e
2f630 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a  ach WhereLoop.**
2f640 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74   once.  This pat
2f650 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64  h is then loaded
2f660 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f   into the pWInfo
2f670 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65  ->a[].pWLoop fie
2f680 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d  lds..**.** Assum
2f690 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c  e that the total
2f6a0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
2f6b0 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  t rows that will
2f6c0 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74   need to be sort
2f6d0 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52  ed.** will be nR
2f6e0 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31 30  owEst (in the 10
2f6f0 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61  *log2 representa
2f700 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f  tion).  Or, igno
2f710 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f  re sorting.** co
2f720 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d  sts if nRowEst==
2f730 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0..**.** Return 
2f740 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
2f750 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e  cess or SQLITE_N
2f760 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79  OMEM of a memory
2f770 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65   allocation.** e
2f780 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
2f790 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
2f7a0 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65  PathSolver(Where
2f7b0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 57 68  Info *pWInfo, Wh
2f7c0 65 72 65 43 6f 73 74 20 6e 52 6f 77 45 73 74 29  ereCost nRowEst)
2f7d0 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65  {.  int mxChoice
2f7e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f7f0 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
2f800 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  of simultaneous 
2f810 70 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f  paths tracked */
2f820 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20  .  int nLoop;   
2f830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f840 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
2f850 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  in the join */. 
2f860 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
2f870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2f880 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2f890 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
2f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f8b0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
2f8c0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
2f8d0 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
2f8e0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2f8f0 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20  ounter over the 
2f900 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69  terms of the joi
2f910 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a  n */.  int ii, j
2f920 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
2f930 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2f940 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  s */.  WhereCost
2f950 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20   rCost;         
2f960 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 61      /* Cost of a
2f970 20 70 61 74 68 20 2a 2f 0a 20 20 57 68 65 72 65   path */.  Where
2f980 43 6f 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b  Cost mxCost = 0;
2f990 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
2f9a0 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74  um cost of a set
2f9b0 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 57   of paths */.  W
2f9c0 68 65 72 65 43 6f 73 74 20 72 53 6f 72 74 43 6f  hereCost rSortCo
2f9d0 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  st;         /* C
2f9e0 6f 73 74 20 74 6f 20 64 6f 20 61 20 73 6f 72 74  ost to do a sort
2f9f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e   */.  int nTo, n
2fa00 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20  From;           
2fa10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
2fa20 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54  id entries in aT
2fa30 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20  o[] and aFrom[] 
2fa40 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
2fa50 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f  aFrom;         /
2fa60 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68  * All nFrom path
2fa70 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f 75  s at the previou
2fa80 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65  s level */.  Whe
2fa90 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20  rePath *aTo;    
2faa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54         /* The nT
2fab0 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  o best paths at 
2fac0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65  the current leve
2fad0 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
2fae0 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *pFrom;        
2faf0 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
2fb00 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77  f aFrom[] that w
2fb10 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
2fb20 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2fb30 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *pTo;           
2fb40 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  /* An element of
2fb50 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61   aTo[] that we a
2fb60 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
2fb70 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57  .  WhereLoop *pW
2fb80 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  Loop;        /* 
2fb90 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72 65  One of the Where
2fba0 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
2fbb0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58    WhereLoop **pX
2fbc0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ;           /* U
2fbd0 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20 74  sed to divy up t
2fbe0 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79  he pSpace memory
2fbf0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
2fc00 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
2fc10 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d  /* Temporary mem
2fc20 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73  ory used by this
2fc30 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 70   routine */..  p
2fc40 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
2fc50 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
2fc60 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f  Parse->db;.  nLo
2fc70 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  op = pWInfo->nLe
2fc80 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  vel;.  /* TUNING
2fc90 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65  : For simple que
2fca0 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62  ries, only the b
2fcb0 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61 63  est path is trac
2fcc0 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d  ked..  ** For 2-
2fcd0 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35  way joins, the 5
2fce0 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65 20   best paths are 
2fcf0 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46  followed..  ** F
2fd00 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72  or joins of 3 or
2fd10 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72   more tables, tr
2fd20 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74 20  ack the 10 best 
2fd30 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f  paths */.  mxCho
2fd40 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3d 3d 31 29  ice = (nLoop==1)
2fd50 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32   ? 1 : (nLoop==2
2fd60 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73   ? 5 : 10);.  as
2fd70 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49  sert( nLoop<=pWI
2fd80 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
2fd90 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52  Src );.  WHERETR
2fda0 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d  ACE(0x002, ("---
2fdb0 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 5c 6e  - begin solver\n
2fdc0 22 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  "));..  /* Alloc
2fdd0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
2fde0 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f  ze space for aTo
2fdf0 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a 20 20   and aFrom */.  
2fe00 69 69 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65  ii = (sizeof(Whe
2fe10 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57  rePath)+sizeof(W
2fe20 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70  hereLoop*)*nLoop
2fe30 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20  )*mxChoice*2;.  
2fe40 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
2fe50 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
2fe60 69 69 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63  ii);.  if( pSpac
2fe70 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
2fe80 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54  LITE_NOMEM;.  aT
2fe90 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29  o = (WherePath*)
2fea0 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20  pSpace;.  aFrom 
2feb0 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a  = aTo+mxChoice;.
2fec0 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20    memset(aFrom, 
2fed0 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b  0, sizeof(aFrom[
2fee0 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68  0]));.  pX = (Wh
2fef0 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d  ereLoop**)(aFrom
2ff00 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f  +mxChoice);.  fo
2ff10 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c  r(ii=mxChoice*2,
2ff20 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30   pFrom=aTo; ii>0
2ff30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c  ; ii--, pFrom++,
2ff40 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20   pX += nLoop){. 
2ff50 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20     pFrom->aLoop 
2ff60 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = pX;.  }..  /* 
2ff70 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68 20  Seed the search 
2ff80 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68  with a single Wh
2ff90 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69  erePath containi
2ffa0 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f  ng zero WhereLoo
2ffb0 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55  ps..  **.  ** TU
2ffc0 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74  NING: Do not let
2ffd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
2ffe0 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f  terations go abo
2fff0 76 65 20 32 35 2e 20 20 49 66 20 74 68 65 20 63  ve 25.  If the c
30000 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70  ost.  ** of comp
30010 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74  uting an automat
30020 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ic index is not 
30030 70 61 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e  paid back within
30040 20 74 68 65 20 66 69 72 73 74 20 32 35 0a 20 20   the first 25.  
30050 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f  ** rows, then do
30060 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75 74   not use the aut
30070 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f  omatic index. */
30080 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77  .  aFrom[0].nRow
30090 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e   = MIN(pParse->n
300a0 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36 29 3b 20  QueryLoop, 46); 
300b0 20 61 73 73 65 72 74 28 20 34 36 3d 3d 77 68 65   assert( 46==whe
300c0 72 65 43 6f 73 74 28 32 35 29 20 29 3b 0a 20 20  reCost(25) );.  
300d0 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a  nFrom = 1;..  /*
300e0 20 50 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20   Precompute the 
300f0 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
30100 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74  the final result
30110 20 73 65 74 2c 20 69 66 20 74 68 65 20 63 61 6c   set, if the cal
30120 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  ler.  ** to sqli
30130 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
30140 77 61 73 20 63 6f 6e 63 65 72 6e 65 64 20 61 62  was concerned ab
30150 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20  out sorting */. 
30160 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 0a   rSortCost = 0;.
30170 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
30180 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f  rderBy==0 || nRo
30190 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  wEst==0 ){.    a
301a0 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65  From[0].isOrdere
301b0 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 65  dValid = 1;.  }e
301c0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 55 4e 49  lse{.    /* TUNI
301d0 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f  NG: Estimated co
301e0 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 69 73  st of sorting is
301f0 20 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65   N*log2(N) where
30200 20 4e 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a   N is the.    **
30210 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
30220 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 72  t rows. */.    r
30230 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 45  SortCost = nRowE
30240 73 74 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77  st + estLog(nRow
30250 45 73 74 29 3b 0a 20 20 20 20 57 48 45 52 45 54  Est);.    WHERET
30260 52 41 43 45 28 30 78 30 30 32 2c 28 22 2d 2d 2d  RACE(0x002,("---
30270 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64  - sort cost=%-3d
30280 5c 6e 22 2c 20 72 53 6f 72 74 43 6f 73 74 29 29  \n", rSortCost))
30290 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
302a0 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c 79  ute successively
302b0 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74   longer WherePat
302c0 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72 65  hs using the pre
302d0 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e  vious generation
302e0 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61  .  ** of WherePa
302f0 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69 73  ths as the basis
30300 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20   for the next.  
30310 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
30320 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20  e mxChoice.  ** 
30330 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65 61  best paths at ea
30340 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  ch generation */
30350 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
30360 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
30370 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d  op++){.    nTo =
30380 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   0;.    for(ii=0
30390 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69  , pFrom=aFrom; i
303a0 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70  i<nFrom; ii++, p
303b0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66  From++){.      f
303c0 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f  or(pWLoop=pWInfo
303d0 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70  ->pLoops; pWLoop
303e0 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d  ; pWLoop=pWLoop-
303f0 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
30400 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73       Bitmask mas
30410 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 42 69  kNew;.        Bi
30420 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
30430 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69 73  0;.        u8 is
30440 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 70  OrderedValid = p
30450 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 56  From->isOrderedV
30460 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 75 38  alid;.        u8
30470 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72   isOrdered = pFr
30480 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20  om->isOrdered;. 
30490 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
304a0 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46  op->prereq & ~pF
304b0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
304c0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
304d0 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
304e0 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46  p->maskSelf & pF
304f0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
30500 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
30510 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
30520 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69   point, pWLoop i
30530 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  s a candidate to
30540 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f   be the next loo
30550 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43  p. .        ** C
30560 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20  ompute its cost 
30570 2a 2f 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74  */.        rCost
30580 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   = whereCostAdd(
30590 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70  pWLoop->rSetup,p
305a0 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46  WLoop->rRun + pF
305b0 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20  rom->nRow);.    
305c0 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68 65 72      rCost = wher
305d0 65 43 6f 73 74 41 64 64 28 72 43 6f 73 74 2c 20  eCostAdd(rCost, 
305e0 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b 0a 20  pFrom->rCost);. 
305f0 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d         maskNew =
30600 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
30610 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
30620 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  elf;.        if(
30630 20 21 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64   !isOrderedValid
30640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 77   ){.          sw
30650 69 74 63 68 28 20 77 68 65 72 65 50 61 74 68 53  itch( wherePathS
30660 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
30670 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20  pWInfo,.        
30680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
30690 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
306a0 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e   pFrom, pWInfo->
306b0 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20  wctrlFlags,.    
306c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
306d0 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70     iLoop, pWLoop
306e0 2c 20 26 72 65 76 4d 61 73 6b 29 20 29 7b 0a 20  , &revMask) ){. 
306f0 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
30700 31 3a 20 20 2f 2a 20 59 65 73 2e 20 20 70 46 72  1:  /* Yes.  pFr
30710 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65 73 20 73  om+pWLoop does s
30720 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
30730 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
30740 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
30750 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  dered = 1;.     
30760 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
30770 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  edValid = 1;.   
30780 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
30790 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ;.            ca
307a0 73 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70  se 0:  /* No.  p
307b0 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c  From+pWLoop will
307c0 20 72 65 71 75 69 72 65 20 61 20 73 65 70 61 72   require a separ
307d0 61 74 65 20 73 6f 72 74 20 2a 2f 0a 20 20 20 20  ate sort */.    
307e0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
307f0 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  red = 0;.       
30800 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
30810 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Valid = 1;.     
30820 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d           rCost =
30830 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 43   whereCostAdd(rC
30840 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73 74 29 3b  ost, rSortCost);
30850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
30860 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
30870 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20 43 61    default: /* Ca
30880 6e 6e 6f 74 20 74 65 6c 6c 20 79 65 74 2e 20 20  nnot tell yet.  
30890 54 72 79 20 61 67 61 69 6e 20 6f 6e 20 74 68 65  Try again on the
308a0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
308b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
308c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
308d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
308e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  e{.          rev
308f0 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65  Mask = pFrom->re
30900 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d  vLoop;.        }
30910 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
30920 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f  k to see if pWLo
30930 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64  op should be add
30940 65 64 20 74 6f 20 74 68 65 20 6d 78 43 68 6f 69  ed to the mxChoi
30950 63 65 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  ce best so far *
30960 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a  /.        for(jj
30970 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c  =0, pTo=aTo; jj<
30980 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b  nTo; jj++, pTo++
30990 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
309a0 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d   pTo->maskLoop==
309b0 6d 61 73 6b 4e 65 77 20 26 26 20 70 54 6f 2d 3e  maskNew && pTo->
309c0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3d 3d  isOrderedValid==
309d0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 29  isOrderedValid )
309e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
309f0 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d  stcase( jj==nTo-
30a00 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1 );.           
30a10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
30a20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
30a30 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54        if( jj>=nT
30a40 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  o ){.          i
30a50 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65  f( nTo>=mxChoice
30a60 20 26 26 20 72 43 6f 73 74 3e 3d 6d 78 43 6f 73   && rCost>=mxCos
30a70 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52  t ){.#ifdef WHER
30a80 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
30a90 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
30aa0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
30ab0 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
30ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
30ad0 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20  ugPrintf("Skip  
30ae0 20 25 73 20 63 6f 73 74 3d 25 33 64 20 6f 72 64   %s cost=%3d ord
30af0 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
30b00 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
30b10 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
30b20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
30b30 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20   rCost,.        
30b40 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
30b50 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72  redValid ? (isOr
30b60 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
30b70 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
30b80 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
30b90 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
30ba0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
30bb0 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  }.          /* A
30bc0 64 64 20 61 20 6e 65 77 20 50 61 74 68 20 74 6f  dd a new Path to
30bd0 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74 20 2a   the aTo[] set *
30be0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
30bf0 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a  nTo<mxChoice ){.
30c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
30c10 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
30c20 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20   of the aTo set 
30c30 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  by one */.      
30c40 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b        jj = nTo++
30c50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
30c60 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
30c70 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61  * New path repla
30c80 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f  ces the prior wo
30c90 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e  rst to keep coun
30ca0 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65  t below mxChoice
30cb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
30cc0 66 6f 72 28 6a 6a 3d 6e 54 6f 2d 31 3b 20 61 54  for(jj=nTo-1; aT
30cd0 6f 5b 6a 6a 5d 2e 72 43 6f 73 74 3c 6d 78 43 6f  o[jj].rCost<mxCo
30ce0 73 74 3b 20 6a 6a 2d 2d 29 7b 20 61 73 73 65 72  st; jj--){ asser
30cf0 74 28 6a 6a 3e 30 29 3b 20 7d 0a 20 20 20 20 20  t(jj>0); }.     
30d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30d10 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b   pTo = &aTo[jj];
30d20 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
30d30 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
30d40 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
30d50 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
30d60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
30d70 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
30d80 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74  ("New    %s cost
30d90 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  =%-3d order=%c\n
30da0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
30db0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
30dc0 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
30dd0 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20  WLoop), rCost,. 
30de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
30df0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
30e00 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  (isOrdered ? 'Y'
30e10 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
30e20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
30e30 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  if.        }else
30e40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
30e50 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73  pTo->rCost<=rCos
30e60 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52  t ){.#ifdef WHER
30e70 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
30e80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
30e90 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
30ea0 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
30eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
30ec0 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
30ed0 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6b 69              "Ski
30ee0 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  p   %s cost=%-3d
30ef0 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
30f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
30f10 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
30f20 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
30f30 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20  ), rCost,.      
30f40 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
30f50 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73  deredValid ? (is
30f60 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
30f70 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
30f80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
30f90 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
30fa0 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33    vs %s cost=%-3
30fb0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
30fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30fd0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
30fe0 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
30ff0 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20 20   pTo->rCost,.   
31000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
31010 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
31020 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  id ? (pTo->isOrd
31030 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
31040 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
31050 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
31060 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
31070 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d  ase( pTo->rCost=
31080 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20  =rCost );.      
31090 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
310a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
310b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
310c0 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73  pTo->rCost==rCos
310d0 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  t+1 );.         
310e0 20 2f 2a 20 41 20 6e 65 77 20 61 6e 64 20 62 65   /* A new and be
310f0 74 74 65 72 20 73 63 6f 72 65 20 66 6f 72 20 61  tter score for a
31100 20 70 72 65 76 69 6f 75 73 6c 79 20 63 72 65 61   previously crea
31110 74 65 64 20 65 71 75 69 76 61 6c 65 6e 74 20 70  ted equivalent p
31120 61 74 68 20 2a 2f 0a 23 69 66 64 65 66 20 57 48  ath */.#ifdef WH
31130 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
31140 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
31150 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
31160 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
31170 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
31180 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
31190 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20          "Update 
311a0 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64  %s cost=%-3d ord
311b0 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
311c0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
311d0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
311e0 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
311f0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
31200 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c      isOrderedVal
31210 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20  id ? (isOrdered 
31220 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
31230 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
31240 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
31250 6e 74 66 28 22 20 20 77 61 73 20 25 73 20 63 6f  ntf("  was %s co
31260 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63  st=%-3d order=%c
31270 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
31280 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
31290 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
312a0 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
312b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
312c0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56   pTo->isOrderedV
312d0 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f  alid ? (pTo->isO
312e0 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
312f0 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
31300 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
31310 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31320 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20   /* pWLoop is a 
31330 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20  winner.  Add it 
31340 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65  to the set of be
31350 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  st so far */.   
31360 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f       pTo->maskLo
31370 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  op = pFrom->mask
31380 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
31390 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
313a0 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20   pTo->revLoop = 
313b0 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20  revMask;.       
313c0 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 70 46 72   pTo->nRow = pFr
313d0 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f  om->nRow + pWLoo
313e0 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  p->nOut;.       
313f0 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43   pTo->rCost = rC
31400 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ost;.        pTo
31410 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
31420 20 3d 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69   = isOrderedVali
31430 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  d;.        pTo->
31440 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72  isOrdered = isOr
31450 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d  dered;.        m
31460 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70  emcpy(pTo->aLoop
31470 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20  , pFrom->aLoop, 
31480 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
31490 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  *)*iLoop);.     
314a0 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c     pTo->aLoop[iL
314b0 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20  oop] = pWLoop;. 
314c0 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
314d0 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
314e0 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61        mxCost = a
314f0 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20  To[0].rCost;.   
31500 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c         for(jj=1,
31510 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a   pTo=&aTo[1]; jj
31520 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c  <mxChoice; jj++,
31530 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
31540 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
31550 6f 73 74 3e 6d 78 43 6f 73 74 20 29 20 6d 78 43  ost>mxCost ) mxC
31560 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74  ost = pTo->rCost
31570 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
31590 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48      }..#ifdef WH
315a0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
315b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
315c0 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20 29 7b  WhereTrace>=2 ){
315d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
315e0 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
315f0 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d  after round %d -
31600 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a  ---\n", iLoop);.
31610 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20        for(ii=0, 
31620 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b  pTo=aTo; ii<nTo;
31630 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   ii++, pTo++){. 
31640 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
31650 62 75 67 50 72 69 6e 74 66 28 22 20 25 73 20 63  bugPrintf(" %s c
31660 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d  ost=%-3d nrow=%-
31670 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
31680 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
31690 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
316a0 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
316b0 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
316c0 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
316d0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
316e0 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
316f0 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
31700 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66  '?');.        if
31710 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ( pTo->isOrdered
31720 56 61 6c 69 64 20 26 26 20 70 54 6f 2d 3e 69 73  Valid && pTo->is
31730 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20  Ordered ){.     
31740 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
31750 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78  gPrintf(" rev=0x
31760 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65  %llx\n", pTo->re
31770 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  vLoop);.        
31780 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31790 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
317a0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ntf("\n");.     
317b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
317c0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
317d0 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73  * Swap the roles
317e0 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54   of aFrom and aT
317f0 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67  o for the next g
31800 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  eneration */.   
31810 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20   pFrom = aTo;.  
31820 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20    aTo = aFrom;. 
31830 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d     aFrom = pFrom
31840 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54  ;.    nFrom = nT
31850 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46  o;.  }..  if( nF
31860 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  rom==0 ){.    sq
31870 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
31880 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20  arse, "no query 
31890 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20  solution");.    
318a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
318b0 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72  , pSpace);.    r
318c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
318d0 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OR;.  }.  .  /* 
318e0 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  Find the lowest 
318f0 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f  cost path.  pFro
31900 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70  m will be left p
31910 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20  ointing to that 
31920 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20  path */.  pFrom 
31930 3d 20 61 46 72 6f 6d 3b 0a 20 20 61 73 73 65 72  = aFrom;.  asser
31940 74 28 20 6e 46 72 6f 6d 3d 3d 31 20 29 3b 0a 23  t( nFrom==1 );.#
31950 69 66 20 30 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  if 0 /* The foll
31960 6f 77 69 6e 67 20 69 73 20 6e 65 65 64 65 64 20  owing is needed 
31970 69 66 20 6e 46 72 6f 6d 20 69 73 20 65 76 65 72  if nFrom is ever
31980 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 2a 2f 0a   more than 1 */.
31990 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
319a0 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  From; ii++){.   
319b0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73   if( pFrom->rCos
319c0 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73  t>aFrom[ii].rCos
319d0 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72  t ) pFrom = &aFr
319e0 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 23 65 6e 64  om[ii];.  }.#end
319f0 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  if.  assert( pWI
31a00 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f  nfo->nLevel==nLo
31a10 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20  op );.  /* Load 
31a20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
31a30 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f  path into pWInfo
31a40 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
31a50 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
31a60 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68  iLoop++){.    Wh
31a70 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
31a80 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69   = pWInfo->a + i
31a90 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Loop;.    pLevel
31aa0 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f  ->pWLoop = pWLoo
31ab0 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  p = pFrom->aLoop
31ac0 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65  [iLoop];.    pLe
31ad0 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c  vel->iFrom = pWL
31ae0 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70  oop->iTab;.    p
31af0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d  Level->iTabCur =
31b00 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
31b10 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
31b20 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d  om].iCursor;.  }
31b30 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e  .  if( (pWInfo->
31b40 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
31b50 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
31b60 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e  )!=0.   && (pWIn
31b70 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
31b80 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
31b90 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e  Y)==0.   && pWIn
31ba0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57  fo->eDistinct==W
31bb0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
31bc0 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74  OP.   && nRowEst
31bd0 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  .  ){.    Bitmas
31be0 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69  k notUsed;.    i
31bf0 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74  nt rc = wherePat
31c00 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
31c10 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  y(pWInfo, pWInfo
31c20 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46  ->pResultSet, pF
31c30 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rom,.           
31c40 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54        WHERE_DIST
31c50 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c  INCTBY, nLoop-1,
31c60 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
31c70 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64  oop-1], &notUsed
31c80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 31  );.    if( rc==1
31c90 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74   ) pWInfo->eDist
31ca0 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
31cb0 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
31cc0 20 7d 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e   }.  if( pFrom->
31cd0 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  isOrdered ){.   
31ce0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
31cf0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
31d00 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20  DISTINCTBY ){.  
31d10 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
31d20 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
31d30 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
31d40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31d50 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20   pWInfo->bOBSat 
31d60 3d 20 31 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  = 1;.      pWInf
31d70 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72  o->revMask = pFr
31d80 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20  om->revLoop;.   
31d90 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d   }.  }.  pWInfo-
31da0 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d  >nRowOut = pFrom
31db0 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72  ->nRow;..  /* Fr
31dc0 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d  ee temporary mem
31dd0 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73  ory and return s
31de0 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69  uccess */.  sqli
31df0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
31e00 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  pace);.  return 
31e10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
31e20 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73  .** Most queries
31e30 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67   use only a sing
31e40 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79 20 61  le table (they a
31e50 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e  re not joins) an
31e60 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65  d have.** simple
31e70 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
31e80 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20  against indexed 
31e90 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f  fields.  This ro
31ea0 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a  utine attempts.*
31eb0 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20  * to plan those 
31ec0 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69  simple cases usi
31ed0 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72  ng much less cer
31ee0 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a  emony than the.*
31ef0 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
31f00 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c  e query planner,
31f10 20 61 6e 64 20 74 68 65 72 65 62 79 20 79 69 65   and thereby yie
31f20 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69 74 65  ld faster sqlite
31f30 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74  3_prepare().** t
31f40 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d  imes for the com
31f50 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  mon case..**.** 
31f60 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
31f70 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20 74  on success, if t
31f80 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
31f90 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73   handled by this
31fa0 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75  .** no-frills qu
31fb0 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65  ery planner.  Re
31fc0 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69  turn zero if thi
31fd0 73 20 71 75 65 72 79 20 6e 65 65 64 73 20 74 68  s query needs th
31fe0 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  e .** general-pu
31ff0 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
32000 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ner..*/.static i
32010 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  nt whereShortCut
32020 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
32030 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
32040 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
32050 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  o;.  struct SrcL
32060 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
32070 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
32080 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  pWC;.  WhereTerm
32090 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65   *pTerm;.  Where
320a0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69  Loop *pLoop;.  i
320b0 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a  nt iCur;.  int j
320c0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
320d0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
320e0 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42    .  pWInfo = pB
320f0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
32100 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
32110 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
32120 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 29 20 72  _FORCE_TABLE ) r
32130 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
32140 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  t( pWInfo->pTabL
32150 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a  ist->nSrc>=1 );.
32160 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f    pItem = pWInfo
32170 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  ->pTabList->a;. 
32180 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70   pTab = pItem->p
32190 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72  Tab;.  if( IsVir
321a0 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
321b0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74  urn 0;.  if( pIt
321c0 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20 72 65 74  em->zIndex ) ret
321d0 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20  urn 0;.  iCur = 
321e0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
321f0 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d    pWC = &pWInfo-
32200 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  >sWC;.  pLoop = 
32210 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
32220 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
32230 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20   = 0;.  pTerm = 
32240 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
32250 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51  ur, -1, 0, WO_EQ
32260 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72  , 0);.  if( pTer
32270 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  m ){.    pLoop->
32280 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
32290 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
322a0 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  IPK|WHERE_ONEROW
322b0 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54  ;.    pLoop->aLT
322c0 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
322d0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
322e0 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70  m = 1;.    pLoop
322f0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
32300 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  1;.    /* TUNING
32310 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77 69  : Cost of a rowi
32320 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a  d lookup is 10 *
32330 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75  /.    pLoop->rRu
32340 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d  n = 33;  /* 33==
32350 77 68 65 72 65 43 6f 73 74 28 31 30 29 20 2a 2f  whereCost(10) */
32360 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
32370 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
32380 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
32390 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
323a0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
323b0 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 7c  Error==OE_None |
323c0 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  | pIdx->pPartIdx
323d0 57 68 65 72 65 21 3d 30 20 29 20 63 6f 6e 74 69  Where!=0 ) conti
323e0 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nue;.      for(j
323f0 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
32400 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
32410 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
32420 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70  erm(pWC, iCur, p
32430 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
32440 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78  , 0, WO_EQ, pIdx
32450 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
32460 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
32470 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
32480 6f 70 52 65 73 69 7a 65 28 70 57 49 6e 66 6f 2d  opResize(pWInfo-
32490 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f  >pParse->db, pLo
324a0 6f 70 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20  op, j);.        
324b0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
324c0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
324d0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70  }.      if( j!=p
324e0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63  Idx->nColumn ) c
324f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
32500 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
32510 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
32520 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45  WHERE_ONEROW|WHE
32530 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
32540 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 63 6f    if( (pItem->co
32550 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73  lUsed & ~columns
32560 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d  InIndex(pIdx))==
32570 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  0 ){.        pLo
32580 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
32590 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
325a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f       }.      pLo
325b0 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a  op->nLTerm = j;.
325c0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
325d0 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20  tree.nEq = j;.  
325e0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
325f0 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
32600 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
32610 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69  G: Cost of a uni
32620 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  que index lookup
32630 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20   is 15 */.      
32640 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39  pLoop->rRun = 39
32650 3b 20 20 2f 2a 20 33 39 3d 3d 77 68 65 72 65 43  ;  /* 39==whereC
32660 6f 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20  ost(15) */.     
32670 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
32680 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  }.  if( pLoop->w
32690 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c  sFlags ){.    pL
326a0 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 57 68 65  oop->nOut = (Whe
326b0 72 65 43 6f 73 74 29 31 3b 0a 20 20 20 20 70 57  reCost)1;.    pW
326c0 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
326d0 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70  p = pLoop;.    p
326e0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  Loop->maskSelf =
326f0 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
32700 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
32710 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  );.    pWInfo->a
32720 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43  [0].iTabCur = iC
32730 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ur;.    pWInfo->
32740 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20  nRowOut = 1;.   
32750 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
32760 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
32770 62 4f 42 53 61 74 20 3d 20 20 31 3b 0a 20 20 20  bOBSat =  1;.   
32780 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
32790 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
327a0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
327b0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
327c0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
327d0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
327e0 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
327f0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
32800 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27  pLoop->cId = '0'
32810 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
32820 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
32830 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
32840 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67  Generate the beg
32850 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f  inning of the lo
32860 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52  op used for WHER
32870 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
32880 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ing..** The retu
32890 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f  rn value is a po
328a0 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71  inter to an opaq
328b0 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ue structure tha
328c0 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e  t contains.** in
328d0 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64  formation needed
328e0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
328f0 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20  e loop.  Later, 
32900 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
32910 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e  ine.** should in
32920 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72  voke sqlite3Wher
32930 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20  eEnd() with the 
32940 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
32950 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
32960 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d   in order to com
32970 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20  plete the WHERE 
32980 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
32990 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
329a0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69  rror occurs, thi
329b0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
329c0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
329d0 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20  e basic idea is 
329e0 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c  to do a nested l
329f0 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f  oop, one loop fo
32a00 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a  r each table in.
32a10 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
32a20 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20  se of a select. 
32a30 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44   (INSERT and UPD
32a40 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ATE statements a
32a50 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  re the.** same a
32a60 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20  s a SELECT with 
32a70 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
32a80 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
32a90 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a  clause.)  For.**
32aa0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
32ab0 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a   SQL is this:.**
32ac0 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54  .**       SELECT
32ad0 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20   * FROM t1, t2, 
32ae0 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a  t3 WHERE ...;.**
32af0 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64  .** Then the cod
32b00 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63  e generated is c
32b10 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65  onceptually like
32b20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
32b30 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61  **.**      forea
32b40 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
32b50 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
32b60 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
32b70 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
32b80 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20  2 in t2 do      
32b90 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
32ba0 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20  ereBegin().**   
32bb0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
32bc0 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f  ow3 in t3 do   /
32bd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e  .**            .
32be0 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65  ...**          e
32bf0 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
32c00 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
32c10 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
32c20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
32c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c40 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
32c50 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20  ereEnd().**     
32c60 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
32c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
32c80 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
32c90 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e  he loops might n
32ca0 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20  ot be nested in 
32cb0 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69  the order in whi
32cc0 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61  ch they.** appea
32cd0 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
32ce0 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72  ause if a differ
32cf0 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74  ent order is bet
32d00 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65  ter able to make
32d10 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63  .** use of indic
32d20 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  es.  Note also t
32d30 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20  hat when the IN 
32d40 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73  operator appears
32d50 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45   in.** the WHERE
32d60 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68   clause, it migh
32d70 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69  t result in addi
32d80 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f  tional nested lo
32d90 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e  ops for.** scann
32da0 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ing through all 
32db0 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69  values on the ri
32dc0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
32dd0 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54   the IN..**.** T
32de0 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63  here are Btree c
32df0 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
32e00 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c  d with each tabl
32e10 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73  e.  t1 uses curs
32e20 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61  or.** number pTa
32e30 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  bList->a[0].iCur
32e40 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68  sor.  t2 uses th
32e50 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73  e cursor pTabLis
32e60 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e  t->a[1].iCursor.
32e70 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  .** And so forth
32e80 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
32e90 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
32ea0 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42  o open those VDB
32eb0 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64  E cursors.** and
32ec0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
32ed0 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  () generates the
32ee0 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74   code to close t
32ef0 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  hem..**.** The c
32f00 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
32f10 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e  WhereBegin() gen
32f20 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68  erates leaves th
32f30 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a  e cursors named.
32f40 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70  ** in pTabList p
32f50 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72  ointing at their
32f60 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74   appropriate ent
32f70 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d  ries.  The [...]
32f80 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65   code.** can use
32f90 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f   OP_Column and O
32fa0 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20  P_Rowid opcodes 
32fb0 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73  on these cursors
32fc0 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64   to extract.** d
32fd0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72  ata from the var
32fe0 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74  ious tables of t
32ff0 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  he loop..**.** I
33000 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
33010 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  se is empty, the
33020 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d   foreach loops m
33030 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68  ust each scan th
33040 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61  eir.** entire ta
33050 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68  bles.  Thus a th
33060 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20  ree-way join is 
33070 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74  an O(N^3) operat
33080 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20  ion.  But if.** 
33090 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20  the tables have 
330a0 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72  indices and ther
330b0 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74  e are terms in t
330c0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
330d0 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f  that.** refer to
330e0 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20   those indices, 
330f0 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65  a complete table
33100 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f   scan can be avo
33110 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ided and the.** 
33120 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75  code will run mu
33130 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74  ch faster.  Most
33140 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   of the work of 
33150 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
33160 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73  checking.** to s
33170 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
33180 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e  indices that can
33190 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65   be used to spee
331a0 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  d up the loop..*
331b0 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68  *.** Terms of th
331c0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
331d0 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20  re also used to 
331e0 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73  limit which rows
331f0 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b   actually.** mak
33200 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e  e it to the "...
33210 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  " in the middle 
33220 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66  of the loop.  Af
33230 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63  ter each "foreac
33240 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20  h",.** terms of 
33250 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
33260 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74   that use only t
33270 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f  erms in that loo
33280 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c  p and outer.** l
33290 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74  oops are evaluat
332a0 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20  ed and if false 
332b0 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61  a jump is made a
332c0 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71  round all subseq
332d0 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f  uent.** inner lo
332e0 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74  ops (or around t
332f0 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20  he "..." if the 
33300 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68  test occurs with
33310 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a  in the inner-.**
33320 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a   most loop).**.*
33330 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a  * OUTER JOINS.**
33340 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69  .** An outer joi
33350 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61  n of tables t1 a
33360 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74  nd t2 is concept
33370 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f  ally coded as fo
33380 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
33390 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
333a0 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c  t1 do.**      fl
333b0 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66  ag = 0.**      f
333c0 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
333d0 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  2 do.**        s
333e0 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20  tart:.**        
333f0 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
33400 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20    flag = 1.**   
33410 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69     end.**      i
33420 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a  f flag==0 then.*
33430 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68  *        move th
33440 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f  e row2 cursor to
33450 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20   a null row.**  
33460 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74        goto start
33470 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20  .**      fi.**  
33480 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45    end.**.** ORDE
33490 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43  R BY CLAUSE PROC
334a0 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72  ESSING.**.** pOr
334b0 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74  derBy is a point
334c0 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  er to the ORDER 
334d0 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74 68  BY clause (or th
334e0 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
334f0 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52  e.** if the WHER
33500 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69  E_GROUPBY flag i
33510 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46 6c  s set in wctrlFl
33520 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43 54  ags) of a SELECT
33530 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66   statement.** if
33540 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
33550 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  If there is no O
33560 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
33570 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  r if this routin
33580 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66  e.** is called f
33590 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72  rom an UPDATE or
335a0 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
335b0 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79  t, then pOrderBy
335c0 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 57 68 65   is NULL..*/.Whe
335d0 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
335e0 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
335f0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
33600 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
33610 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
33620 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
33630 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
33640 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c  se: A list of al
33650 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
33660 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
33670 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
33680 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
33690 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
336a0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
336b0 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
336c0 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
336d0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
336e0 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65  ResultSet, /* Re
336f0 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
33700 71 75 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77  query */.  u16 w
33710 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
33720 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
33730 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66  HERE_* flags def
33740 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
33750 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  t.h */.  int iId
33760 78 43 75 72 20 20 20 20 20 20 20 20 20 20 20 2f  xCur           /
33770 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41  * If WHERE_ONETA
33780 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c  BLE_ONLY is set,
33790 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75   index cursor nu
337a0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  mber */.){.  int
337b0 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20   nByteWInfo;    
337c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20          /* Num. 
337d0 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
337e0 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74  for WhereInfo st
337f0 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ruct */.  int nT
33800 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
33810 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
33820 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54  f elements in pT
33830 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72  abList */.  Wher
33840 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
33850 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62         /* Will b
33860 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e  ecome the return
33870 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
33880 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  unction */.  Vdb
33890 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
338a0 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76  Vdbe;   /* The v
338b0 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
338c0 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d  engine */.  Bitm
338d0 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20  ask notReady;   
338e0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
338f0 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79  s that are not y
33900 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f  et positioned */
33910 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
33920 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a  der sWLB;     /*
33930 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62   The WhereLoop b
33940 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72  uilder */.  Wher
33950 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
33960 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78  et;    /* The ex
33970 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
33980 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  t */.  WhereLeve
33990 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20  l *pLevel;      
339a0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65    /* A single le
339b0 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61  vel in pWInfo->a
339c0 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
339d0 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
339e0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
339f0 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c   a single WhereL
33a00 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
33a10 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
33a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
33a30 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
33a40 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
33a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
33a60 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
33a70 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  n */.  int rc;  
33a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a90 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
33aa0 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61   */...  /* Varia
33ab0 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ble initializati
33ac0 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  on */.  db = pPa
33ad0 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65  rse->db;.  memse
33ae0 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65  t(&sWLB, 0, size
33af0 6f 66 28 73 57 4c 42 29 29 3b 0a 20 20 73 57 4c  of(sWLB));.  sWL
33b00 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  B.pOrderBy = pOr
33b10 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73  derBy;..  /* Dis
33b20 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43  able the DISTINC
33b30 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  T optimization i
33b40 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  f SQLITE_Distinc
33b50 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61 0a  tOpt is set via.
33b60 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    ** sqlite3_tes
33b70 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45  t_ctrl(SQLITE_TE
33b80 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
33b90 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69  IONS,...) */.  i
33ba0 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
33bb0 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
33bc0 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20  TE_DistinctOpt) 
33bd0 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67  ){.    wctrlFlag
33be0 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54  s &= ~WHERE_WANT
33bf0 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a  _DISTINCT;.  }..
33c00 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
33c10 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
33c20 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
33c30 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e  limited by the n
33c40 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69  umber of.  ** bi
33c50 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20  ts in a Bitmask 
33c60 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
33c70 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
33c80 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70  ==BMS );.  if( p
33c90 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d  TabList->nSrc>BM
33ca0 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  S ){.    sqlite3
33cb0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
33cc0 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62   "at most %d tab
33cd0 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20  les in a join", 
33ce0 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  BMS);.    return
33cf0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   0;.  }..  /* Th
33d00 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d  is function norm
33d10 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61  ally generates a
33d20 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72   nested loop for
33d30 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a   all tables in .
33d40 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20    ** pTabList.  
33d50 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52 45  But if the WHERE
33d60 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
33d70 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
33d80 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20   we should.  ** 
33d90 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f  only generate co
33da0 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  de for the first
33db0 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
33dc0 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68  st and assume th
33dd0 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73  at.  ** any curs
33de0 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
33df0 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74  ith subsequent t
33e00 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74  ables are uninit
33e10 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
33e20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72  nTabList = (wctr
33e30 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
33e40 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20  NETABLE_ONLY) ? 
33e50 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  1 : pTabList->nS
33e60 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  rc;..  /* Alloca
33e70 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
33e80 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  e the WhereInfo 
33e90 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
33ea0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20  ill become the. 
33eb0 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
33ec0 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  . A single alloc
33ed0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
33ee0 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72 65   store the Where
33ef0 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74  Info.  ** struct
33f00 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
33f10 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c  f WhereInfo.a[],
33f20 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
33f30 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
33f40 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61 73  and the WhereMas
33f50 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e 20  kSet structure. 
33f60 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73  Since WhereClaus
33f70 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d  e contains an 8-
33f80 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20  byte.  ** field 
33f90 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69  (type Bitmask) i
33fa0 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65  t must be aligne
33fb0 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62  d on an 8-byte b
33fc0 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20  oundary on.  ** 
33fd0 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75 72  some architectur
33fe0 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f  es. Hence the RO
33ff0 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20  UND8() below..  
34000 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20  */.  nByteWInfo 
34010 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
34020 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62  WhereInfo)+(nTab
34030 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57  List-1)*sizeof(W
34040 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70  hereLevel));.  p
34050 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  WInfo = sqlite3D
34060 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
34070 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a  nByteWInfo + siz
34080 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
34090 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
340a0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
340b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
340c0 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57   pWInfo);.    pW
340d0 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f  Info = 0;.    go
340e0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
340f0 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  or;.  }.  pWInfo
34100 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c  ->nLevel = nTabL
34110 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  ist;.  pWInfo->p
34120 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
34130 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
34140 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
34150 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
34160 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
34170 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
34180 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  et = pResultSet;
34190 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  .  pWInfo->iBrea
341a0 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
341b0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70  akeLabel(v);.  p
341c0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
341d0 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a  s = wctrlFlags;.
341e0 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e    pWInfo->savedN
341f0 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
34200 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
34210 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57    pMaskSet = &pW
34220 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a  Info->sMaskSet;.
34230 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20    sWLB.pWInfo = 
34240 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70  pWInfo;.  sWLB.p
34250 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
34260 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d  C;.  sWLB.pNew =
34270 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28   (WhereLoop*)(((
34280 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42  char*)pWInfo)+nB
34290 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73  yteWInfo);.  ass
342a0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
342b0 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70  ALIGNMENT(sWLB.p
342c0 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c  New) );.  whereL
342d0 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65  oopInit(sWLB.pNe
342e0 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  w);.#ifdef SQLIT
342f0 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70  E_DEBUG.  sWLB.p
34300 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a  New->cId = '*';.
34310 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c  #endif..  /* Spl
34320 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  it the WHERE cla
34330 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74  use into separat
34340 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
34350 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a   where each.  **
34360 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
34370 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61  s separated by a
34380 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
34390 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53    */.  initMaskS
343a0 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20  et(pMaskSet);.  
343b0 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
343c0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57  &pWInfo->sWC, pW
343d0 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33  Info);.  sqlite3
343e0 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74  ExprCodeConstant
343f0 73 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  s(pParse, pWhere
34400 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28  );.  whereSplit(
34410 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57  &pWInfo->sWC, pW
34420 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20  here, TK_AND);. 
34430 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
34440 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
34450 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20   -1); /* Insert 
34460 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
34470 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 20 20  ier Goto */.    
34480 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
34490 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75  se: a WHERE clau
344a0 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  se that is const
344b0 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74  ant.  Evaluate t
344c0 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  he.  ** expressi
344d0 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75  on and either ju
344e0 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  mp over all of t
344f0 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20  he code or fall 
34500 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  thru..  */.  if(
34510 20 70 57 68 65 72 65 20 26 26 20 28 6e 54 61 62   pWhere && (nTab
34520 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  List==0 || sqlit
34530 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
34540 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29  NotJoin(pWhere))
34550 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
34560 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
34570 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66  e, pWhere, pWInf
34580 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54  o->iBreak, SQLIT
34590 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
345a0 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
345b0 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
345c0 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63   case: No FROM c
345d0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28  lause.  */.  if(
345e0 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a   nTabList==0 ){.
345f0 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
34600 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61   ) pWInfo->bOBSa
34610 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 77  t = 1;.    if( w
34620 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
34630 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
34640 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
34650 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
34660 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
34670 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
34680 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74   /* Assign a bit
34690 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73   from the bitmas
346a0 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  k to every term 
346b0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
346c0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  se..  **.  ** Wh
346d0 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74  en assigning bit
346e0 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46  mask values to F
346f0 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f  ROM clause curso
34700 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20  rs, it must be. 
34710 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61   ** the case tha
34720 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69  t if X is the bi
34730 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d  tmask for the N-
34740 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  th FROM clause t
34750 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  erm then.  ** th
34760 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
34770 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  l FROM clause te
34780 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  rms to the left 
34790 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d  of the N-th term
347a0 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20  .  ** is (X-1). 
347b0 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20    An expression 
347c0 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
347d0 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
347e0 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69  N can use.  ** i
347f0 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  ts Expr.iRightJo
34800 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f  inTable value to
34810 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73   find the bitmas
34820 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  k of the right t
34830 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  able.  ** of the
34840 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74   join.  Subtract
34850 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65  ing one from the
34860 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74   right table bit
34870 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a  mask gives a.  *
34880 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  * bitmask for al
34890 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
348a0 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
348b0 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62  .  Knowing the b
348c0 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20  itmask.  ** for 
348d0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
348e0 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74  e left of a left
348f0 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61   join is importa
34900 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  nt.  Ticket #301
34910 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  5..  **.  ** Not
34920 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20  e that bitmasks 
34930 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
34940 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  all pTabList->nS
34950 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a  rc tables in.  *
34960 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20  * pTabList, not 
34970 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  just the first n
34980 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20  TabList tables. 
34990 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72   nTabList is nor
349a0 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c  mally.  ** equal
349b0 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   to pTabList->nS
349c0 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20  rc but might be 
349d0 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69  shortened to 1 i
349e0 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45  f the.  ** WHERE
349f0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
34a00 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f  lag is set..  */
34a10 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
34a20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
34a30 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74  ii++){.    creat
34a40 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  eMask(pMaskSet, 
34a50 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
34a60 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69  iCursor);.  }.#i
34a70 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b  fndef NDEBUG.  {
34a80 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54  .    Bitmask toT
34a90 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  heLeft = 0;.    
34aa0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
34ab0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
34ac0 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  +){.      Bitmas
34ad0 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k m = getMask(pM
34ae0 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
34af0 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
34b00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
34b10 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74  (m-1)==toTheLeft
34b20 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c   );.      toTheL
34b30 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a  eft |= m;.    }.
34b40 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
34b50 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20   Analyze all of 
34b60 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
34b70 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65  ns.  Note that e
34b80 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67  xprAnalyze() mig
34b90 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20  ht.  ** add new 
34ba0 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e  virtual terms on
34bb0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
34bc0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
34bd0 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20   We do not.  ** 
34be0 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20  want to analyze 
34bf0 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65  these virtual te
34c00 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e  rms, so start an
34c10 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65  alyzing at the e
34c20 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b  nd.  ** and work
34c30 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74   forward so that
34c40 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75   the added virtu
34c50 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76  al terms are nev
34c60 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20  er processed..  
34c70 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  */.  exprAnalyze
34c80 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 70  All(pTabList, &p
34c90 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69  WInfo->sWC);.  i
34ca0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
34cb0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
34cc0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
34cd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
34ce0 65 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47  e ORDER BY (or G
34cf0 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20  ROUP BY) clause 
34d00 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72 65 6e  contains referen
34d10 63 65 73 20 74 6f 20 67 65 6e 65 72 61 6c 0a 20  ces to general. 
34d20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   ** expressions,
34d30 20 74 68 65 6e 20 77 65 20 77 6f 6e 27 74 20 62   then we won't b
34d40 65 20 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66  e able to satisf
34d50 79 20 69 74 20 75 73 69 6e 67 20 69 6e 64 69 63  y it using indic
34d60 65 73 2c 20 73 6f 0a 20 20 2a 2a 20 67 6f 20 61  es, so.  ** go a
34d70 68 65 61 64 20 61 6e 64 20 64 69 73 61 62 6c 65  head and disable
34d80 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
34d90 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  if( pOrderBy && 
34da0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
34db0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
34dc0 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  T)!=0 ){.    for
34dd0 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 64 65 72  (ii=0; ii<pOrder
34de0 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  By->nExpr; ii++)
34df0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
34e00 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
34e10 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
34e20 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 70 45 78  derBy->a[ii].pEx
34e30 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
34e40 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
34e50 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  UMN ){.        p
34e60 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
34e70 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  = pOrderBy = 0;.
34e80 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
34e90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
34ea0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
34eb0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
34ec0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
34ed0 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74 72 6c    }..  if( wctrl
34ee0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
34ef0 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
34f00 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63     if( isDistinc
34f10 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73  tRedundant(pPars
34f20 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57  e, pTabList, &pW
34f30 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75  Info->sWC, pResu
34f40 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20  ltSet) ){.      
34f50 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20  /* The DISTINCT 
34f60 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74  marking is point
34f70 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74  less.  Ignore it
34f80 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  . */.      pWInf
34f90 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
34fa0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
34fb0 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  IQUE;.    }else 
34fc0 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
34fd0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
34fe0 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20  to ORDER BY the 
34ff0 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61  result set to ma
35000 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63  ke distinct proc
35010 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f  essing easier */
35020 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77  .      pWInfo->w
35030 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45  ctrlFlags |= WHE
35040 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20  RE_DISTINCTBY;. 
35050 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
35060 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53  derBy = pResultS
35070 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  et;.    }.  }.. 
35080 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
35090 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
350a0 63 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54 52  cts */.  WHERETR
350b0 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a  ACE(0xffff,("***
350c0 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74   Optimizer Start
350d0 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69 66 28   ***\n"));.  if(
350e0 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20   nTabList!=1 || 
350f0 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26 73  whereShortCut(&s
35100 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  WLB)==0 ){.    r
35110 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
35120 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20  All(&sWLB);.    
35130 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
35140 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
35150 20 0a 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79   .    /* Display
35160 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72   all of the Wher
35170 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 66  eLoop objects if
35180 20 77 68 65 72 65 74 72 61 63 65 20 69 73 20 65   wheretrace is e
35190 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64 65 66  nabled */.#ifdef
351a0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
351b0 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
351c0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
351d0 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  .      WhereLoop
351e0 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69   *p;.      int i
351f0 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  ;.      static c
35200 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22  har zLabel[] = "
35210 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66  0123456789abcdef
35220 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
35230 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20  wyxz".          
35240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35250 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 42               "AB
35260 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
35270 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20  STUVWYXZ";.     
35280 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70   for(p=pWInfo->p
35290 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70  Loops, i=0; p; p
352a0 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69  =p->pNextLoop, i
352b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
352c0 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73  cId = zLabel[i%s
352d0 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a  izeof(zLabel)];.
352e0 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
352f0 70 50 72 69 6e 74 28 70 2c 20 70 54 61 62 4c 69  pPrint(p, pTabLi
35300 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
35310 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20   }.#endif.  .   
35320 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
35330 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20  (pWInfo, 0);.   
35340 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
35350 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
35360 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
35370 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
35380 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
35390 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
353a0 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
353b0 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20  >nRowOut+1);.   
353c0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
353d0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
353e0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
353f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
35400 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
35410 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61  y==0 && (db->fla
35420 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65  gs & SQLITE_Reve
35430 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a  rseOrder)!=0 ){.
35440 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
35450 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29  Mask = (Bitmask)
35460 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  (-1);.  }.  if( 
35470 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
35480 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63  NEVER(db->malloc
35490 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67  Failed) ){.    g
354a0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
354b0 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  ror;.  }.#ifdef 
354c0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
354d0 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
354e0 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20  WhereTrace ){.  
354f0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 73 71    int ii;.    sq
35500 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
35510 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20  ("---- Solution 
35520 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f  nRow=%d", pWInfo
35530 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20  ->nRowOut);.    
35540 69 66 28 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53  if( pWInfo->bOBS
35550 61 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  at ){.      sqli
35560 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
35570 20 4f 52 44 45 52 42 59 3d 30 78 25 6c 6c 78 22   ORDERBY=0x%llx"
35580 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73  , pWInfo->revMas
35590 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  k);.    }.    sw
355a0 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44  itch( pWInfo->eD
355b0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
355c0 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
355d0 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20  INCT_UNIQUE: {. 
355e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
355f0 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
35600 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a  TINCT=unique");.
35610 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
35620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
35630 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
35640 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  _ORDERED: {.    
35650 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
35660 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
35670 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  CT=ordered");.  
35680 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
35690 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
356a0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
356b0 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  NORDERED: {.    
356c0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
356d0 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
356e0 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a  CT=unordered");.
356f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
35700 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
35710 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
35720 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66  ntf("\n");.    f
35730 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e  or(ii=0; ii<pWIn
35740 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b  fo->nLevel; ii++
35750 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
35760 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e  opPrint(pWInfo->
35770 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 70 54  a[ii].pWLoop, pT
35780 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  abList);.    }. 
35790 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41   }.#endif.  /* A
357a0 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74  ttempt to omit t
357b0 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a  ables from the j
357c0 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  oin that do not 
357d0 65 66 66 65 63 74 20 74 68 65 20 72 65 73 75 6c  effect the resul
357e0 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66  t */.  if( pWInf
357f0 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20  o->nLevel>=2.   
35800 26 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30  && pResultSet!=0
35810 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
35820 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
35830 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f  QLITE_OmitNoopJo
35840 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74  in).  ){.    Bit
35850 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d 20 65  mask tabUsed = e
35860 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
35870 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 65 73  e(pMaskSet, pRes
35880 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28  ultSet);.    if(
35890 20 70 4f 72 64 65 72 42 79 20 29 20 74 61 62 55   pOrderBy ) tabU
358a0 73 65 64 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  sed |= exprListT
358b0 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
358c0 65 74 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  et, pOrderBy);. 
358d0 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
358e0 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20  ->nLevel>=2 ){. 
358f0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
35900 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20  pTerm, *pEnd;.  
35910 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e      pLoop = pWIn
35920 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c  fo->a[pWInfo->nL
35930 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a  evel-1].pWLoop;.
35940 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
35950 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
35960 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e  Loop->iTab].join
35970 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d  type & JT_LEFT)=
35980 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
35990 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
359a0 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
359b0 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20  ISTINCT)==0.    
359c0 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
359d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
359e0 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20 29  EROW)==0.      )
359f0 7b 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 69  .      }.      i
35a10 66 28 20 28 74 61 62 55 73 65 64 20 26 20 70 4c  f( (tabUsed & pL
35a20 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  oop->maskSelf)!=
35a30 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
35a40 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43   pEnd = sWLB.pWC
35a50 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e  ->a + sWLB.pWC->
35a60 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72  nTerm;.      for
35a70 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d  (pTerm=sWLB.pWC-
35a80 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20  >a; pTerm<pEnd; 
35a90 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
35aa0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
35ab0 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
35ac0 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20 20  >maskSelf)!=0.  
35ad0 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72 48         && !ExprH
35ae0 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
35af0 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
35b00 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29 7b  Join).        ){
35b10 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
35b20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35b30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54    }.      if( pT
35b40 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61 6b  erm<pEnd ) break
35b50 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
35b60 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e 20  CE(0xffff, ("-> 
35b70 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74  drop loop %c not
35b80 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d   used\n", pLoop-
35b90 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70 57  >cId));.      pW
35ba0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a  Info->nLevel--;.
35bb0 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d        nTabList--
35bc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48  ;.    }.  }.  WH
35bd0 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c  ERETRACE(0xffff,
35be0 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
35bf0 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29  Finished ***\n")
35c00 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  );.  pWInfo->pPa
35c10 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
35c20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  += pWInfo->nRowO
35c30 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ut;..  /* If the
35c40 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50   caller is an UP
35c50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
35c60 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
35c70 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a   requesting.  **
35c80 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61   to use a one-pa
35c90 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65  ss algorithm, de
35ca0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20  termine if this 
35cb0 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  is appropriate..
35cc0 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73    ** The one-pas
35cd0 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79  s algorithm only
35ce0 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48   works if the WH
35cf0 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
35d00 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65 20  raints.  ** the 
35d10 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64  statement to upd
35d20 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ate a single row
35d30 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
35d40 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
35d50 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
35d60 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e  IRED)==0 || pWIn
35d70 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b  fo->nLevel==1 );
35d80 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61  .  if( (wctrlFla
35d90 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
35da0 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a  SS_DESIRED)!=0 .
35db0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 61     && (pWInfo->a
35dc0 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  [0].pWLoop->wsFl
35dd0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
35de0 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57  OW)!=0 ){.    pW
35df0 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
35e00 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  = 1;.    pWInfo-
35e10 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73  >a[0].pWLoop->ws
35e20 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
35e30 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20  IDX_ONLY;.  }.. 
35e40 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62   /* Open all tab
35e50 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c  les in the pTabL
35e60 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69  ist and any indi
35e70 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72  ces selected for
35e80 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20  .  ** searching 
35e90 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20  those tables..  
35ea0 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  */.  notReady = 
35eb0 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66  ~(Bitmask)0;.  f
35ec0 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  or(ii=0, pLevel=
35ed0 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54  pWInfo->a; ii<nT
35ee0 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c  abList; ii++, pL
35ef0 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62  evel++){.    Tab
35f00 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
35f10 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   Table to open *
35f20 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20  /.    int iDb;  
35f30 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
35f40 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
35f50 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64  aining table/ind
35f60 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ex */.    struct
35f70 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
35f80 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54  TabItem;..    pT
35f90 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
35fa0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
35fb0 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d  rom];.    pTab =
35fc0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
35fd0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
35fe0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
35ff0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
36000 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  a);.    pLoop = 
36010 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
36020 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
36030 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
36040 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54  emeral)!=0 || pT
36050 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
36060 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
36070 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a  ng */.    }else.
36080 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
36090 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
360a0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
360b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
360c0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
360d0 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
360e0 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28   char *pVTab = (
360f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
36100 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62  ite3GetVTable(db
36110 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69  , pTab);.      i
36120 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  nt iCur = pTabIt
36130 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
36140 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36150 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e  dOp4(v, OP_VOpen
36160 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56  , iCur, 0, 0, pV
36170 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20  Tab, P4_VTAB);. 
36180 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56     }else if( IsV
36190 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
361a0 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f        /* noop */
361b0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
361c0 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  f.    if( (pLoop
361d0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
361e0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
361f0 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72          && (wctr
36200 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
36210 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d  MIT_OPEN_CLOSE)=
36220 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
36230 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  op = pWInfo->okO
36240 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e  nePass ? OP_Open
36250 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52  Write : OP_OpenR
36260 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ead;.      sqlit
36270 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
36280 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
36290 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62  ursor, iDb, pTab
362a0 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73  , op);.      tes
362b0 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e  tcase( !pWInfo->
362c0 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
362d0 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  b->nCol==BMS-1 )
362e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
362f0 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  ( !pWInfo->okOne
36300 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43  Pass && pTab->nC
36310 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
36320 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b   if( !pWInfo->ok
36330 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d  OnePass && pTab-
36340 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20 20  >nCol<BMS ){.   
36350 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
36360 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73   pTabItem->colUs
36370 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ed;.        int 
36380 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  n = 0;.        f
36390 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20  or(; b; b=b>>1, 
363a0 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73  n++){}.        s
363b0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
363c0 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62  P4(v, sqlite3Vdb
363d0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
363e0 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  1, .            
363f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36400 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
36410 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  R(n), P4_INT32);
36420 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
36430 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   n<=pTab->nCol )
36440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
36450 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
36460 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
36470 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
36480 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
36490 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  ame);.    }.#ifn
364a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
364b0 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
364c0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
364d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
364e0 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
364f0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63  {.      construc
36500 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
36510 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d  pParse, &pWInfo-
36520 3e 73 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20  >sWC, pTabItem, 
36530 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
36540 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
36550 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f  dif.    if( pLoo
36560 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
36570 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
36580 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d      Index *pIx =
36590 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
365a0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 4b 65  pIndex;.      Ke
365b0 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71  yInfo *pKey = sq
365c0 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
365d0 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a  o(pParse, pIx);.
365e0 20 20 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20        /* FIXME: 
365f0 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   As an optimizat
36600 69 6f 6e 20 75 73 65 20 70 54 61 62 49 74 65 6d  ion use pTabItem
36610 2d 3e 69 43 75 72 73 6f 72 20 69 66 20 57 48 45  ->iCursor if WHE
36620 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 2a 2f 0a 20  RE_IDX_ONLY */. 
36630 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43       int iIndexC
36640 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
36650 78 43 75 72 20 3d 20 69 49 64 78 43 75 72 20 3f  xCur = iIdxCur ?
36660 20 69 49 64 78 43 75 72 20 3a 20 70 50 61 72 73   iIdxCur : pPars
36670 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
36680 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53   assert( pIx->pS
36690 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
366a0 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73  hema );.      as
366b0 73 65 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e  sert( iIndexCur>
366c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
366d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
366e0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
366f0 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e  ndexCur, pIx->tn
36700 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  um, iDb,.       
36710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36720 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34   (char*)pKey, P4
36730 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
36740 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
36750 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
36760 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  Ix->zName));.   
36770 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f   }.    sqlite3Co
36780 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
36790 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
367a0 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
367b0 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
367c0 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65  MaskSet, pTabIte
367d0 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d  m->iCursor);.  }
367e0 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20  .  pWInfo->iTop 
367f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
36800 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
36810 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
36820 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
36830 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f  BeginError;..  /
36840 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
36850 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
36860 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
36870 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
36880 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
36890 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
368a0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
368b0 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
368c0 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
368d0 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
368e0 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
368f0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
36900 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a  TabList; ii++){.
36910 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
36920 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  Info->a[ii];.   
36930 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
36940 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
36950 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c  , pLevel, ii, pL
36960 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74  evel->iFrom, wct
36970 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 6e 6f  rlFlags);.    no
36980 74 52 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65  tReady = codeOne
36990 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f  LoopStart(pWInfo
369a0 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b  , ii, notReady);
369b0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  .    pWInfo->iCo
369c0 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d  ntinue = pLevel-
369d0 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a  >addrCont;.  }..
369e0 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20    /* Done. */.  
369f0 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a  return pWInfo;..
36a00 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
36a10 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  f malloc fails *
36a20 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  /.whereBeginErro
36a30 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20  r:.  if( pWInfo 
36a40 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
36a50 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
36a60 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
36a70 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e  oop;.    whereIn
36a80 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
36a90 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
36aa0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
36ab0 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  erate the end of
36ac0 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e   the WHERE loop.
36ad0 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f    See comments o
36ae0 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  n .** sqlite3Whe
36af0 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64  reBegin() for ad
36b00 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
36b10 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
36b20 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68  lite3WhereEnd(Wh
36b30 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
36b40 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
36b50 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
36b60 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  se;.  Vdbe *v = 
36b70 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
36b80 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
36b90 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
36ba0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
36bb0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
36bc0 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
36bd0 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69  pTabList;.  sqli
36be0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
36bf0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  ->db;..  /* Gene
36c00 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
36c10 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
36c20 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
36c30 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
36c40 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f  ;.  for(i=pWInfo
36c50 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30  ->nLevel-1; i>=0
36c60 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76  ; i--){.    pLev
36c70 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
36c80 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  i];.    pLoop = 
36c90 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
36ca0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
36cb0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
36cc0 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29  Level->addrCont)
36cd0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
36ce0 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ->op!=OP_Noop ){
36cf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36d00 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c 65 76  beAddOp2(v, pLev
36d10 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e  el->op, pLevel->
36d20 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b  p1, pLevel->p2);
36d30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36d40 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c  beChangeP5(v, pL
36d50 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 7d  evel->p5);.    }
36d60 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
36d70 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
36d80 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65  IN_ABLE && pLeve
36d90 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b  l->u.in.nIn>0 ){
36da0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e  .      struct In
36db0 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20  Loop *pIn;.     
36dc0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71   int j;.      sq
36dd0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
36de0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
36df0 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20  >addrNxt);.     
36e00 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75   for(j=pLevel->u
36e10 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c  .in.nIn, pIn=&pL
36e20 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
36e30 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d  op[j-1]; j>0; j-
36e40 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20  -, pIn--){.     
36e50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
36e60 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
36e70 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20  ddrInTop+1);.   
36e80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36e90 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65  AddOp2(v, pIn->e
36ea0 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e  EndLoopOp, pIn->
36eb0 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49  iCur, pIn->addrI
36ec0 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73  nTop);.        s
36ed0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
36ee0 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
36ef0 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d  nTop-1);.      }
36f00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
36f10 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d  Free(db, pLevel-
36f20 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a  >u.in.aInLoop);.
36f30 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
36f40 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
36f50 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
36f60 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
36f70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
36f80 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
36f90 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  dr;.      addr =
36fa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36fb0 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
36fc0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
36fd0 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
36fe0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
36ff0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
37000 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
37010 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    || (pLoop->wsF
37020 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
37030 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  EXED)!=0 );.    
37040 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
37050 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
37060 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
37070 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37080 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
37090 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d  llRow, pTabList-
370a0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  >a[i].iCursor);.
370b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
370c0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
370d0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
370e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
370f0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
37100 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65   OP_NullRow, pLe
37110 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
37120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
37130 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
37140 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20  Return ){.      
37150 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37160 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
37170 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
37180 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
37190 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
371a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
371b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
371c0 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61  to, 0, pLevel->a
371d0 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
371e0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
371f0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
37200 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  addr);.    }.  }
37210 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61  ..  /* The "brea
37220 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65  k" point is here
37230 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20  , just past the 
37240 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72  end of the outer
37250 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20   loop..  ** Set 
37260 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  it..  */.  sqlit
37270 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
37280 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  el(v, pWInfo->iB
37290 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  reak);..  /* Clo
372a0 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75  se all of the cu
372b0 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20  rsors that were 
372c0 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65  opened by sqlite
372d0 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a  3WhereBegin..  *
372e0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  /.  assert( pWIn
372f0 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62  fo->nLevel<=pTab
37300 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
37310 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
37320 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49  pWInfo->a; i<pWI
37330 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  nfo->nLevel; i++
37340 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
37350 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30   Index *pIdx = 0
37360 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
37370 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
37380 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
37390 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
373a0 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
373b0 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
373c0 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
373d0 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
373e0 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
373f0 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  pWLoop;.    if( 
37400 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
37410 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d  & TF_Ephemeral)=
37420 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d  =0.     && pTab-
37430 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20  >pSelect==0.    
37440 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
37450 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
37460 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
37470 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
37480 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d   int ws = pLoop-
37490 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  >wsFlags;.      
374a0 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  if( !pWInfo->okO
374b0 6e 65 50 61 73 73 20 26 26 20 28 77 73 20 26 20  nePass && (ws & 
374c0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
374d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
374e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
374f0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61  v, OP_Close, pTa
37500 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
37510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
37520 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  f( (ws & WHERE_I
37530 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 28 77  NDEXED)!=0 && (w
37540 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57  s & (WHERE_IPK|W
37550 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
37560 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
37570 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37580 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  1(v, OP_Close, p
37590 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
375a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
375b0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73      /* If this s
375c0 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65  can uses an inde
375d0 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63 6f 64  x, make VDBE cod
375e0 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
375f0 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20  to read data.   
37600 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64   ** from the ind
37610 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 66 72  ex instead of fr
37620 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77 68 65  om the table whe
37630 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e  re possible.  In
37640 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20 20 20   some cases.    
37650 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  ** this optimiza
37660 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20 74 68  tion prevents th
37670 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65 76 65  e table from eve
37680 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20 77 68  r being read, wh
37690 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79  ich can.    ** y
376a0 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69 63 61  ield a significa
376b0 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  nt performance b
376c0 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  oost..    ** .  
376d0 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68    ** Calls to th
376e0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
376f0 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69   in between sqli
37700 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e  te3WhereBegin an
37710 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  d.    ** sqlite3
37720 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61  WhereEnd will ha
37730 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20  ve created code 
37740 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20  that references 
37750 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
37760 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
37770 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20   loop scans all 
37780 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e  that code lookin
37790 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20  g for opcodes.  
377a0 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65    ** that refere
377b0 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e  nce the table an
377c0 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20  d converts them 
377d0 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61  into opcodes tha
377e0 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e  t.    ** referen
377f0 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ce the index..  
37800 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f    */.    if( pLo
37810 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
37820 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45  HERE_INDEXED|WHE
37830 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a  RE_IDX_ONLY) ){.
37840 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f        pIdx = pLo
37850 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
37860 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ex;.    }else if
37870 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
37880 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
37890 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20  R ){.      pIdx 
378a0 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76  = pLevel->u.pCov
378b0 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  idx;.    }.    i
378c0 66 28 20 70 49 64 78 20 26 26 20 21 64 62 2d 3e  f( pIdx && !db->
378d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
378e0 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20        int k, j, 
378f0 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65  last;.      Vdbe
37900 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 20 20 20 20  Op *pOp;..      
37910 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
37920 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f  eGetOp(v, pWInfo
37930 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c  ->iTop);.      l
37940 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
37950 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
37960 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49  .      for(k=pWI
37970 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73  nfo->iTop; k<las
37980 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a  t; k++, pOp++){.
37990 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
379a0 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  >p1!=pLevel->iTa
379b0 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
379c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
379d0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c  ->opcode==OP_Col
379e0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
379f0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
37a00 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
37a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
37a20 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e   pOp->p2==pIdx->
37a30 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20  aiColumn[j] ){. 
37a40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
37a50 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20  ->p2 = j;.      
37a60 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
37a70 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
37a80 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
37a90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
37aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
37ab0 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
37ac0 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
37ad0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
37ae0 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 6a 3c 70 49  ONLY)==0 || j<pI
37af0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  dx->nColumn );. 
37b00 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
37b10 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
37b20 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  _Rowid ){.      
37b30 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
37b40 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
37b50 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
37b60 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77  code = OP_IdxRow
37b70 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  id;.        }.  
37b80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
37b90 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61  .  /* Final clea
37ba0 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73  nup.  */.  pPars
37bb0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
37bc0 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
37bd0 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65  eryLoop;.  where
37be0 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
37bf0 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  nfo);.  return;.
37c00 7d 0a                                            }.