/ Hex Artifact Content
Login

Artifact 18cd15160c089dd7854febeaf5a9c065fce6a95a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 4b 2c 58  e WHERETRACE(K,X
0430: 29 20 20 69 66 28 73 71 6c 69 74 65 33 57 68 65  )  if(sqlite3Whe
0440: 72 65 54 72 61 63 65 26 28 4b 29 29 20 73 71 6c  reTrace&(K)) sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0460: 58 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  X.# define WHERE
0470: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 31 0a  TRACE_ENABLED 1.
0480: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 57  #else.# define W
0490: 48 45 52 45 54 52 41 43 45 28 4b 2c 58 29 0a 23  HERETRACE(K,X).#
04a0: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
04b0: 64 20 72 65 66 65 72 65 6e 63 65 73 0a 2a 2f 0a  d references.*/.
04c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
04d0: 68 65 72 65 43 6c 61 75 73 65 20 57 68 65 72 65  hereClause Where
04e0: 43 6c 61 75 73 65 3b 0a 74 79 70 65 64 65 66 20  Clause;.typedef 
04f0: 73 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b  struct WhereMask
0500: 53 65 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74  Set WhereMaskSet
0510: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
0520: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 57 68 65   WhereOrInfo Whe
0530: 72 65 4f 72 49 6e 66 6f 3b 0a 74 79 70 65 64 65  reOrInfo;.typede
0540: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 41 6e  f struct WhereAn
0550: 64 49 6e 66 6f 20 57 68 65 72 65 41 6e 64 49 6e  dInfo WhereAndIn
0560: 66 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  fo;.typedef stru
0570: 63 74 20 57 68 65 72 65 4c 65 76 65 6c 20 57 68  ct WhereLevel Wh
0580: 65 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65  ereLevel;.typede
0590: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f  f struct WhereLo
05a0: 6f 70 20 57 68 65 72 65 4c 6f 6f 70 3b 0a 74 79  op WhereLoop;.ty
05b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
05c0: 72 65 50 61 74 68 20 57 68 65 72 65 50 61 74 68  rePath WherePath
05d0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
05e0: 20 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65   WhereTerm Where
05f0: 54 65 72 6d 3b 0a 74 79 70 65 64 65 66 20 73 74  Term;.typedef st
0600: 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75  ruct WhereLoopBu
0610: 69 6c 64 65 72 20 57 68 65 72 65 4c 6f 6f 70 42  ilder WhereLoopB
0620: 75 69 6c 64 65 72 3b 0a 74 79 70 65 64 65 66 20  uilder;.typedef 
0630: 73 74 72 75 63 74 20 57 68 65 72 65 53 63 61 6e  struct WhereScan
0640: 20 57 68 65 72 65 53 63 61 6e 3b 0a 74 79 70 65   WhereScan;.type
0650: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0660: 4f 72 43 6f 73 74 20 57 68 65 72 65 4f 72 43 6f  OrCost WhereOrCo
0670: 73 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  st;.typedef stru
0680: 63 74 20 57 68 65 72 65 4f 72 53 65 74 20 57 68  ct WhereOrSet Wh
0690: 65 72 65 4f 72 53 65 74 3b 0a 0a 2f 2a 0a 2a 2a  ereOrSet;../*.**
06a0: 20 43 6f 73 74 20 58 20 69 73 20 74 72 61 63 6b   Cost X is track
06b0: 65 64 20 61 73 20 31 30 2a 6c 6f 67 32 28 58 29  ed as 10*log2(X)
06c0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 31 36 2d   stored in a 16-
06d0: 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20 54 68  bit integer.  Th
06e0: 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 63 6f 73  e.** maximum cos
06f0: 74 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20 74  t for ordinary t
0700: 61 62 6c 65 73 20 69 73 20 36 34 2a 28 32 2a 2a  ables is 64*(2**
0710: 36 33 29 20 77 68 69 63 68 20 62 65 63 6f 6d 65  63) which become
0720: 73 20 36 39 30 30 2e 0a 2a 2a 20 28 56 69 72 74  s 6900..** (Virt
0730: 75 61 6c 20 74 61 62 6c 65 73 20 63 61 6e 20 72  ual tables can r
0740: 65 74 75 72 6e 20 61 20 6c 61 72 67 65 72 20 63  eturn a larger c
0750: 6f 73 74 2c 20 62 75 74 20 6c 65 74 27 73 20 61  ost, but let's a
0760: 73 73 75 6d 65 20 74 68 65 79 20 64 6f 20 6e 6f  ssume they do no
0770: 74 2e 29 0a 2a 2a 20 53 6f 20 61 6c 6c 20 63 6f  t.).** So all co
0780: 73 74 73 20 63 61 6e 20 62 65 20 73 74 6f 72 65  sts can be store
0790: 64 20 69 6e 20 61 20 31 36 2d 62 69 74 20 75 6e  d in a 16-bit un
07a0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 77  signed integer w
07b0: 69 74 68 6f 75 74 20 72 69 73 6b 0a 2a 2a 20 6f  ithout risk.** o
07c0: 66 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2a 0a 2a  f overflow..**.*
07d0: 2a 20 43 6f 73 74 73 20 61 72 65 20 65 73 74 69  * Costs are esti
07e0: 6d 61 74 65 73 2c 20 73 6f 20 6e 6f 20 65 66 66  mates, so no eff
07f0: 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  ort is made to c
0800: 6f 6d 70 75 74 65 20 31 30 2a 6c 6f 67 32 28 58  ompute 10*log2(X
0810: 29 20 65 78 61 63 74 6c 79 2e 0a 2a 2a 20 49 6e  ) exactly..** In
0820: 73 74 65 61 64 2c 20 61 20 63 6c 6f 73 65 20 65  stead, a close e
0830: 73 74 69 6d 61 74 65 20 69 73 20 75 73 65 64 2e  stimate is used.
0840: 20 20 41 6e 79 20 76 61 6c 75 65 20 6f 66 20 58    Any value of X
0850: 3c 3d 31 20 69 73 20 73 74 6f 72 65 64 20 61 73  <=1 is stored as
0860: 20 30 2e 0a 2a 2a 20 58 3d 32 20 69 73 20 31 30   0..** X=2 is 10
0870: 2e 20 20 58 3d 33 20 69 73 20 31 36 2e 20 20 58  .  X=3 is 16.  X
0880: 3d 31 30 30 30 20 69 73 20 39 39 2e 20 65 74 63  =1000 is 99. etc
0890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 6f 6f 6c  ..**.** The tool
08a0: 2f 77 68 65 72 65 63 6f 73 74 74 65 73 74 2e 63  /wherecosttest.c
08b0: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 69 6d 70   source file imp
08c0: 6c 65 6d 65 6e 74 73 20 61 20 63 6f 6d 6d 61 6e  lements a comman
08d0: 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d 0a 2a  d-line program.*
08e0: 2a 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 76  * that will conv
08f0: 65 72 74 20 57 68 65 72 65 43 6f 73 74 73 20 74  ert WhereCosts t
0900: 6f 20 69 6e 74 65 67 65 72 73 2c 20 63 6f 6e 76  o integers, conv
0910: 65 72 74 20 69 6e 74 65 67 65 72 73 20 74 6f 20  ert integers to 
0920: 57 68 65 72 65 43 6f 73 74 73 0a 2a 2a 20 61 6e  WhereCosts.** an
0930: 64 20 64 6f 20 61 64 64 69 74 69 6f 6e 20 61 6e  d do addition an
0940: 64 20 6d 75 6c 74 69 70 6c 69 63 61 74 69 6f 6e  d multiplication
0950: 20 6f 6e 20 57 68 65 72 65 43 6f 73 74 20 76 61   on WhereCost va
0960: 6c 75 65 73 2e 20 20 54 68 65 20 77 68 65 72 65  lues.  The where
0970: 63 6f 73 74 74 65 73 74 0a 2a 2a 20 63 6f 6d 6d  costtest.** comm
0980: 61 6e 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d  and-line program
0990: 20 69 73 20 61 20 75 73 65 66 75 6c 20 75 74 69   is a useful uti
09a0: 6c 69 74 79 20 74 6f 20 68 61 76 65 20 61 72 6f  lity to have aro
09b0: 75 6e 64 20 77 68 65 6e 20 77 6f 72 6b 69 6e 67  und when working
09c0: 20 77 69 74 68 0a 2a 2a 20 74 68 69 73 20 6d 6f   with.** this mo
09d0: 64 75 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  dule..*/.typedef
09e0: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
09f0: 69 6e 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a  int WhereCost;..
0a00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63  /*.** This objec
0a10: 74 20 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72  t contains infor
0a20: 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
0a30: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 73 69 6e   implement a sin
0a40: 67 6c 65 20 6e 65 73 74 65 64 0a 2a 2a 20 6c 6f  gle nested.** lo
0a50: 6f 70 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75  op in WHERE clau
0a60: 73 65 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 74 72 61  se..**.** Contra
0a70: 73 74 20 74 68 69 73 20 6f 62 6a 65 63 74 20 77  st this object w
0a80: 69 74 68 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20  ith WhereLoop.  
0a90: 54 68 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63  This object desc
0aa0: 72 69 62 65 73 20 74 68 65 0a 2a 2a 20 69 6d 70  ribes the.** imp
0ab0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ac0: 68 65 20 6c 6f 6f 70 2e 20 20 57 68 65 72 65 4c  he loop.  WhereL
0ad0: 6f 6f 70 20 64 65 73 63 72 69 62 65 73 20 74 68  oop describes th
0ae0: 65 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 20  e algorithm..** 
0af0: 54 68 69 73 20 6f 62 6a 65 63 74 20 63 6f 6e 74  This object cont
0b00: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
0b10: 6f 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  o the WhereLoop 
0b20: 61 6c 67 6f 72 69 74 68 6d 20 61 73 20 6f 6e 65  algorithm as one
0b30: 20 6f 66 0a 2a 2a 20 69 74 73 20 65 6c 65 6d 65   of.** its eleme
0b40: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 57  nts..**.** The W
0b50: 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  hereInfo object 
0b60: 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c  contains a singl
0b70: 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
0b80: 69 73 20 6f 62 6a 65 63 74 20 66 6f 72 0a 2a 2a  is object for.**
0b90: 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68   each term in th
0ba0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 28 77  e FROM clause (w
0bb0: 68 69 63 68 20 69 73 20 74 6f 20 73 61 79 2c 20  hich is to say, 
0bc0: 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a  for each of the.
0bd0: 2a 2a 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  ** nested loops 
0be0: 61 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29 2e  as implemented).
0bf0: 20 20 54 68 65 20 6f 72 64 65 72 20 6f 66 20 57    The order of W
0c00: 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74  hereLevel object
0c10: 73 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20  s determines.** 
0c20: 74 68 65 20 6c 6f 6f 70 20 6e 65 73 74 65 64 20  the loop nested 
0c30: 6f 72 64 65 72 2c 20 77 69 74 68 20 57 68 65 72  order, with Wher
0c40: 65 49 6e 66 6f 2e 61 5b 30 5d 20 62 65 69 6e 67  eInfo.a[0] being
0c50: 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20   the outer loop 
0c60: 61 6e 64 0a 2a 2a 20 57 68 65 72 65 49 6e 66 6f  and.** WhereInfo
0c70: 2e 61 5b 57 68 65 72 65 49 6e 66 6f 2e 6e 4c 65  .a[WhereInfo.nLe
0c80: 76 65 6c 2d 31 5d 20 62 65 69 6e 67 20 74 68 65  vel-1] being the
0c90: 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 0a 2a 2f 0a   inner loop..*/.
0ca0: 73 74 72 75 63 74 20 57 68 65 72 65 4c 65 76 65  struct WhereLeve
0cb0: 6c 20 7b 0a 20 20 69 6e 74 20 69 4c 65 66 74 4a  l {.  int iLeftJ
0cc0: 6f 69 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  oin;        /* M
0cd0: 65 6d 6f 72 79 20 63 65 6c 6c 20 75 73 65 64 20  emory cell used 
0ce0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 45 46  to implement LEF
0cf0: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 2a 2f 0a  T OUTER JOIN */.
0d00: 20 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20    int iTabCur;  
0d10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
0d20: 44 42 45 20 63 75 72 73 6f 72 20 75 73 65 64 20  DBE cursor used 
0d30: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 74 61  to access the ta
0d40: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ble */.  int iId
0d50: 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f  xCur;          /
0d60: 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
0d70: 72 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  r used to access
0d80: 20 70 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 61   pIdx */.  int a
0d90: 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
0da0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
0db0: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
0dc0: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
0dd0: 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20  addrNxt;        
0de0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
0df0: 6f 20 73 74 61 72 74 20 74 68 65 20 6e 65 78 74  o start the next
0e00: 20 49 4e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20   IN combination 
0e10: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
0e20: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t;         /* Ju
0e30: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
0e40: 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
0e50: 74 20 6c 6f 6f 70 20 63 79 63 6c 65 20 2a 2f 0a  t loop cycle */.
0e60: 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b    int addrFirst;
0e70: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
0e80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20   instruction of 
0e90: 69 6e 74 65 72 69 6f 72 20 6f 66 20 74 68 65 20  interior of the 
0ea0: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
0eb0: 64 72 42 6f 64 79 3b 20 20 20 20 20 20 20 20 20  drBody;         
0ec0: 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20  /* Beginning of 
0ed0: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 69 73  the body of this
0ee0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 38 20 69 46   loop */.  u8 iF
0ef0: 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  rom;            
0f00: 20 2f 2a 20 57 68 69 63 68 20 65 6e 74 72 79 20   /* Which entry 
0f10: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
0f20: 73 65 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 70  se */.  u8 op, p
0f30: 35 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  5;            /*
0f40: 20 4f 70 63 6f 64 65 20 61 6e 64 20 50 35 20 6f   Opcode and P5 o
0f50: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 74 68 61  f the opcode tha
0f60: 74 20 65 6e 64 73 20 74 68 65 20 6c 6f 6f 70 20  t ends the loop 
0f70: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 70 32 3b  */.  int p1, p2;
0f80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
0f90: 65 72 61 6e 64 73 20 6f 66 20 74 68 65 20 6f 70  erands of the op
0fa0: 63 6f 64 65 20 75 73 65 64 20 74 6f 20 65 6e 64  code used to end
0fb0: 73 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  s the loop */.  
0fc0: 75 6e 69 6f 6e 20 7b 20 20 20 20 20 20 20 20 20  union {         
0fd0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
0fe0: 74 69 6f 6e 20 74 68 61 74 20 64 65 70 65 6e 64  tion that depend
0ff0: 73 20 6f 6e 20 70 57 4c 6f 6f 70 2d 3e 77 73 46  s on pWLoop->wsF
1000: 6c 61 67 73 20 2a 2f 0a 20 20 20 20 73 74 72 75  lags */.    stru
1010: 63 74 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ct {.      int n
1020: 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  In;             
1030: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
1040: 74 72 69 65 73 20 69 6e 20 61 49 6e 4c 6f 6f 70  tries in aInLoop
1050: 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  [] */.      stru
1060: 63 74 20 49 6e 4c 6f 6f 70 20 7b 0a 20 20 20 20  ct InLoop {.    
1070: 20 20 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20      int iCur;   
1080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1090: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 75 73  e VDBE cursor us
10a0: 65 64 20 62 79 20 74 68 69 73 20 49 4e 20 6f 70  ed by this IN op
10b0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
10c0: 20 20 69 6e 74 20 61 64 64 72 49 6e 54 6f 70 3b    int addrInTop;
10d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
10e0: 6f 66 20 74 68 65 20 49 4e 20 6c 6f 6f 70 20 2a  of the IN loop *
10f0: 2f 0a 20 20 20 20 20 20 20 20 75 38 20 65 45 6e  /.        u8 eEn
1100: 64 4c 6f 6f 70 4f 70 3b 20 20 20 20 20 20 20 20  dLoopOp;        
1110: 20 2f 2a 20 49 4e 20 4c 6f 6f 70 20 74 65 72 6d   /* IN Loop term
1120: 69 6e 61 74 6f 72 2e 20 4f 50 5f 4e 65 78 74 20  inator. OP_Next 
1130: 6f 72 20 4f 50 5f 50 72 65 76 20 2a 2f 0a 20 20  or OP_Prev */.  
1140: 20 20 20 20 7d 20 2a 61 49 6e 4c 6f 6f 70 3b 20      } *aInLoop; 
1150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
1160: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65  ormation about e
1170: 61 63 68 20 6e 65 73 74 65 64 20 49 4e 20 6f 70  ach nested IN op
1180: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 20  erator */.    } 
1190: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
11a0: 20 20 20 20 2f 2a 20 55 73 65 64 20 77 68 65 6e      /* Used when
11b0: 20 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   pWLoop->wsFlags
11c0: 26 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 2a  &WHERE_IN_ABLE *
11d0: 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f  /.    Index *pCo
11e0: 76 69 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 50  vidx;       /* P
11f0: 6f 73 73 69 62 6c 65 20 63 6f 76 65 72 69 6e 67  ossible covering
1200: 20 69 6e 64 65 78 20 66 6f 72 20 57 48 45 52 45   index for WHERE
1210: 5f 4d 55 4c 54 49 5f 4f 52 20 2a 2f 0a 20 20 7d  _MULTI_OR */.  }
1220: 20 75 3b 0a 20 20 73 74 72 75 63 74 20 57 68 65   u;.  struct Whe
1230: 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20  reLoop *pWLoop; 
1240: 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 65 64   /* The selected
1250: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1260: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45  t */.};../*.** E
1270: 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
1280: 74 68 69 73 20 6f 62 6a 65 63 74 20 72 65 70 72  this object repr
1290: 65 73 65 6e 74 73 20 61 6e 20 61 6c 67 6f 72 69  esents an algori
12a0: 74 68 6d 20 66 6f 72 20 65 76 61 6c 75 61 74 69  thm for evaluati
12b0: 6e 67 20 6f 6e 65 0a 2a 2a 20 74 65 72 6d 20 6f  ng one.** term o
12c0: 66 20 61 20 6a 6f 69 6e 2e 20 20 45 76 65 72 79  f a join.  Every
12d0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
12e0: 4d 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 68 61  M clause will ha
12f0: 76 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f  ve at least.** o
1300: 6e 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ne corresponding
1310: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1320: 74 20 28 75 6e 6c 65 73 73 20 49 4e 44 45 58 45  t (unless INDEXE
1330: 44 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 73  D BY constraints
1340: 0a 2a 2a 20 70 72 65 76 65 6e 74 20 61 20 71 75  .** prevent a qu
1350: 65 72 79 20 73 6f 6c 75 74 69 6f 6e 20 2d 20 77  ery solution - w
1360: 68 69 63 68 20 69 73 20 61 6e 20 65 72 72 6f 72  hich is an error
1370: 29 20 61 6e 64 20 6d 61 6e 79 20 74 65 72 6d 73  ) and many terms
1380: 20 6f 66 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   of the.** FROM 
1390: 63 6c 61 75 73 65 20 77 69 6c 6c 20 68 61 76 65  clause will have
13a0: 20 6d 75 6c 74 69 70 6c 65 20 57 68 65 72 65 4c   multiple WhereL
13b0: 6f 6f 70 20 6f 62 6a 65 63 74 73 2c 20 65 61 63  oop objects, eac
13c0: 68 20 64 65 73 63 72 69 62 69 6e 67 20 61 0a 2a  h describing a.*
13d0: 2a 20 70 6f 74 65 6e 74 69 61 6c 20 77 61 79 20  * potential way 
13e0: 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
13f0: 74 68 61 74 20 46 52 4f 4d 2d 63 6c 61 75 73 65  that FROM-clause
1400: 20 74 65 72 6d 2c 20 74 6f 67 65 74 68 65 72 20   term, together 
1410: 77 69 74 68 0a 2a 2a 20 64 65 70 65 6e 64 65 6e  with.** dependen
1420: 63 69 65 73 20 61 6e 64 20 63 6f 73 74 20 65 73  cies and cost es
1430: 74 69 6d 61 74 65 73 20 66 6f 72 20 75 73 69 6e  timates for usin
1440: 67 20 74 68 65 20 63 68 6f 73 65 6e 20 61 6c 67  g the chosen alg
1450: 6f 72 69 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20 51 75  orithm..**.** Qu
1460: 65 72 79 20 70 6c 61 6e 6e 69 6e 67 20 63 6f 6e  ery planning con
1470: 73 69 73 74 73 20 6f 66 20 62 75 69 6c 64 69 6e  sists of buildin
1480: 67 20 75 70 20 61 20 63 6f 6c 6c 65 63 74 69 6f  g up a collectio
1490: 6e 20 6f 66 20 74 68 65 73 65 20 57 68 65 72 65  n of these Where
14a0: 4c 6f 6f 70 0a 2a 2a 20 6f 62 6a 65 63 74 73 2c  Loop.** objects,
14b0: 20 74 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20   then computing 
14c0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 73 65 71  a particular seq
14d0: 75 65 6e 63 65 20 6f 66 20 57 68 65 72 65 4c 6f  uence of WhereLo
14e0: 6f 70 20 6f 62 6a 65 63 74 73 2c 20 77 69 74 68  op objects, with
14f0: 0a 2a 2a 20 6f 6e 65 20 57 68 65 72 65 4c 6f 6f  .** one WhereLoo
1500: 70 20 6f 62 6a 65 63 74 20 70 65 72 20 46 52 4f  p object per FRO
1510: 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2c 20 74  M clause term, t
1520: 68 61 74 20 73 61 74 69 73 66 79 20 61 6c 6c 20  hat satisfy all 
1530: 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 2a 2a 20  dependencies.** 
1540: 61 6e 64 20 74 68 61 74 20 6d 69 6e 69 6d 69 7a  and that minimiz
1550: 65 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 63 6f  e the overall co
1560: 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  st..*/.struct Wh
1570: 65 72 65 4c 6f 6f 70 20 7b 0a 20 20 42 69 74 6d  ereLoop {.  Bitm
1580: 61 73 6b 20 70 72 65 72 65 71 3b 20 20 20 20 20  ask prereq;     
1590: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
15a0: 6f 74 68 65 72 20 6c 6f 6f 70 73 20 74 68 61 74  other loops that
15b0: 20 6d 75 73 74 20 72 75 6e 20 66 69 72 73 74 20   must run first 
15c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  */.  Bitmask mas
15d0: 6b 53 65 6c 66 3b 20 20 20 20 20 2f 2a 20 42 69  kSelf;     /* Bi
15e0: 74 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e  tmask identifyin
15f0: 67 20 74 61 62 6c 65 20 69 54 61 62 20 2a 2f 0a  g table iTab */.
1600: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1610: 42 55 47 0a 20 20 63 68 61 72 20 63 49 64 3b 20  BUG.  char cId; 
1620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1630: 79 6d 62 6f 6c 69 63 20 49 44 20 6f 66 20 74 68  ymbolic ID of th
1640: 69 73 20 6c 6f 6f 70 20 66 6f 72 20 64 65 62 75  is loop for debu
1650: 67 67 69 6e 67 20 75 73 65 20 2a 2f 0a 23 65 6e  gging use */.#en
1660: 64 69 66 0a 20 20 75 38 20 69 54 61 62 3b 20 20  dif.  u8 iTab;  
1670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1680: 6f 73 69 74 69 6f 6e 20 69 6e 20 46 52 4f 4d 20  osition in FROM 
1690: 63 6c 61 75 73 65 20 6f 66 20 74 61 62 6c 65 20  clause of table 
16a0: 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  for this loop */
16b0: 0a 20 20 75 38 20 69 53 6f 72 74 49 64 78 3b 20  .  u8 iSortIdx; 
16c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74           /* Sort
16d0: 69 6e 67 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ing index number
16e0: 2e 20 20 30 3d 3d 4e 6f 6e 65 20 2a 2f 0a 20 20  .  0==None */.  
16f0: 57 68 65 72 65 43 6f 73 74 20 72 53 65 74 75 70  WhereCost rSetup
1700: 3b 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d  ;     /* One-tim
1710: 65 20 73 65 74 75 70 20 63 6f 73 74 20 28 65 78  e setup cost (ex
1720: 3a 20 63 72 65 61 74 65 20 74 72 61 6e 73 69 65  : create transie
1730: 6e 74 20 69 6e 64 65 78 29 20 2a 2f 0a 20 20 57  nt index) */.  W
1740: 68 65 72 65 43 6f 73 74 20 72 52 75 6e 3b 20 20  hereCost rRun;  
1750: 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
1760: 72 75 6e 6e 69 6e 67 20 65 61 63 68 20 6c 6f 6f  running each loo
1770: 70 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  p */.  WhereCost
1780: 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20   nOut;       /* 
1790: 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  Estimated number
17a0: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
17b0: 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  */.  union {.   
17c0: 20 73 74 72 75 63 74 20 7b 20 20 20 20 20 20 20   struct {       
17d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
17e0: 6d 61 74 69 6f 6e 20 66 6f 72 20 69 6e 74 65 72  mation for inter
17f0: 6e 61 6c 20 62 74 72 65 65 20 74 61 62 6c 65 73  nal btree tables
1800: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   */.      int nE
1810: 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
1820: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 71   /* Number of eq
1830: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1840: 74 73 20 2a 2f 0a 20 20 20 20 20 20 49 6e 64 65  ts */.      Inde
1850: 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
1860: 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64     /* Index used
1870: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20  , or NULL */.   
1880: 20 7d 20 62 74 72 65 65 3b 0a 20 20 20 20 73 74   } btree;.    st
1890: 72 75 63 74 20 7b 20 20 20 20 20 20 20 20 20 20  ruct {          
18a0: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
18b0: 69 6f 6e 20 66 6f 72 20 76 69 72 74 75 61 6c 20  ion for virtual 
18c0: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
18d0: 69 6e 74 20 69 64 78 4e 75 6d 3b 20 20 20 20 20  int idxNum;     
18e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
18f0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20  number */.      
1900: 75 38 20 6e 65 65 64 46 72 65 65 3b 20 20 20 20  u8 needFree;    
1910: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1920: 66 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 69  f sqlite3_free(i
1930: 64 78 53 74 72 29 20 69 73 20 6e 65 65 64 65 64  dxStr) is needed
1940: 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 69 73 4f   */.      u8 isO
1950: 72 64 65 72 65 64 3b 20 20 20 20 20 20 20 20 20  rdered;         
1960: 20 2f 2a 20 54 72 75 65 20 69 66 20 73 61 74 69   /* True if sati
1970: 73 66 69 65 73 20 4f 52 44 45 52 20 42 59 20 2a  sfies ORDER BY *
1980: 2f 0a 20 20 20 20 20 20 75 31 36 20 6f 6d 69 74  /.      u16 omit
1990: 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  Mask;          /
19a0: 2a 20 54 65 72 6d 73 20 74 68 61 74 20 6d 61 79  * Terms that may
19b0: 20 62 65 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   be omitted */. 
19c0: 20 20 20 20 20 63 68 61 72 20 2a 69 64 78 53 74       char *idxSt
19d0: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  r;          /* I
19e0: 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65 72 20  ndex identifier 
19f0: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 20  string */.    } 
1a00: 76 74 61 62 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  vtab;.  } u;.  u
1a10: 33 32 20 77 73 46 6c 61 67 73 3b 20 20 20 20 20  32 wsFlags;     
1a20: 20 20 20 20 20 2f 2a 20 57 48 45 52 45 5f 2a 20       /* WHERE_* 
1a30: 66 6c 61 67 73 20 64 65 73 63 72 69 62 69 6e 67  flags describing
1a40: 20 74 68 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75   the plan */.  u
1a50: 31 36 20 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20  16 nLTerm;      
1a60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a70: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 4c 54  f entries in aLT
1a80: 65 72 6d 5b 5d 20 2a 2f 0a 20 20 2f 2a 2a 2a 2a  erm[] */.  /****
1a90: 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 29   whereLoopXfer()
1aa0: 20 63 6f 70 69 65 73 20 66 69 65 6c 64 73 20 61   copies fields a
1ab0: 62 6f 76 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  bove ***********
1ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 20  ************/.# 
1ad0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4c 4f 4f  define WHERE_LOO
1ae0: 50 5f 58 46 45 52 5f 53 5a 20 6f 66 66 73 65 74  P_XFER_SZ offset
1af0: 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2c 6e 4c 53  of(WhereLoop,nLS
1b00: 6c 6f 74 29 0a 20 20 75 31 36 20 6e 4c 53 6c 6f  lot).  u16 nLSlo
1b10: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
1b20: 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20  Number of slots 
1b30: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4c  allocated for aL
1b40: 54 65 72 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  Term[] */.  Wher
1b50: 65 54 65 72 6d 20 2a 2a 61 4c 54 65 72 6d 3b 20  eTerm **aLTerm; 
1b60: 20 20 2f 2a 20 57 68 65 72 65 54 65 72 6d 73 20    /* WhereTerms 
1b70: 75 73 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  used */.  WhereL
1b80: 6f 6f 70 20 2a 70 4e 65 78 74 4c 6f 6f 70 3b 20  oop *pNextLoop; 
1b90: 2f 2a 20 4e 65 78 74 20 57 68 65 72 65 4c 6f 6f  /* Next WhereLoo
1ba0: 70 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  p object in the 
1bb0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 2f 0a 20  WhereClause */. 
1bc0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 4c 54 65   WhereTerm *aLTe
1bd0: 72 6d 53 70 61 63 65 5b 34 5d 3b 20 20 2f 2a 20  rmSpace[4];  /* 
1be0: 49 6e 69 74 69 61 6c 20 61 4c 54 65 72 6d 5b 5d  Initial aLTerm[]
1bf0: 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   space */.};../*
1c00: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c   This object hol
1c10: 64 73 20 74 68 65 20 70 72 65 72 65 71 75 69 73  ds the prerequis
1c20: 69 74 65 73 20 61 6e 64 20 74 68 65 20 63 6f 73  ites and the cos
1c30: 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 61 0a 2a  t of running a.*
1c40: 2a 20 73 75 62 71 75 65 72 79 20 6f 6e 20 6f 6e  * subquery on on
1c50: 65 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20  e operand of an 
1c60: 4f 52 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 74  OR operator in t
1c70: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
1c80: 0a 2a 2a 20 53 65 65 20 57 68 65 72 65 4f 72 53  .** See WhereOrS
1c90: 65 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  et for additiona
1ca0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 2a  l information .*
1cb0: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f 72  /.struct WhereOr
1cc0: 43 6f 73 74 20 7b 0a 20 20 42 69 74 6d 61 73 6b  Cost {.  Bitmask
1cd0: 20 70 72 65 72 65 71 3b 20 20 20 20 20 2f 2a 20   prereq;     /* 
1ce0: 50 72 65 72 65 71 75 69 73 69 74 65 73 20 2a 2f  Prerequisites */
1cf0: 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 52 75  .  WhereCost rRu
1d00: 6e 3b 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f  n;     /* Cost o
1d10: 66 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 73  f running this s
1d20: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 57 68 65  ubquery */.  Whe
1d30: 72 65 43 6f 73 74 20 6e 4f 75 74 3b 20 20 20 20  reCost nOut;    
1d40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
1d50: 74 70 75 74 73 20 66 6f 72 20 74 68 69 73 20 73  tputs for this s
1d60: 75 62 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 2f  ubquery */.};../
1d70: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
1d80: 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20 61 20   object holds a 
1d90: 73 65 74 20 6f 66 20 70 6f 73 73 69 62 6c 65 20  set of possible 
1da0: 57 68 65 72 65 4f 72 43 6f 73 74 73 20 74 68 61  WhereOrCosts tha
1db0: 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20  t.** correspond 
1dc0: 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 28  to the subquery(
1dd0: 73 29 20 6f 66 20 4f 52 2d 63 6c 61 75 73 65 20  s) of OR-clause 
1de0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 4f 6e 6c  processing.  Onl
1df0: 79 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 4e 5f  y the.** best N_
1e00: 4f 52 5f 43 4f 53 54 20 65 6c 65 6d 65 6e 74 73  OR_COST elements
1e10: 20 61 72 65 20 72 65 74 61 69 6e 65 64 2e 0a 2a   are retained..*
1e20: 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 4f 52 5f 43  /.#define N_OR_C
1e30: 4f 53 54 20 33 0a 73 74 72 75 63 74 20 57 68 65  OST 3.struct Whe
1e40: 72 65 4f 72 53 65 74 20 7b 0a 20 20 75 31 36 20  reOrSet {.  u16 
1e50: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1e60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e70: 72 20 6f 66 20 76 61 6c 69 64 20 61 5b 5d 20 65  r of valid a[] e
1e80: 6e 74 72 69 65 73 20 2a 2f 0a 20 20 57 68 65 72  ntries */.  Wher
1e90: 65 4f 72 43 6f 73 74 20 61 5b 4e 5f 4f 52 5f 43  eOrCost a[N_OR_C
1ea0: 4f 53 54 5d 3b 20 20 20 2f 2a 20 53 65 74 20 6f  OST];   /* Set o
1eb0: 66 20 62 65 73 74 20 63 6f 73 74 73 20 2a 2f 0a  f best costs */.
1ec0: 7d 3b 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  };.../* Forward 
1ed0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6d  declaration of m
1ee0: 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
1ef0: 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
1f00: 73 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c 20 57  size(sqlite3*, W
1f10: 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74 29 3b  hereLoop*, int);
1f20: 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73  ../*.** Each ins
1f30: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
1f40: 6a 65 63 74 20 68 6f 6c 64 73 20 61 20 73 65 71  ject holds a seq
1f50: 75 65 6e 63 65 20 6f 66 20 57 68 65 72 65 4c 6f  uence of WhereLo
1f60: 6f 70 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 74 68  op objects.** th
1f70: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 73 6f 6d  at implement som
1f80: 65 20 6f 72 20 61 6c 6c 20 6f 66 20 61 20 71 75  e or all of a qu
1f90: 65 72 79 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20  ery plan..**.** 
1fa0: 54 68 69 6e 6b 20 6f 66 20 65 61 63 68 20 57 68  Think of each Wh
1fb0: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 61  ereLoop object a
1fc0: 73 20 61 20 6e 6f 64 65 20 69 6e 20 61 20 67 72  s a node in a gr
1fd0: 61 70 68 20 77 69 74 68 20 61 72 63 73 0a 2a 2a  aph with arcs.**
1fe0: 20 73 68 6f 77 69 6e 67 20 64 65 70 65 6e 64 65   showing depende
1ff0: 6e 63 65 73 20 61 6e 64 20 63 6f 73 74 73 20 66  nces and costs f
2000: 6f 72 20 74 72 61 76 65 6c 6c 69 6e 67 20 62 65  or travelling be
2010: 74 77 65 65 6e 20 6e 6f 64 65 73 2e 20 20 28 54  tween nodes.  (T
2020: 68 61 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 20  hat is.** not a 
2030: 63 6f 6d 70 6c 65 74 65 6c 79 20 61 63 63 75 72  completely accur
2040: 61 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ate description 
2050: 62 65 63 61 75 73 65 20 57 68 65 72 65 4c 6f 6f  because WhereLoo
2060: 70 20 63 6f 73 74 73 20 61 72 65 20 61 0a 2a 2a  p costs are a.**
2070: 20 76 65 63 74 6f 72 2c 20 6e 6f 74 20 61 20 73   vector, not a s
2080: 63 61 6c 61 72 2c 20 61 6e 64 20 62 65 63 61 75  calar, and becau
2090: 73 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20 61  se dependences a
20a0: 72 65 20 6d 61 6e 79 2d 74 6f 2d 6f 6e 65 2c 20  re many-to-one, 
20b0: 6e 6f 74 0a 2a 2a 20 6f 6e 65 2d 74 6f 2d 6f 6e  not.** one-to-on
20c0: 65 20 61 73 20 61 72 65 20 67 72 61 70 68 20 6e  e as are graph n
20d0: 6f 64 65 73 2e 20 20 42 75 74 20 69 74 20 69 73  odes.  But it is
20e0: 20 61 20 75 73 65 66 75 6c 20 76 69 73 75 61 6c   a useful visual
20f0: 69 7a 61 74 69 6f 6e 20 61 69 64 2e 29 0a 2a 2a  ization aid.).**
2100: 20 54 68 65 6e 20 61 20 57 68 65 72 65 50 61 74   Then a WherePat
2110: 68 20 6f 62 6a 65 63 74 20 69 73 20 61 20 70 61  h object is a pa
2120: 74 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 67  th through the g
2130: 72 61 70 68 20 74 68 61 74 20 76 69 73 69 74 73  raph that visits
2140: 20 73 6f 6d 65 0a 2a 2a 20 6f 72 20 61 6c 6c 20   some.** or all 
2150: 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
2160: 20 6f 62 6a 65 63 74 73 20 6f 6e 63 65 2e 0a 2a   objects once..*
2170: 2a 0a 2a 2a 20 54 68 65 20 22 73 6f 6c 76 65 72  *.** The "solver
2180: 22 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  " works by creat
2190: 69 6e 67 20 74 68 65 20 4e 20 62 65 73 74 20 57  ing the N best W
21a0: 68 65 72 65 50 61 74 68 20 6f 62 6a 65 63 74 73  herePath objects
21b0: 20 6f 66 20 6c 65 6e 67 74 68 0a 2a 2a 20 31 2e   of length.** 1.
21c0: 20 20 54 68 65 6e 20 75 73 69 6e 67 20 74 68 6f    Then using tho
21d0: 73 65 20 61 73 20 61 20 62 61 73 69 73 20 74 6f  se as a basis to
21e0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 4e 20 62   compute the N b
21f0: 65 73 74 20 57 68 65 72 65 50 61 74 68 20 6f 62  est WherePath ob
2200: 6a 65 63 74 73 0a 2a 2a 20 6f 66 20 6c 65 6e 67  jects.** of leng
2210: 74 68 20 32 2e 20 20 41 6e 64 20 73 6f 20 66 6f  th 2.  And so fo
2220: 72 74 68 20 75 6e 74 69 6c 20 74 68 65 20 6c 65  rth until the le
2230: 6e 67 74 68 20 6f 66 20 57 68 65 72 65 50 61 74  ngth of WherePat
2240: 68 73 20 65 71 75 61 6c 73 20 74 68 65 0a 2a 2a  hs equals the.**
2250: 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 64 65 73   number of nodes
2260: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2270: 75 73 65 2e 20 20 54 68 65 20 62 65 73 74 20 28  use.  The best (
2280: 6c 6f 77 65 73 74 20 63 6f 73 74 29 20 57 68 65  lowest cost) Whe
2290: 72 65 50 61 74 68 0a 2a 2a 20 61 74 20 74 68 65  rePath.** at the
22a0: 20 65 6e 64 20 69 73 20 74 68 65 20 63 68 6f 6f   end is the choo
22b0: 73 65 6e 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  sen query plan..
22c0: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 50  */.struct WhereP
22d0: 61 74 68 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20  ath {.  Bitmask 
22e0: 6d 61 73 6b 4c 6f 6f 70 3b 20 20 20 20 20 2f 2a  maskLoop;     /*
22f0: 20 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20   Bitmask of all 
2300: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2310: 73 20 69 6e 20 74 68 69 73 20 70 61 74 68 20 2a  s in this path *
2320: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4c  /.  Bitmask revL
2330: 6f 6f 70 3b 20 20 20 20 20 20 2f 2a 20 61 4c 6f  oop;      /* aLo
2340: 6f 70 5b 5d 73 20 74 68 61 74 20 73 68 6f 75 6c  op[]s that shoul
2350: 64 20 62 65 20 72 65 76 65 72 73 65 64 20 66 6f  d be reversed fo
2360: 72 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  r ORDER BY */.  
2370: 57 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 3b 20  WhereCost nRow; 
2380: 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74        /* Estimat
2390: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
23a0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
23b0: 68 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 57 68  his path */.  Wh
23c0: 65 72 65 43 6f 73 74 20 72 43 6f 73 74 3b 20 20  ereCost rCost;  
23d0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 6f 73      /* Total cos
23e0: 74 20 6f 66 20 74 68 69 73 20 70 61 74 68 20 2a  t of this path *
23f0: 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 65 64  /.  u8 isOrdered
2400: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
2410: 65 20 69 66 20 74 68 69 73 20 70 61 74 68 20 73  e if this path s
2420: 61 74 69 73 66 69 65 73 20 4f 52 44 45 52 20 42  atisfies ORDER B
2430: 59 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65  Y */.  u8 isOrde
2440: 72 65 64 56 61 6c 69 64 3b 20 20 20 20 2f 2a 20  redValid;    /* 
2450: 54 72 75 65 20 69 66 20 74 68 65 20 69 73 4f 72  True if the isOr
2460: 64 65 72 65 64 20 66 69 65 6c 64 20 69 73 20 76  dered field is v
2470: 61 6c 69 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  alid */.  WhereL
2480: 6f 6f 70 20 2a 2a 61 4c 6f 6f 70 3b 20 20 20 20  oop **aLoop;    
2490: 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 68 65 72  /* Array of Wher
24a0: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 6d  eLoop objects im
24b0: 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
24c0: 70 61 74 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  path */.};../*.*
24d0: 2a 20 54 68 65 20 71 75 65 72 79 20 67 65 6e 65  * The query gene
24e0: 72 61 74 6f 72 20 75 73 65 73 20 61 6e 20 61 72  rator uses an ar
24f0: 72 61 79 20 6f 66 20 69 6e 73 74 61 6e 63 65 73  ray of instances
2500: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
2510: 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69 74  re to.** help it
2520: 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 73 75 62   analyze the sub
2530: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
2540: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
2550: 20 20 45 61 63 68 20 57 48 45 52 45 0a 2a 2a 20    Each WHERE.** 
2560: 63 6c 61 75 73 65 20 73 75 62 65 78 70 72 65 73  clause subexpres
2570: 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
2580: 64 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  d from the other
2590: 73 20 62 79 20 41 4e 44 20 6f 70 65 72 61 74 6f  s by AND operato
25a0: 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c 79 2c 20  rs,.** usually, 
25b0: 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20 73 75 62  or sometimes sub
25c0: 65 78 70 72 65 73 73 69 6f 6e 73 20 73 65 70 61  expressions sepa
25d0: 72 61 74 65 64 20 62 79 20 4f 52 2e 0a 2a 2a 0a  rated by OR..**.
25e0: 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54 65 72 6d  ** All WhereTerm
25f0: 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20  s are collected 
2600: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68  into a single Wh
2610: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
2620: 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20 66 6f  ure.  .** The fo
2630: 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69 74 79  llowing identity
2640: 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   holds:.**.**   
2650: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 70       WhereTerm.p
2660: 57 43 2d 3e 61 5b 57 68 65 72 65 54 65 72 6d 2e  WC->a[WhereTerm.
2670: 69 64 78 5d 20 3d 3d 20 57 68 65 72 65 54 65 72  idx] == WhereTer
2680: 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 74  m.**.** When a t
2690: 65 72 6d 20 69 73 20 6f 66 20 74 68 65 20 66 6f  erm is of the fo
26a0: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  rm:.**.**       
26b0: 20 20 20 20 20 20 20 58 20 3c 6f 70 3e 20 3c 65         X <op> <e
26c0: 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  xpr>.**.** where
26d0: 20 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6e   X is a column n
26e0: 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20  ame and <op> is 
26f0: 6f 6e 65 20 6f 66 20 63 65 72 74 61 69 6e 20 6f  one of certain o
2700: 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74 68 65  perators,.** the
2710: 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74  n WhereTerm.left
2720: 43 75 72 73 6f 72 20 61 6e 64 20 57 68 65 72 65  Cursor and Where
2730: 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c 75 6d  Term.u.leftColum
2740: 6e 20 72 65 63 6f 72 64 20 74 68 65 0a 2a 2a 20  n record the.** 
2750: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 61 6e  cursor number an
2760: 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  d column number 
2770: 66 6f 72 20 58 2e 20 20 57 68 65 72 65 54 65 72  for X.  WhereTer
2780: 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72 65 63 6f  m.eOperator reco
2790: 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e 20  rds.** the <op> 
27a0: 75 73 69 6e 67 20 61 20 62 69 74 6d 61 73 6b 20  using a bitmask 
27b0: 65 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e 65 64  encoding defined
27c0: 20 62 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f 77   by WO_xxx below
27d0: 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f 66  .  The.** use of
27e0: 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64   a bitmask encod
27f0: 69 6e 67 20 66 6f 72 20 74 68 65 20 6f 70 65 72  ing for the oper
2800: 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20 74  ator allows us t
2810: 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71 75 69 63  o search.** quic
2820: 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73 20 74 68  kly for terms th
2830: 61 74 20 6d 61 74 63 68 20 61 6e 79 20 6f 66 20  at match any of 
2840: 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e  several differen
2850: 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a  t operators..**.
2860: 2a 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 6d  ** A WhereTerm m
2870: 69 67 68 74 20 61 6c 73 6f 20 62 65 20 74 77 6f  ight also be two
2880: 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d   or more subterm
2890: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f  s connected by O
28a0: 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  R:.**.**        
28b0: 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c 65 78 70   (t1.X <op> <exp
28c0: 72 3e 29 20 4f 52 20 28 74 31 2e 59 20 3c 6f 70  r>) OR (t1.Y <op
28d0: 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 2e 2e 2e  > <expr>) OR ...
28e0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ..**.** In this 
28f0: 73 65 63 6f 6e 64 20 63 61 73 65 2c 20 77 74 46  second case, wtF
2900: 6c 61 67 20 68 61 73 20 74 68 65 20 54 45 52 4d  lag has the TERM
2910: 5f 4f 52 49 4e 46 4f 20 62 69 74 20 73 65 74 20  _ORINFO bit set 
2920: 61 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57  and eOperator==W
2930: 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20  O_OR.** and the 
2940: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
2950: 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74 73  nfo field points
2960: 20 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69 6e   to auxiliary in
2970: 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a  formation that.*
2980: 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 61  * is collected a
2990: 62 6f 75 74 20 74 68 65 20 4f 52 20 63 6c 61 75  bout the OR clau
29a0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  se..**.** If a t
29b0: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
29c0: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
29d0: 20 6d 61 74 63 68 20 65 69 74 68 65 72 20 6f 66   match either of
29e0: 20 74 68 65 20 74 77 6f 20 70 72 65 76 69 6f 75   the two previou
29f0: 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69 65 73 2c  s.** categories,
2a00: 20 74 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 3d   then eOperator=
2a10: 3d 30 2e 20 20 54 68 65 20 57 68 65 72 65 54 65  =0.  The WhereTe
2a20: 72 6d 2e 70 45 78 70 72 20 66 69 65 6c 64 20 69  rm.pExpr field i
2a30: 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a 2a 20 74  s still set.** t
2a40: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73  o the original s
2a50: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  ubexpression con
2a60: 74 65 6e 74 20 61 6e 64 20 77 74 46 6c 61 67 73  tent and wtFlags
2a70: 20 69 73 20 73 65 74 20 75 70 20 61 70 70 72 6f   is set up appro
2a80: 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62 75 74 20  priately.** but 
2a90: 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  no other fields 
2aa0: 69 6e 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  in the WhereTerm
2ab0: 20 6f 62 6a 65 63 74 20 61 72 65 20 6d 65 61 6e   object are mean
2ac0: 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 57 68  ingful..**.** Wh
2ad0: 65 6e 20 65 4f 70 65 72 61 74 6f 72 21 3d 30 2c  en eOperator!=0,
2ae0: 20 70 72 65 72 65 71 52 69 67 68 74 20 61 6e 64   prereqRight and
2af0: 20 70 72 65 72 65 71 41 6c 6c 20 72 65 63 6f 72   prereqAll recor
2b00: 64 20 73 65 74 73 20 6f 66 20 63 75 72 73 6f 72  d sets of cursor
2b10: 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62 75 74   numbers,.** but
2b20: 20 74 68 65 79 20 64 6f 20 73 6f 20 69 6e 64 69   they do so indi
2b30: 72 65 63 74 6c 79 2e 20 20 41 20 73 69 6e 67 6c  rectly.  A singl
2b40: 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73  e WhereMaskSet s
2b50: 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 6c 61  tructure transla
2b60: 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75  tes.** cursor nu
2b70: 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73 20 61  mber into bits a
2b80: 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61 74 65  nd the translate
2b90: 64 20 62 69 74 20 69 73 20 73 74 6f 72 65 64 20  d bit is stored 
2ba0: 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a 2a 2a  in the prereq.**
2bb0: 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 74 72   fields.  The tr
2bc0: 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75 73 65  anslation is use
2bd0: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  d in order to ma
2be0: 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62 65  ximize the numbe
2bf0: 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74 68 61  r of.** bits tha
2c00: 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 61 20  t will fit in a 
2c10: 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20 56 44  Bitmask.  The VD
2c20: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
2c30: 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 73 70  s might be.** sp
2c40: 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20 74 68  read out over th
2c50: 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  e non-negative i
2c60: 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20 65 78  ntegers.  For ex
2c70: 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72 73 6f  ample, the curso
2c80: 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d 69 67  r.** numbers mig
2c90: 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c 20 31  ht be 3, 8, 9, 1
2ca0: 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c 20 61  0, 20, 23, 41, a
2cb0: 6e 64 20 34 35 2e 20 20 54 68 65 20 57 68 65 72  nd 45.  The Wher
2cc0: 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61 6e  eMaskSet.** tran
2cd0: 73 6c 61 74 65 73 20 74 68 65 73 65 20 73 70 61  slates these spa
2ce0: 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  rse cursor numbe
2cf0: 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74  rs into consecut
2d00: 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20  ive integers.** 
2d10: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30  beginning with 0
2d20: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
2d30: 65 20 74 68 65 20 62 65 73 74 20 70 6f 73 73 69  e the best possi
2d40: 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20 61  ble use of the a
2d50: 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74 73  vailable.** bits
2d60: 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b 2e   in the Bitmask.
2d70: 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78 61    So, in the exa
2d80: 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20  mple above, the 
2d90: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a 2a  cursor numbers.*
2da0: 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70 65  * would be mappe
2db0: 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73 20  d into integers 
2dc0: 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2a 0a  0 through 7..**.
2dd0: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
2de0: 20 74 65 72 6d 73 20 69 6e 20 61 20 6a 6f 69 6e   terms in a join
2df0: 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
2e00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
2e10: 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65 71 52 69  s.** in prereqRi
2e20: 67 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c  ght and prereqAl
2e30: 6c 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  l.  The default 
2e40: 69 73 20 36 34 20 62 69 74 73 2c 20 68 65 6e 63  is 64 bits, henc
2e50: 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6f  e SQLite.** is o
2e60: 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70 72 6f 63  nly able to proc
2e70: 65 73 73 20 6a 6f 69 6e 73 20 77 69 74 68 20 36  ess joins with 6
2e80: 34 20 6f 72 20 66 65 77 65 72 20 74 61 62 6c 65  4 or fewer table
2e90: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  s..*/.struct Whe
2ea0: 72 65 54 65 72 6d 20 7b 0a 20 20 45 78 70 72 20  reTerm {.  Expr 
2eb0: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
2ec0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2ed0: 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
2ee0: 6f 6e 20 74 68 61 74 20 69 73 20 74 68 69 73 20  on that is this 
2ef0: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 50  term */.  int iP
2f00: 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  arent;          
2f10: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 70 57 43    /* Disable pWC
2f20: 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77 68 65  ->a[iParent] whe
2f30: 6e 20 74 68 69 73 20 74 65 72 6d 20 64 69 73 61  n this term disa
2f40: 62 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  bled */.  int le
2f50: 66 74 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20  ftCursor;       
2f60: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
2f70: 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f  er of X in "X <o
2f80: 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20  p> <expr>" */.  
2f90: 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 69 6e 74 20  union {.    int 
2fa0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  leftColumn;     
2fb0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
2fc0: 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20  mber of X in "X 
2fd0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a  <op> <expr>" */.
2fe0: 20 20 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20      WhereOrInfo 
2ff0: 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 2f 2a 20 45  *pOrInfo;   /* E
3000: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
3010: 20 69 66 20 28 65 4f 70 65 72 61 74 6f 72 20 26   if (eOperator &
3020: 20 57 4f 5f 4f 52 29 21 3d 30 20 2a 2f 0a 20 20   WO_OR)!=0 */.  
3030: 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a    WhereAndInfo *
3040: 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78 74  pAndInfo; /* Ext
3050: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
3060: 66 20 28 65 4f 70 65 72 61 74 6f 72 26 20 57 4f  f (eOperator& WO
3070: 5f 41 4e 44 29 21 3d 30 20 2a 2f 0a 20 20 7d 20  _AND)!=0 */.  } 
3080: 75 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74  u;.  u16 eOperat
3090: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or;          /* 
30a0: 41 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65  A WO_xx value de
30b0: 73 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f  scribing <op> */
30c0: 0a 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20  .  u8 wtFlags;  
30d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45             /* TE
30e0: 52 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73  RM_xxx bit flags
30f0: 2e 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a  .  See below */.
3100: 20 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20    u8 nChild;    
3110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3120: 62 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20  ber of children 
3130: 74 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c  that must disabl
3140: 65 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  e us */.  WhereC
3150: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
3160: 20 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20    /* The clause 
3170: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
3180: 74 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73  t of */.  Bitmas
3190: 6b 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20  k prereqRight;  
31a0: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
31b0: 74 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70  tables used by p
31c0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a  Expr->pRight */.
31d0: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
31e0: 41 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  All;      /* Bit
31f0: 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72  mask of tables r
3200: 65 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78  eferenced by pEx
3210: 70 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  pr */.};../*.** 
3220: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f  Allowed values o
3230: 66 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c  f WhereTerm.wtFl
3240: 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54  ags.*/.#define T
3250: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30  ERM_DYNAMIC    0
3260: 78 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  x01   /* Need to
3270: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   call sqlite3Exp
3280: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
3290: 72 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  r) */.#define TE
32a0: 52 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78  RM_VIRTUAL    0x
32b0: 30 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79  02   /* Added by
32c0: 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20   the optimizer. 
32d0: 20 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a   Do not code */.
32e0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44  #define TERM_COD
32f0: 45 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f  ED      0x04   /
3300: 2a 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61  * This term is a
3310: 6c 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a  lready coded */.
3320: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50  #define TERM_COP
3330: 49 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f  IED     0x08   /
3340: 2a 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f  * Has a child */
3350: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52  .#define TERM_OR
3360: 49 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20  INFO     0x10   
3370: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
3380: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
3390: 70 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a  pOrInfo object *
33a0: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41  /.#define TERM_A
33b0: 4e 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20  NDINFO    0x20  
33c0: 20 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65   /* Need to free
33d0: 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75   the WhereTerm.u
33e0: 2e 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f  .pAndInfo obj */
33f0: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52  .#define TERM_OR
3400: 5f 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20  _OK      0x40   
3410: 2f 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f  /* Used during O
3420: 52 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  R-clause process
3430: 69 6e 67 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ing */.#if defin
3440: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
3450: 5f 53 54 41 54 34 29 20 7c 7c 20 64 65 66 69 6e  _STAT4) || defin
3460: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
3470: 5f 53 54 41 54 33 29 0a 23 20 20 64 65 66 69 6e  _STAT3).#  defin
3480: 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20 20 20  e TERM_VNULL    
3490: 30 78 38 30 20 20 20 2f 2a 20 4d 61 6e 75 66 61  0x80   /* Manufa
34a0: 63 74 75 72 65 64 20 78 3e 4e 55 4c 4c 20 6f 72  ctured x>NULL or
34b0: 20 78 3c 3d 4e 55 4c 4c 20 74 65 72 6d 20 2a 2f   x<=NULL term */
34c0: 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
34d0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20 20 20 30   TERM_VNULL    0
34e0: 78 30 30 20 20 20 2f 2a 20 44 69 73 61 62 6c 65  x00   /* Disable
34f0: 64 20 69 66 20 6e 6f 74 20 75 73 69 6e 67 20 73  d if not using s
3500: 74 61 74 33 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  tat3 */.#endif..
3510: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
3520: 65 20 6f 66 20 74 68 65 20 57 68 65 72 65 53 63  e of the WhereSc
3530: 61 6e 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  an object is use
3540: 64 20 61 73 20 61 6e 20 69 74 65 72 61 74 6f 72  d as an iterator
3550: 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 0a 2a 2a   for locating.**
3560: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
3570: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
3580: 61 72 65 20 75 73 65 66 75 6c 20 74 6f 20 74 68  are useful to th
3590: 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  e query planner.
35a0: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
35b0: 53 63 61 6e 20 7b 0a 20 20 57 68 65 72 65 43 6c  Scan {.  WhereCl
35c0: 61 75 73 65 20 2a 70 4f 72 69 67 57 43 3b 20 20  ause *pOrigWC;  
35d0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 2c      /* Original,
35e0: 20 69 6e 6e 65 72 6d 6f 73 74 20 57 68 65 72 65   innermost Where
35f0: 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  Clause */.  Wher
3600: 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
3610: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 43         /* WhereC
3620: 6c 61 75 73 65 20 63 75 72 72 65 6e 74 6c 79 20  lause currently 
3630: 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f  being scanned */
3640: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 4e 61  .  char *zCollNa
3650: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
3660: 20 52 65 71 75 69 72 65 64 20 63 6f 6c 6c 61 74   Required collat
3670: 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 69 66  ing sequence, if
3680: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63   not NULL */.  c
3690: 68 61 72 20 69 64 78 61 66 66 3b 20 20 20 20 20  har idxaff;     
36a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
36b0: 74 20 6d 61 74 63 68 20 74 68 69 73 20 61 66 66  t match this aff
36c0: 69 6e 69 74 79 2c 20 69 66 20 7a 43 6f 6c 6c 4e  inity, if zCollN
36d0: 61 6d 65 21 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 75  ame!=NULL */.  u
36e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6e 45 71  nsigned char nEq
36f0: 75 69 76 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  uiv;      /* Num
3700: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3710: 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f 0a 20 20  n aEquiv[] */.  
3720: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 45  unsigned char iE
3730: 71 75 69 76 3b 20 20 20 20 20 20 2f 2a 20 4e 65  quiv;      /* Ne
3740: 78 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  xt unused slot i
3750: 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f 0a 20 20  n aEquiv[] */.  
3760: 75 33 32 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20  u32 opMask;     
3770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
3780: 63 65 70 74 61 62 6c 65 20 6f 70 65 72 61 74 6f  ceptable operato
3790: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20  rs */.  int k;  
37a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b0: 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 63 61     /* Resume sca
37c0: 6e 6e 69 6e 67 20 61 74 20 74 68 69 73 2d 3e 70  nning at this->p
37d0: 57 43 2d 3e 61 5b 74 68 69 73 2d 3e 6b 5d 20 2a  WC->a[this->k] *
37e0: 2f 0a 20 20 69 6e 74 20 61 45 71 75 69 76 5b 32  /.  int aEquiv[2
37f0: 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  2];            /
3800: 2a 20 43 75 72 73 6f 72 2c 43 6f 6c 75 6d 6e 20  * Cursor,Column 
3810: 70 61 69 72 73 20 66 6f 72 20 65 71 75 69 76 61  pairs for equiva
3820: 6c 65 6e 63 65 20 63 6c 61 73 73 65 73 20 2a 2f  lence classes */
3830: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
3840: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
3850: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3860: 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f  e holds all info
3870: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a  rmation about a.
3880: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  ** WHERE clause.
3890: 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73    Mostly this is
38a0: 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72   a container for
38b0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65   one or more Whe
38c0: 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 45  reTerms..**.** E
38d0: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 70 4f  xplanation of pO
38e0: 75 74 65 72 3a 20 20 46 6f 72 20 61 20 57 48 45  uter:  For a WHE
38f0: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
3900: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
3910: 20 20 20 20 20 20 61 20 41 4e 44 20 28 28 62 20        a AND ((b 
3920: 41 4e 44 20 63 29 20 4f 52 20 28 64 20 41 4e 44  AND c) OR (d AND
3930: 20 65 29 29 20 41 4e 44 20 66 0a 2a 2a 0a 2a 2a   e)) AND f.**.**
3940: 20 54 68 65 72 65 20 61 72 65 20 73 65 70 61 72   There are separ
3950: 61 74 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  ate WhereClause 
3960: 6f 62 6a 65 63 74 73 20 66 6f 72 20 74 68 65 20  objects for the 
3970: 77 68 6f 6c 65 20 63 6c 61 75 73 65 20 61 6e 64  whole clause and
3980: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 75 62 63   for.** the subc
3990: 6c 61 75 73 65 73 20 22 28 62 20 41 4e 44 20 63  lauses "(b AND c
39a0: 29 22 20 61 6e 64 20 22 28 64 20 41 4e 44 20 65  )" and "(d AND e
39b0: 29 22 2e 20 20 54 68 65 20 70 4f 75 74 65 72 20  )".  The pOuter 
39c0: 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a 2a 20  field of the.** 
39d0: 73 75 62 63 6c 61 75 73 65 73 20 70 6f 69 6e 74  subclauses point
39e0: 73 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c  s to the WhereCl
39f0: 61 75 73 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  ause object for 
3a00: 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65  the whole clause
3a10: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
3a20: 65 43 6c 61 75 73 65 20 7b 0a 20 20 57 68 65 72  eClause {.  Wher
3a30: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
3a40: 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c       /* WHERE cl
3a50: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
3a60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
3a70: 72 65 43 6c 61 75 73 65 20 2a 70 4f 75 74 65 72  reClause *pOuter
3a80: 3b 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20 63  ;     /* Outer c
3a90: 6f 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  onjunction */.  
3aa0: 75 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  u8 op;          
3ab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69           /* Spli
3ac0: 74 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f  t operator.  TK_
3ad0: 41 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a  AND or TK_OR */.
3ae0: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
3af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3b00: 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f  mber of terms */
3b10: 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20  .  int nSlot;   
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3b30: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3b40: 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65   in a[] */.  Whe
3b50: 72 65 54 65 72 6d 20 2a 61 3b 20 20 20 20 20 20  reTerm *a;      
3b60: 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 61 5b        /* Each a[
3b70: 5d 20 64 65 73 63 72 69 62 65 73 20 61 20 74 65  ] describes a te
3b80: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
3b90: 63 6c 75 61 73 65 20 2a 2f 0a 23 69 66 20 64 65  cluase */.#if de
3ba0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 4d 41  fined(SQLITE_SMA
3bb0: 4c 4c 5f 53 54 41 43 4b 29 0a 20 20 57 68 65 72  LL_STACK).  Wher
3bc0: 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 31 5d  eTerm aStatic[1]
3bd0: 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20  ;    /* Initial 
3be0: 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72  static space for
3bf0: 20 61 5b 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20   a[] */.#else.  
3c00: 57 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69  WhereTerm aStati
3c10: 63 5b 38 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74  c[8];    /* Init
3c20: 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65  ial static space
3c30: 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64   for a[] */.#end
3c40: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57  if.};../*.** A W
3c50: 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f  hereTerm with eO
3c60: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68  perator==WO_OR h
3c70: 61 73 20 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f  as its u.pOrInfo
3c80: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
3c90: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
3ca0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
3cb0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
3cc0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
3cd0: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f  */.struct WhereO
3ce0: 72 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43  rInfo {.  WhereC
3cf0: 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20  lause wc;       
3d00: 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
3d10: 69 6f 6e 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  ion into subterm
3d20: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  s */.  Bitmask i
3d30: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
3d40: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c  /* Bitmask of al
3d50: 6c 20 69 6e 64 65 78 61 62 6c 65 20 74 61 62 6c  l indexable tabl
3d60: 65 73 20 69 6e 20 74 68 65 20 63 6c 61 75 73 65  es in the clause
3d70: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
3d80: 57 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65  WhereTerm with e
3d90: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44  Operator==WO_AND
3da0: 20 68 61 73 20 69 74 73 20 75 2e 70 41 6e 64 49   has its u.pAndI
3db0: 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20  nfo pointer set 
3dc0: 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61  to.** a dynamica
3dd0: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  lly allocated in
3de0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
3df0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3e00: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
3e10: 72 65 41 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68  reAndInfo {.  Wh
3e20: 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20  ereClause wc;   
3e30: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
3e40: 62 65 78 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b  bexpression brok
3e50: 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  en out */.};../*
3e60: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
3e70: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3e80: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
3e90: 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61 70 70   track of a mapp
3ea0: 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56  ing.** between V
3eb0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
3ec0: 72 73 20 61 6e 64 20 62 69 74 73 20 6f 66 20 74  rs and bits of t
3ed0: 68 65 20 62 69 74 6d 61 73 6b 73 20 69 6e 20 57  he bitmasks in W
3ee0: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
3ef0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
3f00: 6e 75 6d 62 65 72 73 20 61 72 65 20 73 6d 61 6c  numbers are smal
3f10: 6c 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61  l integers conta
3f20: 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c  ined in .** SrcL
3f30: 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72  ist_item.iCursor
3f40: 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62 6c 65   and Expr.iTable
3f50: 20 66 69 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e   fields.  For an
3f60: 79 20 67 69 76 65 6e 20 57 48 45 52 45 20 0a 2a  y given WHERE .*
3f70: 2a 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 75  * clause, the cu
3f80: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67  rsor numbers mig
3f90: 68 74 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  ht not begin wit
3fa0: 68 20 30 20 61 6e 64 20 74 68 65 79 20 6d 69 67  h 0 and they mig
3fb0: 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61  ht.** contain ga
3fc0: 70 73 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ps in the number
3fd0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 42  ing sequence.  B
3fe0: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
3ff0: 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73  ke maximum.** us
4000: 65 20 6f 66 20 74 68 65 20 62 69 74 73 20 69 6e  e of the bits in
4010: 20 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e 20 20   our bitmasks.  
4020: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 70  This structure p
4030: 72 6f 76 69 64 65 73 20 61 20 6d 61 70 70 69 6e  rovides a mappin
4040: 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 70  g.** from the sp
4050: 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  arse cursor numb
4060: 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75  ers into consecu
4070: 74 69 76 65 20 69 6e 74 65 67 65 72 73 20 62 65  tive integers be
4080: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20  ginning.** with 
4090: 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72  0..**.** If Wher
40a0: 65 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d  eMaskSet.ix[A]==
40b0: 42 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  B it means that 
40c0: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
40d0: 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72  a Bitmask.** cor
40e0: 72 65 73 70 6f 6e 64 73 20 56 44 42 45 20 63 75  responds VDBE cu
40f0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20 20  rsor number B.  
4100: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
4110: 61 20 62 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c  a bitmask is 1<<
4120: 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  A..**.** For exa
4130: 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57 48 45  mple, if the WHE
4140: 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
4150: 73 69 6f 6e 20 75 73 65 64 20 74 68 65 73 65 20  sion used these 
4160: 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a  VDBE.** cursors:
4170: 20 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35    4, 5, 8, 29, 5
4180: 37 2c 20 37 33 2e 20 20 54 68 65 6e 20 74 68 65  7, 73.  Then the
4190: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73    WhereMaskSet s
41a0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c  tructure.** woul
41b0: 64 20 6d 61 70 20 74 68 6f 73 65 20 63 75 72 73  d map those curs
41c0: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
41d0: 62 69 74 73 20 30 20 74 68 72 6f 75 67 68 20 35  bits 0 through 5
41e0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
41f0: 74 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  t the mapping is
4200: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
4210: 20 6f 72 64 65 72 65 64 2e 20 20 49 6e 20 74 68   ordered.  In th
4220: 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f  e example.** abo
4230: 76 65 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ve, the mapping 
4240: 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65 20 74 68  might go like th
4250: 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c  is:  4->3, 5->1,
4260: 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a   8->2, 29->0,.**
4270: 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20   57->5, 73->4.  
4280: 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74  Or one of 719 ot
4290: 68 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  her combinations
42a0: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 2e 20   might be used. 
42b0: 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72  It.** does not r
42c0: 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20 20 57  eally matter.  W
42d0: 68 61 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  hat is important
42e0: 20 69 73 20 74 68 61 74 20 73 70 61 72 73 65 20   is that sparse 
42f0: 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
4300: 73 20 61 6c 6c 20 67 65 74 20 6d 61 70 70 65 64  s all get mapped
4310: 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62 65 72   into bit number
4320: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
4330: 68 20 30 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a  h 0 and contain.
4340: 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73  ** no gaps..*/.s
4350: 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53  truct WhereMaskS
4360: 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20  et {.  int n;   
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4380: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4390: 66 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f  f assigned curso
43a0: 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  r values */.  in
43b0: 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20  t ix[BMS];      
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
43d0: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
43e0: 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b  o each bit */.};
43f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6f 62 6a  ../*.** This obj
4400: 65 63 74 20 69 73 20 61 20 63 6f 6e 76 65 6e 69  ect is a conveni
4410: 65 6e 63 65 20 77 72 61 70 70 65 72 20 68 6f 6c  ence wrapper hol
4420: 64 69 6e 67 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  ding all informa
4430: 74 69 6f 6e 20 6e 65 65 64 65 64 0a 2a 2a 20 74  tion needed.** t
4440: 6f 20 63 6f 6e 73 74 72 75 63 74 20 57 68 65 72  o construct Wher
4450: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
4460: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 71  r a particular q
4470: 75 65 72 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  uery..*/.struct 
4480: 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
4490: 20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a   {.  WhereInfo *
44a0: 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 2f  pWInfo;        /
44b0: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
44c0: 6f 75 74 20 74 68 69 73 20 57 48 45 52 45 20 2a  out this WHERE *
44d0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
44e0: 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 2f 2a  *pWC;         /*
44f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
4500: 72 6d 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  rms */.  ExprLis
4510: 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
4520: 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63     /* ORDER BY c
4530: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
4540: 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
4550: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
4560: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20   WhereLoop */.  
4570: 57 68 65 72 65 4f 72 53 65 74 20 2a 70 4f 72 53  WhereOrSet *pOrS
4580: 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 63  et;       /* Rec
4590: 6f 72 64 20 62 65 73 74 20 6c 6f 6f 70 73 20 68  ord best loops h
45a0: 65 72 65 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  ere, if not NULL
45b0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
45c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
45d0: 41 54 34 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  AT4) || defined(
45e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
45f0: 41 54 33 29 0a 20 20 55 6e 70 61 63 6b 65 64 52  AT3).  UnpackedR
4600: 65 63 6f 72 64 20 2a 70 52 65 63 3b 20 20 20 20  ecord *pRec;    
4610: 20 2f 2a 20 50 72 6f 62 65 20 66 6f 72 20 73 74   /* Probe for st
4620: 61 74 34 20 28 69 66 20 72 65 71 75 69 72 65 64  at4 (if required
4630: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 56  ) */.  int nRecV
4640: 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  alid;           
4650: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
4660: 6c 69 64 20 66 69 65 6c 64 73 20 63 75 72 72 65  lid fields curre
4670: 6e 74 6c 79 20 69 6e 20 70 52 65 63 20 2a 2f 0a  ntly in pRec */.
4680: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
4690: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
46a0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 72 6f 75  e processing rou
46b0: 74 69 6e 65 20 68 61 73 20 74 77 6f 20 68 61 6c  tine has two hal
46c0: 76 65 73 2e 20 20 54 68 65 0a 2a 2a 20 66 69 72  ves.  The.** fir
46d0: 73 74 20 70 61 72 74 20 64 6f 65 73 20 74 68 65  st part does the
46e0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 57 48   start of the WH
46f0: 45 52 45 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65  ERE loop and the
4700: 20 73 65 63 6f 6e 64 0a 2a 2a 20 68 61 6c 66 20   second.** half 
4710: 64 6f 65 73 20 74 68 65 20 74 61 69 6c 20 6f 66  does the tail of
4720: 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e   the WHERE loop.
4730: 20 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66    An instance of
4740: 0a 2a 2a 20 74 68 69 73 20 73 74 72 75 63 74 75  .** this structu
4750: 72 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  re is returned b
4760: 79 20 74 68 65 20 66 69 72 73 74 20 68 61 6c 66  y the first half
4770: 20 61 6e 64 20 70 61 73 73 65 64 0a 2a 2a 20 69   and passed.** i
4780: 6e 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 68  nto the second h
4790: 61 6c 66 20 74 6f 20 67 69 76 65 20 73 6f 6d 65  alf to give some
47a0: 20 63 6f 6e 74 69 6e 75 69 74 79 2e 0a 2a 2a 0a   continuity..**.
47b0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
47c0: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 68 6f  f this object ho
47d0: 6c 64 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  lds the complete
47e0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 71 75   state of the qu
47f0: 65 72 79 0a 2a 2a 20 70 6c 61 6e 6e 65 72 2e 0a  ery.** planner..
4800: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 49  */.struct WhereI
4810: 6e 66 6f 20 7b 0a 20 20 50 61 72 73 65 20 2a 70  nfo {.  Parse *p
4820: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
4830: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
4840: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
4850: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
4860: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
4870: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
4880: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
4890: 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 4c   join */.  ExprL
48a0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
48b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
48c0: 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 4e  R BY clause or N
48d0: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
48e0: 74 20 2a 70 52 65 73 75 6c 74 53 65 74 3b 20 20  t *pResultSet;  
48f0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74     /* Result set
4900: 2e 20 44 49 53 54 49 4e 43 54 20 6f 70 65 72 61  . DISTINCT opera
4910: 74 65 73 20 6f 6e 20 74 68 65 73 65 20 2a 2f 0a  tes on these */.
4920: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
4930: 6f 70 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  ops;        /* L
4940: 69 73 74 20 6f 66 20 61 6c 6c 20 57 68 65 72 65  ist of all Where
4950: 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
4960: 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73    Bitmask revMas
4970: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  k;          /* M
4980: 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ask of ORDER BY 
4990: 74 65 72 6d 73 20 74 68 61 74 20 6e 65 65 64 20  terms that need 
49a0: 72 65 76 65 72 73 69 6e 67 20 2a 2f 0a 20 20 57  reversing */.  W
49b0: 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 4f 75 74  hereCost nRowOut
49c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69  ;        /* Esti
49d0: 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
49e0: 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20  output rows */. 
49f0: 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b   u16 wctrlFlags;
4a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
4a10: 61 67 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 70  ags originally p
4a20: 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
4a30: 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
4a40: 20 20 75 38 20 62 4f 42 53 61 74 3b 20 20 20 20    u8 bOBSat;    
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4a60: 52 44 45 52 20 42 59 20 73 61 74 69 73 66 69 65  RDER BY satisfie
4a70: 64 20 62 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a  d by indices */.
4a80: 20 20 75 38 20 6f 6b 4f 6e 65 50 61 73 73 3b 20    u8 okOnePass; 
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4aa0: 6b 20 74 6f 20 75 73 65 20 6f 6e 65 2d 70 61 73  k to use one-pas
4ab0: 73 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20  s algorithm for 
4ac0: 55 50 44 41 54 45 2f 44 45 4c 45 54 45 20 2a 2f  UPDATE/DELETE */
4ad0: 0a 20 20 75 38 20 75 6e 74 65 73 74 65 64 54 65  .  u8 untestedTe
4ae0: 72 6d 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rms;         /* 
4af0: 4e 6f 74 20 61 6c 6c 20 57 48 45 52 45 20 74 65  Not all WHERE te
4b00: 72 6d 73 20 72 65 73 6f 6c 76 65 64 20 62 79 20  rms resolved by 
4b10: 6f 75 74 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20  outer loop */.  
4b20: 75 38 20 65 44 69 73 74 69 6e 63 74 3b 20 20 20  u8 eDistinct;   
4b30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
4b40: 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49   of the WHERE_DI
4b50: 53 54 49 4e 43 54 5f 2a 20 76 61 6c 75 65 73 20  STINCT_* values 
4b60: 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e 4c  below */.  u8 nL
4b70: 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  evel;           
4b80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4b90: 66 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 2a 2f  f nested loop */
4ba0: 0a 20 20 69 6e 74 20 69 54 6f 70 3b 20 20 20 20  .  int iTop;    
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4bc0: 54 68 65 20 76 65 72 79 20 62 65 67 69 6e 6e 69  The very beginni
4bd0: 6e 67 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ng of the WHERE 
4be0: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43  loop */.  int iC
4bf0: 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 20 20  ontinue;        
4c00: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
4c10: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
4c20: 68 20 6e 65 78 74 20 72 65 63 6f 72 64 20 2a 2f  h next record */
4c30: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 3b 20 20  .  int iBreak;  
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4c50: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
4c60: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  ak out of the lo
4c70: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  op */.  int save
4c80: 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 20 20 20 20  dNQueryLoop;    
4c90: 20 20 2f 2a 20 70 50 61 72 73 65 2d 3e 6e 51 75    /* pParse->nQu
4ca0: 65 72 79 4c 6f 6f 70 20 6f 75 74 73 69 64 65 20  eryLoop outside 
4cb0: 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 20 2a  the WHERE loop *
4cc0: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
4cd0: 20 73 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a   sMaskSet;    /*
4ce0: 20 4d 61 70 20 63 75 72 73 6f 72 20 6e 75 6d 62   Map cursor numb
4cf0: 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20  ers to bitmasks 
4d00: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
4d10: 20 73 57 43 3b 20 20 20 20 20 20 20 20 20 20 2f   sWC;          /
4d20: 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20  * Decomposition 
4d30: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
4d40: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  use */.  WhereLe
4d50: 76 65 6c 20 61 5b 31 5d 3b 20 20 20 20 20 20 20  vel a[1];       
4d60: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
4d70: 6e 20 61 62 6f 75 74 20 65 61 63 68 20 6e 65 73  n about each nes
4d80: 74 20 6c 6f 6f 70 20 69 6e 20 57 48 45 52 45 20  t loop in WHERE 
4d90: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74  */.};../*.** Bit
4da0: 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20 6f 70  masks for the op
4db0: 65 72 61 74 6f 72 73 20 6f 6e 20 57 68 65 72 65  erators on Where
4dc0: 54 65 72 6d 20 6f 62 6a 65 63 74 73 2e 20 20 54  Term objects.  T
4dd0: 68 65 73 65 20 61 72 65 20 61 6c 6c 0a 2a 2a 20  hese are all.** 
4de0: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 61  operators that a
4df0: 72 65 20 6f 66 20 69 6e 74 65 72 65 73 74 20 74  re of interest t
4e00: 6f 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  o the query plan
4e10: 6e 65 72 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65  ner.  An.** OR-e
4e20: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
4e30: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 63 61   these values ca
4e40: 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 73  n be used when s
4e50: 65 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20  earching for.** 
4e60: 70 61 72 74 69 63 75 6c 61 72 20 57 68 65 72 65  particular Where
4e70: 54 65 72 6d 73 20 77 69 74 68 69 6e 20 61 20 57  Terms within a W
4e80: 68 65 72 65 43 6c 61 75 73 65 2e 0a 2a 2f 0a 23  hereClause..*/.#
4e90: 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20  define WO_IN    
4ea0: 20 30 78 30 30 31 0a 23 64 65 66 69 6e 65 20 57   0x001.#define W
4eb0: 4f 5f 45 51 20 20 20 20 20 30 78 30 30 32 0a 23  O_EQ     0x002.#
4ec0: 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20 20  define WO_LT    
4ed0: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d   (WO_EQ<<(TK_LT-
4ee0: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
4ef0: 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45 51  WO_LE     (WO_EQ
4f00: 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29  <<(TK_LE-TK_EQ))
4f10: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20 20  .#define WO_GT  
4f20: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47     (WO_EQ<<(TK_G
4f30: 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  T-TK_EQ)).#defin
4f40: 65 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f 5f  e WO_GE     (WO_
4f50: 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45 51  EQ<<(TK_GE-TK_EQ
4f60: 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d 41  )).#define WO_MA
4f70: 54 43 48 20 20 30 78 30 34 30 0a 23 64 65 66 69  TCH  0x040.#defi
4f80: 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20 30 78 30  ne WO_ISNULL 0x0
4f90: 38 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4f 52  80.#define WO_OR
4fa0: 20 20 20 20 20 30 78 31 30 30 20 20 20 20 20 20       0x100      
4fb0: 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20   /* Two or more 
4fc0: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
4fd0: 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  ms */.#define WO
4fe0: 5f 41 4e 44 20 20 20 20 30 78 32 30 30 20 20 20  _AND    0x200   
4ff0: 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f      /* Two or mo
5000: 72 65 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64  re AND-connected
5010: 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e   terms */.#defin
5020: 65 20 57 4f 5f 45 51 55 49 56 20 20 30 78 34 30  e WO_EQUIV  0x40
5030: 30 20 20 20 20 20 20 20 2f 2a 20 4f 66 20 74 68  0       /* Of th
5040: 65 20 66 6f 72 6d 20 41 3d 3d 42 2c 20 62 6f 74  e form A==B, bot
5050: 68 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65  h columns */.#de
5060: 66 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20 20 20 30  fine WO_NOOP   0
5070: 78 38 30 30 20 20 20 20 20 20 20 2f 2a 20 54 68  x800       /* Th
5080: 69 73 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74  is term does not
5090: 20 72 65 73 74 72 69 63 74 20 73 65 61 72 63 68   restrict search
50a0: 20 73 70 61 63 65 20 2a 2f 0a 0a 23 64 65 66 69   space */..#defi
50b0: 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20 30 78 66  ne WO_ALL    0xf
50c0: 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  ff       /* Mask
50d0: 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69 62 6c 65   of all possible
50e0: 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a   WO_* values */.
50f0: 23 64 65 66 69 6e 65 20 57 4f 5f 53 49 4e 47 4c  #define WO_SINGL
5100: 45 20 30 78 30 66 66 20 20 20 20 20 20 20 2f 2a  E 0x0ff       /*
5110: 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 6e 6f 6e   Mask of all non
5120: 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f 2a 20 76  -compound WO_* v
5130: 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  alues */../*.** 
5140: 54 68 65 73 65 20 61 72 65 20 64 65 66 69 6e 69  These are defini
5150: 74 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e  tions of bits in
5160: 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 77   the WhereLoop.w
5170: 73 46 6c 61 67 73 20 66 69 65 6c 64 2e 0a 2a 2a  sFlags field..**
5180: 20 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20   The particular 
5190: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 62  combination of b
51a0: 69 74 73 20 69 6e 20 65 61 63 68 20 57 68 65 72  its in each Wher
51b0: 65 4c 6f 6f 70 20 68 65 6c 70 20 74 6f 0a 2a 2a  eLoop help to.**
51c0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 61   determine the a
51d0: 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20 57 68  lgorithm that Wh
51e0: 65 72 65 4c 6f 6f 70 20 72 65 70 72 65 73 65 6e  ereLoop represen
51f0: 74 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ts..*/.#define W
5200: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20  HERE_COLUMN_EQ  
5210: 20 20 30 78 30 30 30 30 30 30 30 31 20 20 2f 2a    0x00000001  /*
5220: 20 78 3d 45 58 50 52 20 2a 2f 0a 23 64 65 66 69   x=EXPR */.#defi
5230: 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  ne WHERE_COLUMN_
5240: 52 41 4e 47 45 20 30 78 30 30 30 30 30 30 30 32  RANGE 0x00000002
5250: 20 20 2f 2a 20 78 3c 45 58 50 52 20 61 6e 64 2f    /* x<EXPR and/
5260: 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a 23 64 65  or x>EXPR */.#de
5270: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d  fine WHERE_COLUM
5280: 4e 5f 49 4e 20 20 20 20 30 78 30 30 30 30 30 30  N_IN    0x000000
5290: 30 34 20 20 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e  04  /* x IN (...
52a0: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  ) */.#define WHE
52b0: 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20  RE_COLUMN_NULL  
52c0: 30 78 30 30 30 30 30 30 30 38 20 20 2f 2a 20 78  0x00000008  /* x
52d0: 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66   IS NULL */.#def
52e0: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  ine WHERE_CONSTR
52f0: 41 49 4e 54 20 20 20 30 78 30 30 30 30 30 30 30  AINT   0x0000000
5300: 66 20 20 2f 2a 20 41 6e 79 20 6f 66 20 74 68 65  f  /* Any of the
5310: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 78 78   WHERE_COLUMN_xx
5320: 78 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66  x values */.#def
5330: 69 6e 65 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  ine WHERE_TOP_LI
5340: 4d 49 54 20 20 20 20 30 78 30 30 30 30 30 30 31  MIT    0x0000001
5350: 30 20 20 2f 2a 20 78 3c 45 58 50 52 20 6f 72 20  0  /* x<EXPR or 
5360: 78 3c 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69  x<=EXPR constrai
5370: 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  nt */.#define WH
5380: 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 20 20  ERE_BTM_LIMIT   
5390: 20 30 78 30 30 30 30 30 30 32 30 20 20 2f 2a 20   0x00000020  /* 
53a0: 78 3e 45 58 50 52 20 6f 72 20 78 3e 3d 45 58 50  x>EXPR or x>=EXP
53b0: 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  R constraint */.
53c0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 4f  #define WHERE_BO
53d0: 54 48 5f 4c 49 4d 49 54 20 20 20 30 78 30 30 30  TH_LIMIT   0x000
53e0: 30 30 30 33 30 20 20 2f 2a 20 42 6f 74 68 20 78  00030  /* Both x
53f0: 3e 45 58 50 52 20 61 6e 64 20 78 3c 45 58 50 52  >EXPR and x<EXPR
5400: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
5410: 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20 20 20 30  E_IDX_ONLY     0
5420: 78 30 30 30 30 30 30 34 30 20 20 2f 2a 20 55 73  x00000040  /* Us
5430: 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2d 20 6f  e index only - o
5440: 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65  mit table */.#de
5450: 66 69 6e 65 20 57 48 45 52 45 5f 49 50 4b 20 20  fine WHERE_IPK  
5460: 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30 31          0x000001
5470: 30 30 20 20 2f 2a 20 78 20 69 73 20 74 68 65 20  00  /* x is the 
5480: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
5490: 4b 45 59 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  KEY */.#define W
54a0: 48 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20 20  HERE_INDEXED    
54b0: 20 20 30 78 30 30 30 30 30 32 30 30 20 20 2f 2a    0x00000200  /*
54c0: 20 57 68 65 72 65 4c 6f 6f 70 2e 75 2e 62 74 72   WhereLoop.u.btr
54d0: 65 65 2e 70 49 6e 64 65 78 20 69 73 20 76 61 6c  ee.pIndex is val
54e0: 69 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  id */.#define WH
54f0: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
5500: 20 30 78 30 30 30 30 30 34 30 30 20 20 2f 2a 20   0x00000400  /* 
5510: 57 68 65 72 65 4c 6f 6f 70 2e 75 2e 76 74 61 62  WhereLoop.u.vtab
5520: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65   is valid */.#de
5530: 66 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42  fine WHERE_IN_AB
5540: 4c 45 20 20 20 20 20 20 30 78 30 30 30 30 30 38  LE      0x000008
5550: 30 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73  00  /* Able to s
5560: 75 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65  upport an IN ope
5570: 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65  rator */.#define
5580: 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 20 20   WHERE_ONEROW   
5590: 20 20 20 20 30 78 30 30 30 30 31 30 30 30 20 20      0x00001000  
55a0: 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f  /* Selects no mo
55b0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20  re than one row 
55c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
55d0: 5f 4d 55 4c 54 49 5f 4f 52 20 20 20 20 20 30 78  _MULTI_OR     0x
55e0: 30 30 30 30 32 30 30 30 20 20 2f 2a 20 4f 52 20  00002000  /* OR 
55f0: 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69  using multiple i
5600: 6e 64 69 63 65 73 20 2a 2f 0a 23 64 65 66 69 6e  ndices */.#defin
5610: 65 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  e WHERE_AUTO_IND
5620: 45 58 20 20 20 30 78 30 30 30 30 34 30 30 30 20  EX   0x00004000 
5630: 20 2f 2a 20 55 73 65 73 20 61 6e 20 65 70 68 65   /* Uses an ephe
5640: 6d 65 72 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a  meral index */..
5650: 0a 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 57 68  ./* Convert a Wh
5660: 65 72 65 43 6f 73 74 20 76 61 6c 75 65 20 28 31  ereCost value (1
5670: 30 20 74 69 6d 65 73 20 6c 6f 67 32 28 58 29 29  0 times log2(X))
5680: 20 69 6e 74 6f 20 69 74 73 20 69 6e 74 65 67 65   into its intege
5690: 72 20 76 61 6c 75 65 20 58 2e 0a 2a 2a 20 41 20  r value X..** A 
56a0: 72 6f 75 67 68 20 61 70 70 72 6f 78 69 6d 61 74  rough approximat
56b0: 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 54 68  ion is used.  Th
56c0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
56d0: 20 69 73 20 6e 6f 74 20 65 78 61 63 74 2e 0a 2a   is not exact..*
56e0: 2f 0a 73 74 61 74 69 63 20 75 36 34 20 77 68 65  /.static u64 whe
56f0: 72 65 43 6f 73 74 54 6f 49 6e 74 28 57 68 65 72  reCostToInt(Wher
5700: 65 43 6f 73 74 20 78 29 7b 0a 20 20 75 36 34 20  eCost x){.  u64 
5710: 6e 3b 0a 20 20 69 66 28 20 78 3c 31 30 20 29 20  n;.  if( x<10 ) 
5720: 72 65 74 75 72 6e 20 31 3b 0a 20 20 6e 20 3d 20  return 1;.  n = 
5730: 78 25 31 30 3b 0a 20 20 78 20 2f 3d 20 31 30 3b  x%10;.  x /= 10;
5740: 0a 20 20 69 66 28 20 6e 3e 3d 35 20 29 20 6e 20  .  if( n>=5 ) n 
5750: 2d 3d 20 32 3b 0a 20 20 65 6c 73 65 20 69 66 28  -= 2;.  else if(
5760: 20 6e 3e 3d 31 20 29 20 6e 20 2d 3d 20 31 3b 0a   n>=1 ) n -= 1;.
5770: 20 20 69 66 28 20 78 3e 3d 33 20 29 20 72 65 74    if( x>=3 ) ret
5780: 75 72 6e 20 28 6e 2b 38 29 3c 3c 28 78 2d 33 29  urn (n+8)<<(x-3)
5790: 3b 0a 20 20 72 65 74 75 72 6e 20 28 6e 2b 38 29  ;.  return (n+8)
57a0: 3e 3e 28 33 2d 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >>(3-x);.}../*.*
57b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73 74  * Return the est
57c0: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
57d0: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72 6f   output rows fro
57e0: 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  m a WHERE clause
57f0: 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 57  .*/.u64 sqlite3W
5800: 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
5810: 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  nt(WhereInfo *pW
5820: 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20  Info){.  return 
5830: 77 68 65 72 65 43 6f 73 74 54 6f 49 6e 74 28 70  whereCostToInt(p
5840: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
5850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5860: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
5870: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
5880: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
5890: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
58a0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
58b0: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
58c0: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
58d0: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
58e0: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
58f0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
5900: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
5910: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
5920: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
5930: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
5940: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
5950: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
5960: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
5970: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
5980: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
5990: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
59a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
59b0: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
59c0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
59d0: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
59e0: 3e 62 4f 42 53 61 74 21 3d 30 3b 0a 7d 0a 0a 2f  >bOBSat!=0;.}../
59f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5a00: 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20  VDBE address or 
5a10: 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
5a20: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
5a30: 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61  tinue.** immedia
5a40: 74 65 6c 79 20 77 69 74 68 20 74 68 65 20 6e 65  tely with the ne
5a50: 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48 45 52  xt row of a WHER
5a60: 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  E clause..*/.int
5a70: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
5a80: 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65 72 65  tinueLabel(Where
5a90: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
5aa0: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
5ab0: 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  iContinue;.}../*
5ac0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
5ad0: 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c  DBE address or l
5ae0: 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
5af0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61  in order to brea
5b00: 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48  k.** out of a WH
5b10: 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74  ERE loop..*/.int
5b20: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
5b30: 61 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  akLabel(WhereInf
5b40: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
5b50: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72  turn pWInfo->iBr
5b60: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eak;.}../*.** Re
5b70: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20  turn TRUE if an 
5b80: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
5b90: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f   statement can o
5ba0: 70 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20  perate directly 
5bb0: 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73  on.** the rowids
5bc0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57   returned by a W
5bd0: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65  HERE clause.  Re
5be0: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f  turn FALSE if do
5bf0: 69 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45  ing an.** UPDATE
5c00: 20 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74   or DELETE might
5c10: 20 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65   change subseque
5c20: 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  nt WHERE clause 
5c30: 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 69 6e 74 20  results..*/.int 
5c40: 73 71 6c 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e  sqlite3WhereOkOn
5c50: 65 50 61 73 73 28 57 68 65 72 65 49 6e 66 6f 20  ePass(WhereInfo 
5c60: 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75  *pWInfo){.  retu
5c70: 72 6e 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  rn pWInfo->okOne
5c80: 50 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  Pass;.}../*.** M
5c90: 6f 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ove the content 
5ca0: 6f 66 20 70 53 72 63 20 69 6e 74 6f 20 70 44 65  of pSrc into pDe
5cb0: 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  st.*/.static voi
5cc0: 64 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 57 68  d whereOrMove(Wh
5cd0: 65 72 65 4f 72 53 65 74 20 2a 70 44 65 73 74 2c  ereOrSet *pDest,
5ce0: 20 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53 72   WhereOrSet *pSr
5cf0: 63 29 7b 0a 20 20 70 44 65 73 74 2d 3e 6e 20 3d  c){.  pDest->n =
5d00: 20 70 53 72 63 2d 3e 6e 3b 0a 20 20 6d 65 6d 63   pSrc->n;.  memc
5d10: 70 79 28 70 44 65 73 74 2d 3e 61 2c 20 70 53 72  py(pDest->a, pSr
5d20: 63 2d 3e 61 2c 20 70 44 65 73 74 2d 3e 6e 2a 73  c->a, pDest->n*s
5d30: 69 7a 65 6f 66 28 70 44 65 73 74 2d 3e 61 5b 30  izeof(pDest->a[0
5d40: 5d 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  ]));.}../*.** Tr
5d50: 79 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65  y to insert a ne
5d60: 77 20 70 72 65 72 65 71 75 69 73 69 74 65 2f 63  w prerequisite/c
5d70: 6f 73 74 20 65 6e 74 72 79 20 69 6e 74 6f 20 74  ost entry into t
5d80: 68 65 20 57 68 65 72 65 4f 72 53 65 74 20 70 53  he WhereOrSet pS
5d90: 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  et..**.** The ne
5da0: 77 20 65 6e 74 72 79 20 6d 69 67 68 74 20 6f 76  w entry might ov
5db0: 65 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74  erwrite an exist
5dc0: 69 6e 67 20 65 6e 74 72 79 2c 20 6f 72 20 69 74  ing entry, or it
5dd0: 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 70 70   might be.** app
5de0: 65 6e 64 65 64 2c 20 6f 72 20 69 74 20 6d 69 67  ended, or it mig
5df0: 68 74 20 62 65 20 64 69 73 63 61 72 64 65 64 2e  ht be discarded.
5e00: 20 20 44 6f 20 77 68 61 74 65 76 65 72 20 69 73    Do whatever is
5e10: 20 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67   the right thing
5e20: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 70 53 65 74  .** so that pSet
5e30: 20 6b 65 65 70 73 20 74 68 65 20 4e 5f 4f 52 5f   keeps the N_OR_
5e40: 43 4f 53 54 20 62 65 73 74 20 65 6e 74 72 69 65  COST best entrie
5e50: 73 20 73 65 65 6e 20 73 6f 20 66 61 72 2e 0a 2a  s seen so far..*
5e60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
5e70: 72 65 4f 72 49 6e 73 65 72 74 28 0a 20 20 57 68  reOrInsert(.  Wh
5e80: 65 72 65 4f 72 53 65 74 20 2a 70 53 65 74 2c 20  ereOrSet *pSet, 
5e90: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
5ea0: 65 4f 72 53 65 74 20 74 6f 20 62 65 20 75 70 64  eOrSet to be upd
5eb0: 61 74 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73  ated */.  Bitmas
5ec0: 6b 20 70 72 65 72 65 71 2c 20 20 20 20 20 20 20  k prereq,       
5ed0: 20 2f 2a 20 50 72 65 72 65 71 75 69 73 69 74 65   /* Prerequisite
5ee0: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74  s of the new ent
5ef0: 72 79 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  ry */.  WhereCos
5f00: 74 20 72 52 75 6e 2c 20 20 20 20 20 20 20 20 2f  t rRun,        /
5f10: 2a 20 52 75 6e 2d 63 6f 73 74 20 6f 66 20 74 68  * Run-cost of th
5f20: 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20  e new entry */. 
5f30: 20 57 68 65 72 65 43 6f 73 74 20 6e 4f 75 74 20   WhereCost nOut 
5f40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5f50: 72 20 6f 66 20 6f 75 74 70 75 74 73 20 66 6f 72  r of outputs for
5f60: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a   the new entry *
5f70: 2f 0a 29 7b 0a 20 20 75 31 36 20 69 3b 0a 20 20  /.){.  u16 i;.  
5f80: 57 68 65 72 65 4f 72 43 6f 73 74 20 2a 70 3b 0a  WhereOrCost *p;.
5f90: 20 20 66 6f 72 28 69 3d 70 53 65 74 2d 3e 6e 2c    for(i=pSet->n,
5fa0: 20 70 3d 70 53 65 74 2d 3e 61 3b 20 69 3e 30 3b   p=pSet->a; i>0;
5fb0: 20 69 2d 2d 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i--, p++){.    
5fc0: 69 66 28 20 72 52 75 6e 3c 3d 70 2d 3e 72 52 75  if( rRun<=p->rRu
5fd0: 6e 20 26 26 20 28 70 72 65 72 65 71 20 26 20 70  n && (prereq & p
5fe0: 2d 3e 70 72 65 72 65 71 29 3d 3d 70 72 65 72 65  ->prereq)==prere
5ff0: 71 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  q ){.      goto 
6000: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
6010: 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ne;.    }.    if
6020: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
6030: 26 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  && (p->prereq & 
6040: 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72  prereq)==p->prer
6050: 65 71 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  eq ){.      retu
6060: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
6070: 20 20 69 66 28 20 70 53 65 74 2d 3e 6e 3c 4e 5f    if( pSet->n<N_
6080: 4f 52 5f 43 4f 53 54 20 29 7b 0a 20 20 20 20 70  OR_COST ){.    p
6090: 20 3d 20 26 70 53 65 74 2d 3e 61 5b 70 53 65 74   = &pSet->a[pSet
60a0: 2d 3e 6e 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 6e  ->n++];.    p->n
60b0: 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d 65  Out = nOut;.  }e
60c0: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 70 53 65  lse{.    p = pSe
60d0: 74 2d 3e 61 3b 0a 20 20 20 20 66 6f 72 28 69 3d  t->a;.    for(i=
60e0: 31 3b 20 69 3c 70 53 65 74 2d 3e 6e 3b 20 69 2b  1; i<pSet->n; i+
60f0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
6100: 3e 72 52 75 6e 3e 70 53 65 74 2d 3e 61 5b 69 5d  >rRun>pSet->a[i]
6110: 2e 72 52 75 6e 20 29 20 70 20 3d 20 70 53 65 74  .rRun ) p = pSet
6120: 2d 3e 61 20 2b 20 69 3b 0a 20 20 20 20 7d 0a 20  ->a + i;.    }. 
6130: 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d     if( p->rRun<=
6140: 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  rRun ) return 0;
6150: 0a 20 20 7d 0a 77 68 65 72 65 4f 72 49 6e 73 65  .  }.whereOrInse
6160: 72 74 5f 64 6f 6e 65 3a 0a 20 20 70 2d 3e 70 72  rt_done:.  p->pr
6170: 65 72 65 71 20 3d 20 70 72 65 72 65 71 3b 0a 20  ereq = prereq;. 
6180: 20 70 2d 3e 72 52 75 6e 20 3d 20 72 52 75 6e 3b   p->rRun = rRun;
6190: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 75 74 3e 6e  .  if( p->nOut>n
61a0: 4f 75 74 20 29 20 70 2d 3e 6e 4f 75 74 20 3d 20  Out ) p->nOut = 
61b0: 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 31  nOut;.  return 1
61c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
61d0: 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63  alize a prealloc
61e0: 61 74 65 64 20 57 68 65 72 65 43 6c 61 75 73 65  ated WhereClause
61f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
6200: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
6210: 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68  ClauseInit(.  Wh
6220: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
6230: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
6240: 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20  ereClause to be 
6250: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
6260: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
6270: 66 6f 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fo        /* The
6280: 20 57 48 45 52 45 20 70 72 6f 63 65 73 73 69 6e   WHERE processin
6290: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a  g context */.){.
62a0: 20 20 70 57 43 2d 3e 70 57 49 6e 66 6f 20 3d 20    pWC->pWInfo = 
62b0: 70 57 49 6e 66 6f 3b 0a 20 20 70 57 43 2d 3e 70  pWInfo;.  pWC->p
62c0: 4f 75 74 65 72 20 3d 20 30 3b 0a 20 20 70 57 43  Outer = 0;.  pWC
62d0: 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  ->nTerm = 0;.  p
62e0: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61  WC->nSlot = Arra
62f0: 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74  ySize(pWC->aStat
6300: 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20  ic);.  pWC->a = 
6310: 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a  pWC->aStatic;.}.
6320: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
6330: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
6340: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
6350: 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73  Clear(WhereClaus
6360: 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  e*);../*.** Deal
6370: 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72  locate all memor
6380: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
6390: 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  h a WhereOrInfo 
63a0: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
63b0: 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49 6e  c void whereOrIn
63c0: 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  foDelete(sqlite3
63d0: 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e 66   *db, WhereOrInf
63e0: 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c  o *p){.  whereCl
63f0: 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63  auseClear(&p->wc
6400: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
6410: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
6420: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
6430: 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
6440: 61 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72  ated with a Wher
6450: 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  eAndInfo object.
6460: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6470: 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65  whereAndInfoDele
6480: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
6490: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29  WhereAndInfo *p)
64a0: 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  {.  whereClauseC
64b0: 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20  lear(&p->wc);.  
64c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
64d0: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  , p);.}../*.** D
64e0: 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72  eallocate a Wher
64f0: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
6500: 65 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61  e.  The WhereCla
6510: 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  use structure.**
6520: 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66   itself is not f
6530: 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  reed.  This rout
6540: 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65 72  ine is the inver
6550: 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73  se of whereClaus
6560: 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74  eInit()..*/.stat
6570: 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61  ic void whereCla
6580: 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c  useClear(WhereCl
6590: 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e  ause *pWC){.  in
65a0: 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  t i;.  WhereTerm
65b0: 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *a;.  sqlite3 *
65c0: 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  db = pWC->pWInfo
65d0: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
65e0: 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d  for(i=pWC->nTerm
65f0: 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e  -1, a=pWC->a; i>
6600: 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20  =0; i--, a++){. 
6610: 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67     if( a->wtFlag
6620: 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  s & TERM_DYNAMIC
6630: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6640: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
6650: 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  a->pExpr);.    }
6660: 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c  .    if( a->wtFl
6670: 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46  ags & TERM_ORINF
6680: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
6690: 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c  OrInfoDelete(db,
66a0: 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a   a->u.pOrInfo);.
66b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 2d      }else if( a-
66c0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
66d0: 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20  ANDINFO ){.     
66e0: 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c   whereAndInfoDel
66f0: 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e  ete(db, a->u.pAn
6700: 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  dInfo);.    }.  
6710: 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 61 21 3d  }.  if( pWC->a!=
6720: 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a  pWC->aStatic ){.
6730: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6740: 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20  e(db, pWC->a);. 
6750: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
6760: 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 57 68 65  a single new Whe
6770: 72 65 54 65 72 6d 20 65 6e 74 72 79 20 74 6f 20  reTerm entry to 
6780: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
6790: 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54  object pWC..** T
67a0: 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  he new WhereTerm
67b0: 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 73 74   object is const
67c0: 72 75 63 74 65 64 20 66 72 6f 6d 20 45 78 70 72  ructed from Expr
67d0: 20 70 20 61 6e 64 20 77 69 74 68 20 77 74 46 6c   p and with wtFl
67e0: 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ags..** The inde
67f0: 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f 66  x in pWC->a[] of
6800: 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   the new WhereTe
6810: 72 6d 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  rm is returned o
6820: 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20 30 20  n success..** 0 
6830: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
6840: 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  he new WhereTerm
6850: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 64   could not be ad
6860: 64 65 64 20 64 75 65 20 74 6f 20 61 20 6d 65 6d  ded due to a mem
6870: 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  ory.** allocatio
6880: 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6d 65  n error.  The me
6890: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
68a0: 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 62 65 20  failure will be 
68b0: 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a 20 74  recorded in.** t
68c0: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
68d0: 6c 65 64 20 66 6c 61 67 20 73 6f 20 74 68 61 74  led flag so that
68e0: 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 66 75   higher-level fu
68f0: 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64 65 74 65  nctions can dete
6900: 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ct it..**.** Thi
6910: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69  s routine will i
6920: 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
6930: 20 6f 66 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d   of the pWC->a[]
6940: 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73   array as necess
6950: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ary..**.** If th
6960: 65 20 77 74 46 6c 61 67 73 20 61 72 67 75 6d 65  e wtFlags argume
6970: 6e 74 20 69 6e 63 6c 75 64 65 73 20 54 45 52 4d  nt includes TERM
6980: 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72  _DYNAMIC, then r
6990: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
69a0: 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65   for freeing the
69b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 69 73   expression p is
69c0: 20 61 73 73 75 6d 65 64 20 62 79 20 74 68 65 20   assumed by the 
69d0: 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65  WhereClause obje
69e0: 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69 73 20  ct pWC..** This 
69f0: 69 73 20 74 72 75 65 20 65 76 65 6e 20 69 66 20  is true even if 
6a00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
6a10: 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ls to allocate a
6a20: 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 2e 0a   new WhereTerm..
6a30: 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20  **.** WARNING:  
6a40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
6a50: 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20 74 68  ht reallocate th
6a60: 65 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  e space used to 
6a70: 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65 54 65  store.** WhereTe
6a80: 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65  rms.  All pointe
6a90: 72 73 20 74 6f 20 57 68 65 72 65 54 65 72 6d 73  rs to WhereTerms
6aa0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c   should be inval
6ab0: 69 64 61 74 65 64 20 61 66 74 65 72 0a 2a 2a 20  idated after.** 
6ac0: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
6ad0: 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f 69 6e  tine.  Such poin
6ae0: 74 65 72 73 20 6d 61 79 20 62 65 20 72 65 69 6e  ters may be rein
6af0: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72 65 66  itialized by ref
6b00: 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20  erencing.** the 
6b10: 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a  pWC->a[] array..
6b20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
6b30: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
6b40: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
6b50: 2c 20 45 78 70 72 20 2a 70 2c 20 75 38 20 77 74  , Expr *p, u8 wt
6b60: 46 6c 61 67 73 29 7b 0a 20 20 57 68 65 72 65 54  Flags){.  WhereT
6b70: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
6b80: 74 20 69 64 78 3b 0a 20 20 74 65 73 74 63 61 73  t idx;.  testcas
6b90: 65 28 20 77 74 46 6c 61 67 73 20 26 20 54 45 52  e( wtFlags & TER
6ba0: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 69  M_VIRTUAL );.  i
6bb0: 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70  f( pWC->nTerm>=p
6bc0: 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20  WC->nSlot ){.   
6bd0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64   WhereTerm *pOld
6be0: 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73   = pWC->a;.    s
6bf0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43  qlite3 *db = pWC
6c00: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
6c10: 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61  ->db;.    pWC->a
6c20: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6c30: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
6c40: 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d  (pWC->a[0])*pWC-
6c50: 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20  >nSlot*2 );.    
6c60: 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b  if( pWC->a==0 ){
6c70: 0a 20 20 20 20 20 20 69 66 28 20 77 74 46 6c 61  .      if( wtFla
6c80: 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49  gs & TERM_DYNAMI
6c90: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  C ){.        sql
6ca0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
6cb0: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, p);.      }. 
6cc0: 20 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f       pWC->a = pO
6cd0: 6c 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ld;.      return
6ce0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65   0;.    }.    me
6cf0: 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c  mcpy(pWC->a, pOl
6d00: 64 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  d, sizeof(pWC->a
6d10: 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29  [0])*pWC->nTerm)
6d20: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d  ;.    if( pOld!=
6d30: 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a  pWC->aStatic ){.
6d40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
6d50: 72 65 65 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20  ree(db, pOld);. 
6d60: 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53     }.    pWC->nS
6d70: 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  lot = sqlite3DbM
6d80: 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 57  allocSize(db, pW
6d90: 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28 70 57 43  C->a)/sizeof(pWC
6da0: 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70  ->a[0]);.  }.  p
6db0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
6dc0: 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b  dx = pWC->nTerm+
6dd0: 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78  +];.  pTerm->pEx
6de0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
6df0: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a  SkipCollate(p);.
6e00: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
6e10: 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20 70 54   = wtFlags;.  pT
6e20: 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a  erm->pWC = pWC;.
6e30: 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74    pTerm->iParent
6e40: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
6e50: 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  idx;.}../*.** Th
6e60: 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74  is routine ident
6e70: 69 66 69 65 73 20 73 75 62 65 78 70 72 65 73 73  ifies subexpress
6e80: 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52  ions in the WHER
6e90: 45 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a  E clause where.*
6ea0: 2a 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73  * each subexpres
6eb0: 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
6ec0: 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65  d by the AND ope
6ed0: 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74  rator or some ot
6ee0: 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  her.** operator 
6ef0: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
6f00: 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20   op parameter.  
6f10: 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  The WhereClause 
6f20: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20  structure.** is 
6f30: 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e  filled with poin
6f40: 74 65 72 73 20 74 6f 20 73 75 62 65 78 70 72 65  ters to subexpre
6f50: 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61  ssions.  For exa
6f60: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57  mple:.**.**    W
6f70: 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27  HERE  a=='hello'
6f80: 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c   AND coalesce(b,
6f90: 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32  11)<10 AND (c+12
6fa0: 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a  !=d OR c==22).**
6fb0: 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
6fc0: 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f  ____/     \_____
6fd0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
6fe0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
6ff0: 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _/.**           
7000: 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20   slot[0]        
7010: 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20      slot[1]     
7020: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32            slot[2
7030: 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ].**.** The orig
7040: 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  inal WHERE claus
7050: 65 20 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e  e in pExpr is un
7060: 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68  altered.  All th
7070: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f  is routine.** do
7080: 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b  es is make slot[
7090: 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20  ] entries point 
70a0: 74 6f 20 73 75 62 73 74 72 75 63 74 75 72 65 20  to substructure 
70b0: 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a  within pExpr..**
70c0: 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69  .** In the previ
70d0: 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64  ous sentence and
70e0: 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c   in the diagram,
70f0: 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73   "slot[]" refers
7100: 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65   to.** the Where
7110: 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79  Clause.a[] array
7120: 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72  .  The slot[] ar
7130: 72 61 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65  ray grows as nee
7140: 64 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a  ded to contain.*
7150: 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * all terms of t
7160: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
7170: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7180: 77 68 65 72 65 53 70 6c 69 74 28 57 68 65 72 65  whereSplit(Where
7190: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70  Clause *pWC, Exp
71a0: 72 20 2a 70 45 78 70 72 2c 20 75 38 20 6f 70 29  r *pExpr, u8 op)
71b0: 7b 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20 6f 70  {.  pWC->op = op
71c0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
71d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
71e0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
71f0: 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
7200: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78  eInsert(pWC, pEx
7210: 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  pr, 0);.  }else{
7220: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
7230: 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  pWC, pExpr->pLef
7240: 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72  t, op);.    wher
7250: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
7260: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a  r->pRight, op);.
7270: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
7280: 74 69 61 6c 69 7a 65 20 61 20 57 68 65 72 65 4d  tialize a WhereM
7290: 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 0a 2a 2f  askSet object.*/
72a0: 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61 73  .#define initMas
72b0: 6b 53 65 74 28 50 29 20 20 28 50 29 2d 3e 6e 3d  kSet(P)  (P)->n=
72c0: 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0../*.** Return 
72d0: 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
72e0: 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
72f0: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
7300: 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72   0 if.** iCursor
7310: 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73   is not in the s
7320: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  et..*/.static Bi
7330: 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 57 68  tmask getMask(Wh
7340: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
7350: 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f  kSet, int iCurso
7360: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  r){.  int i;.  a
7370: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
7380: 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28  >n<=(int)sizeof(
7390: 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  Bitmask)*8 );.  
73a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b  for(i=0; i<pMask
73b0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
73c0: 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e    if( pMaskSet->
73d0: 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29  ix[i]==iCursor )
73e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4d  {.      return M
73f0: 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d  ASKBIT(i);.    }
7400: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
7410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
7420: 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20   a new mask for 
7430: 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a  cursor iCursor..
7440: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f  **.** There is o
7450: 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61  ne cursor per ta
7460: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
7470: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d  clause.  The num
7480: 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73  ber of.** tables
7490: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
74a0: 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
74b0: 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69  y a test early i
74c0: 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
74d0: 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75  WhereBegin() rou
74e0: 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f  tine.  So we kno
74f0: 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b  w that the pMask
7500: 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72  Set->ix[].** arr
7510: 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76  ay will never ov
7520: 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  erflow..*/.stati
7530: 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73  c void createMas
7540: 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  k(WhereMaskSet *
7550: 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43  pMaskSet, int iC
7560: 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74  ursor){.  assert
7570: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20  ( pMaskSet->n < 
7580: 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53  ArraySize(pMaskS
7590: 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61  et->ix) );.  pMa
75a0: 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53  skSet->ix[pMaskS
75b0: 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73  et->n++] = iCurs
75c0: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  or;.}../*.** The
75d0: 73 65 20 72 6f 75 74 69 6e 65 73 20 77 61 6c 6b  se routines walk
75e0: 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61   (recursively) a
75f0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
7600: 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 0a 2a  e and generate.*
7610: 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69  * a bitmask indi
7620: 63 61 74 69 6e 67 20 77 68 69 63 68 20 74 61 62  cating which tab
7630: 6c 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20  les are used in 
7640: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a  that expression.
7650: 2a 2a 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  ** tree..*/.stat
7660: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c  ic Bitmask exprL
7670: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 57 68  istTableUsage(Wh
7680: 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70  ereMaskSet*, Exp
7690: 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20  rList*);.static 
76a0: 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65  Bitmask exprSele
76b0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  ctTableUsage(Whe
76c0: 72 65 4d 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65  reMaskSet*, Sele
76d0: 63 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74  ct*);.static Bit
76e0: 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65 55 73  mask exprTableUs
76f0: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
7700: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
7710: 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20   *p){.  Bitmask 
7720: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20  mask = 0;.  if( 
7730: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
7740: 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
7750: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d  _COLUMN ){.    m
7760: 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  ask = getMask(pM
7770: 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c  askSet, p->iTabl
7780: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  e);.    return m
7790: 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20  ask;.  }.  mask 
77a0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
77b0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52  (pMaskSet, p->pR
77c0: 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d  ight);.  mask |=
77d0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
77e0: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65  pMaskSet, p->pLe
77f0: 66 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ft);.  if( ExprH
7800: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
7810: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
7820: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53     mask |= exprS
7830: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
7840: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70  pMaskSet, p->x.p
7850: 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65  Select);.  }else
7860: 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  {.    mask |= ex
7870: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
7880: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e  (pMaskSet, p->x.
7890: 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65  pList);.  }.  re
78a0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61  turn mask;.}.sta
78b0: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
78c0: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 57  ListTableUsage(W
78d0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
78e0: 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74 20  skSet, ExprList 
78f0: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
7900: 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  ;.  Bitmask mask
7910: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 0;.  if( pLis
7920: 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
7930: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
7940: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61  ; i++){.      ma
7950: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
7960: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
7970: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
7980: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
7990: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74  eturn mask;.}.st
79a0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
79b0: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
79c0: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  e(WhereMaskSet *
79d0: 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74  pMaskSet, Select
79e0: 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b   *pS){.  Bitmask
79f0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69   mask = 0;.  whi
7a00: 6c 65 28 20 70 53 20 29 7b 0a 20 20 20 20 53 72  le( pS ){.    Sr
7a10: 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 53  cList *pSrc = pS
7a20: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b  ->pSrc;.    mask
7a30: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
7a40: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7a50: 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20   pS->pEList);.  
7a60: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
7a70: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
7a80: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75  skSet, pS->pGrou
7a90: 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  pBy);.    mask |
7aa0: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
7ab0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
7ac0: 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  S->pOrderBy);.  
7ad0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
7ae0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
7af0: 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a  t, pS->pWhere);.
7b00: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
7b10: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
7b20: 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67  Set, pS->pHaving
7b30: 29 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59  );.    if( ALWAY
7b40: 53 28 70 53 72 63 21 3d 30 29 20 29 7b 0a 20 20  S(pSrc!=0) ){.  
7b50: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
7b60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
7b70: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
7b80: 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78        mask |= ex
7b90: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
7ba0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 72  ge(pMaskSet, pSr
7bb0: 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29  c->a[i].pSelect)
7bc0: 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 7c  ;.        mask |
7bd0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
7be0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d  (pMaskSet, pSrc-
7bf0: 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20  >a[i].pOn);.    
7c00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53    }.    }.    pS
7c10: 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20   = pS->pPrior;. 
7c20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
7c30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7c40: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
7c50: 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ven operator is 
7c60: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  one of the opera
7c70: 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20  tors that is.** 
7c80: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69  allowed for an i
7c90: 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45 20 63  ndexable WHERE c
7ca0: 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65  lause term.  The
7cb0: 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f   allowed operato
7cc0: 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22  rs are.** "=", "
7cd0: 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22  <", ">", "<=", "
7ce0: 3e 3d 22 2c 20 22 49 4e 22 2c 20 61 6e 64 20 22  >=", "IN", and "
7cf0: 49 53 20 4e 55 4c 4c 22 0a 2a 2f 0a 73 74 61 74  IS NULL".*/.stat
7d00: 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70  ic int allowedOp
7d10: 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65  (int op){.  asse
7d20: 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20  rt( TK_GT>TK_EQ 
7d30: 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29  && TK_GT<TK_GE )
7d40: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c  ;.  assert( TK_L
7d50: 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54  T>TK_EQ && TK_LT
7d60: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
7d70: 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20  rt( TK_LE>TK_EQ 
7d80: 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29  && TK_LE<TK_GE )
7d90: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47  ;.  assert( TK_G
7da0: 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20  E==TK_EQ+4 );.  
7db0: 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e  return op==TK_IN
7dc0: 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26   || (op>=TK_EQ &
7dd0: 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20  & op<=TK_GE) || 
7de0: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d  op==TK_ISNULL;.}
7df0: 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f  ../*.** Swap two
7e00: 20 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65   objects of type
7e10: 20 54 59 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e   TYPE..*/.#defin
7e20: 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29  e SWAP(TYPE,A,B)
7e30: 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b   {TYPE t=A; A=B;
7e40: 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   B=t;}../*.** Co
7e50: 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73  mmute a comparis
7e60: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78  on operator.  Ex
7e70: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
7e80: 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a   form "X op Y".*
7e90: 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  * are converted 
7ea0: 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a  into "Y op X"..*
7eb0: 2a 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72 69 67  *.** If left/rig
7ec0: 68 74 20 70 72 65 63 65 64 65 6e 63 65 20 72 75  ht precedence ru
7ed0: 6c 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c  les come into pl
7ee0: 61 79 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e  ay when determin
7ef0: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61  ing the.** colla
7f00: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 74  ting sequence, t
7f10: 68 65 6e 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  hen COLLATE oper
7f20: 61 74 6f 72 73 20 61 72 65 20 61 64 6a 75 73 74  ators are adjust
7f30: 65 64 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20  ed to ensure.** 
7f40: 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69  that the collati
7f50: 6e 67 20 73 65 71 75 65 6e 63 65 20 64 6f 65 73  ng sequence does
7f60: 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 20 46 6f   not change.  Fo
7f70: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59  r example:.** "Y
7f80: 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20   collate NOCASE 
7f90: 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20 22 58  op X" becomes "X
7fa0: 20 6f 70 20 59 22 20 62 65 63 61 75 73 65 20 61   op Y" because a
7fb0: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
7fc0: 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20  uence on.** the 
7fd0: 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f  left hand side o
7fe0: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
7ff0: 76 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c  verrides any col
8000: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
8010: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
8020: 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74  the right. For t
8030: 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74  he same reason t
8040: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
8050: 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d  ag.** is not com
8060: 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  muted..*/.static
8070: 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74   void exprCommut
8080: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
8090: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
80a0: 20 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20   u16 expRight = 
80b0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
80c0: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
80d0: 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65  te);.  u16 expLe
80e0: 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65  ft = (pExpr->pLe
80f0: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  ft->flags & EP_C
8100: 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72  ollate);.  asser
8110: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78  t( allowedOp(pEx
8120: 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72  pr->op) && pExpr
8130: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op!=TK_IN );. 
8140: 20 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d 65   if( expRight==e
8150: 78 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a  xpLeft ){.    /*
8160: 20 45 69 74 68 65 72 20 58 20 61 6e 64 20 59 20   Either X and Y 
8170: 62 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41 54  both have COLLAT
8180: 45 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e 65  E operator or ne
8190: 69 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20  ither do */.    
81a0: 69 66 28 20 65 78 70 52 69 67 68 74 20 29 7b 0a  if( expRight ){.
81b0: 20 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58 20        /* Both X 
81c0: 61 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c 41  and Y have COLLA
81d0: 54 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d  TE operators.  M
81e0: 61 6b 65 20 73 75 72 65 20 58 20 69 73 20 61 6c  ake sure X is al
81f0: 77 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ways.      ** us
8200: 65 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ed by clearing t
8210: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
8220: 61 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20  ag from Y. */.  
8230: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
8240: 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f  t->flags &= ~EP_
8250: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c  Collate;.    }el
8260: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  se if( sqlite3Ex
8270: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
8280: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  , pExpr->pLeft)!
8290: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  =0 ){.      /* N
82a0: 65 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20 68  either X nor Y h
82b0: 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  ave COLLATE oper
82c0: 61 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61 73  ators, but X has
82d0: 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20   a non-default. 
82e0: 20 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e       ** collatin
82f0: 67 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f 20  g sequence.  So 
8300: 61 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  add the EP_Colla
8310: 74 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74  te marker on X t
8320: 6f 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  o cause.      **
8330: 20 69 74 20 74 6f 20 62 65 20 73 65 61 72 63 68   it to be search
8340: 65 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20  ed first. */.   
8350: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d     pExpr->pLeft-
8360: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c  >flags |= EP_Col
8370: 6c 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  late;.    }.  }.
8380: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78    SWAP(Expr*,pEx
8390: 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72  pr->pRight,pExpr
83a0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
83b0: 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54  pExpr->op>=TK_GT
83c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
83d0: 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
83e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
83f0: 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a  _GE==TK_LE+2 );.
8400: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
8410: 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61  T>TK_EQ );.    a
8420: 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f  ssert( TK_GT<TK_
8430: 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
8440: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
8450: 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c  GT && pExpr->op<
8460: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45  =TK_GE );.    pE
8470: 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70  xpr->op = ((pExp
8480: 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b  r->op-TK_GT)^2)+
8490: 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_GT;.  }.}../*
84a0: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72  .** Translate fr
84b0: 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f  om TK_xx operato
84c0: 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61  r to WO_xx bitma
84d0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  sk..*/.static u1
84e0: 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69  6 operatorMask(i
84f0: 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b  nt op){.  u16 c;
8500: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
8510: 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66  edOp(op) );.  if
8520: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
8530: 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20     c = WO_IN;.  
8540: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
8550: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63  _ISNULL ){.    c
8560: 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20   = WO_ISNULL;.  
8570: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
8580: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
8590: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
85a0: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
85b0: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
85c0: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
85d0: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
85e0: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
85f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
8600: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
8610: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
8620: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
8630: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
8640: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
8650: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
8660: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
8670: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
8680: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
8690: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
86a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
86b0: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
86c0: 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  GE );.  return c
86d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
86e0: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 57  ce to the next W
86f0: 68 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d 61  hereTerm that ma
8700: 74 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67 20  tches according 
8710: 74 6f 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  to the criteria.
8720: 2a 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20 77  ** established w
8730: 68 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f 62  hen the pScan ob
8740: 6a 65 63 74 20 77 61 73 20 69 6e 69 74 69 61 6c  ject was initial
8750: 69 7a 65 64 20 62 79 20 77 68 65 72 65 53 63 61  ized by whereSca
8760: 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75  nInit()..** Retu
8770: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  rn NULL if there
8780: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74   are no more mat
8790: 63 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d 73  ching WhereTerms
87a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
87b0: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
87c0: 4e 65 78 74 28 57 68 65 72 65 53 63 61 6e 20 2a  Next(WhereScan *
87d0: 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43  pScan){.  int iC
87e0: 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ur;            /
87f0: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 6e 20  * The cursor on 
8800: 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74  the LHS of the t
8810: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  erm */.  int iCo
8820: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
8830: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   The column on t
8840: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65  he LHS of the te
8850: 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50 4b 20  rm.  -1 for IPK 
8860: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b 20 20  */.  Expr *pX;  
8870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
8880: 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67  expression being
8890: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 57 68 65   tested */.  Whe
88a0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
88b0: 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66    /* Shorthand f
88c0: 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f  or pScan->pWC */
88d0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
88e0: 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74  erm;    /* The t
88f0: 65 72 6d 20 62 65 69 6e 67 20 74 65 73 74 65 64  erm being tested
8900: 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53   */.  int k = pS
8910: 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68  can->k;    /* Wh
8920: 65 72 65 20 74 6f 20 73 74 61 72 74 20 73 63 61  ere to start sca
8930: 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77 68 69 6c  nning */..  whil
8940: 65 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  e( pScan->iEquiv
8950: 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  <=pScan->nEquiv 
8960: 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53  ){.    iCur = pS
8970: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61  can->aEquiv[pSca
8980: 6e 2d 3e 69 45 71 75 69 76 2d 32 5d 3b 0a 20 20  n->iEquiv-2];.  
8990: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53 63 61    iColumn = pSca
89a0: 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d  n->aEquiv[pScan-
89b0: 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20  >iEquiv-1];.    
89c0: 77 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53  while( (pWC = pS
89d0: 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a  can->pWC)!=0 ){.
89e0: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
89f0: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
8a00: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
8a10: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
8a20: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
8a30: 72 73 6f 72 3d 3d 69 43 75 72 20 26 26 20 70 54  rsor==iCur && pT
8a40: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
8a50: 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n==iColumn ){.  
8a60: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
8a70: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8a80: 57 4f 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20  WO_EQUIV)!=0.   
8a90: 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e          && pScan
8aa0: 2d 3e 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69  ->nEquiv<ArraySi
8ab0: 7a 65 28 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  ze(pScan->aEquiv
8ac0: 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
8ad0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
8ae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 58  ;.            pX
8af0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
8b00: 69 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d  ipCollate(pTerm-
8b10: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
8b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
8b30: 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
8b40: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
8b50: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
8b60: 3c 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20  <pScan->nEquiv; 
8b70: 6a 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20  j+=2){.         
8b80: 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e       if( pScan->
8b90: 61 45 71 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69  aEquiv[j]==pX->i
8ba0: 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  Table.          
8bb0: 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61       && pScan->a
8bc0: 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e  Equiv[j+1]==pX->
8bd0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
8bf0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
8c00: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
8c10: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
8c20: 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75  ( j==pScan->nEqu
8c30: 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  iv ){.          
8c40: 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69      pScan->aEqui
8c50: 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c  v[j] = pX->iTabl
8c60: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
8c70: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a   pScan->aEquiv[j
8c80: 2b 31 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d  +1] = pX->iColum
8c90: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
8ca0: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 2b   pScan->nEquiv +
8cb0: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 2;.           
8cc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
8cd0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
8ce0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8cf0: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21   pScan->opMask)!
8d00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8d10: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20    /* Verify the 
8d20: 61 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c  affinity and col
8d30: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
8d40: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
8d50: 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e       if( pScan->
8d60: 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54  zCollName && (pT
8d70: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8d80: 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29   WO_ISNULL)==0 )
8d90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8da0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61                Pa
8dc0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
8dd0: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  C->pWInfo->pPars
8de0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
8df0: 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pX = pTerm->pEx
8e00: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
8e10: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
8e20: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58  dexAffinityOk(pX
8e30: 2c 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29  , pScan->idxaff)
8e40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8e50: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
8e80: 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  rt(pX->pLeft);. 
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
8ea0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
8eb0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
8ec0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ef0: 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70             pX->p
8f00: 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
8f10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
8f20: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
8f30: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
8f40: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
8f60: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
8f70: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53  pColl->zName, pS
8f80: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20  can->zCollName) 
8f90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8fa0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8fb0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8fc0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8fd0: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
8fe0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8ff0: 4f 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 20 20  O_EQ)!=0.       
9000: 20 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 70        && (pX = p
9010: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
9020: 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ght)->op==TK_COL
9030: 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  UMN.            
9040: 20 26 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d   && pX->iTable==
9050: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d  pScan->aEquiv[0]
9060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
9070: 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53   pX->iColumn==pS
9080: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20  can->aEquiv[1]. 
9090: 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
90b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
90c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
90d0: 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a  pScan->k = k+1;.
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
90f0: 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20  rn pTerm;.      
9100: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
9110: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
9120: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e  can->pWC = pScan
9130: 2d 3e 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20  ->pWC->pOuter;. 
9140: 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20       k = 0;.    
9150: 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43  }.    pScan->pWC
9160: 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57   = pScan->pOrigW
9170: 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20  C;.    k = 0;.  
9180: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20    pScan->iEquiv 
9190: 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75  += 2;.  }.  retu
91a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
91b0: 6e 69 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52  nitialize a WHER
91c0: 45 20 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72  E clause scanner
91d0: 20 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e   object.  Return
91e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
91f0: 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68  e.** first match
9200: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
9210: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
9220: 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  atches..**.** Th
9230: 65 20 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62  e scanner will b
9240: 65 20 73 65 61 72 63 68 69 6e 67 20 74 68 65 20  e searching the 
9250: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 57 43  WHERE clause pWC
9260: 2e 20 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a  .  It will look.
9270: 2a 2a 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20  ** for terms of 
9280: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
9290: 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 58   <expr>" where X
92a0: 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75   is column iColu
92b0: 6d 6e 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69  mn of table.** i
92c0: 43 75 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d  Cur.  The <op> m
92d0: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68  ust be one of th
92e0: 65 20 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63  e operators desc
92f0: 72 69 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e  ribed by opMask.
9300: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
9310: 61 72 63 68 20 69 73 20 66 6f 72 20 58 20 61 6e  arch is for X an
9320: 64 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  d the WHERE clau
9330: 73 65 20 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d  se contains term
9340: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d  s of the.** form
9350: 20 58 3d 59 20 74 68 65 6e 20 74 68 69 73 20 72   X=Y then this r
9360: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73  outine might als
9370: 6f 20 72 65 74 75 72 6e 20 74 65 72 6d 73 20 6f  o return terms o
9380: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59  f the form.** "Y
9390: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20   <op> <expr>".  
93a0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  The number of le
93b0: 76 65 6c 73 20 6f 66 20 74 72 61 6e 73 69 74 69  vels of transiti
93c0: 76 69 74 79 20 69 73 20 6c 69 6d 69 74 65 64 2c  vity is limited,
93d0: 0a 2a 2a 20 62 75 74 20 69 73 20 65 6e 6f 75 67  .** but is enoug
93e0: 68 20 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74  h to handle most
93f0: 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72   commonly occurr
9400: 69 6e 67 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ing SQL statemen
9410: 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69  ts..**.** If X i
9420: 73 20 6e 6f 74 20 74 68 65 20 49 4e 54 45 47 45  s not the INTEGE
9430: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 68  R PRIMARY KEY th
9440: 65 6e 20 58 20 6d 75 73 74 20 62 65 20 63 6f 6d  en X must be com
9450: 70 61 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20  patible with.** 
9460: 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73  index pIdx..*/.s
9470: 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20  tatic WhereTerm 
9480: 2a 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 0a  *whereScanInit(.
9490: 20 20 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63    WhereScan *pSc
94a0: 61 6e 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  an,       /* The
94b0: 20 57 68 65 72 65 53 63 61 6e 20 6f 62 6a 65 63   WhereScan objec
94c0: 74 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69  t being initiali
94d0: 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  zed */.  WhereCl
94e0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
94f0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
9500: 61 75 73 65 20 74 6f 20 62 65 20 73 63 61 6e 6e  ause to be scann
9510: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
9520: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9530: 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61  /* Cursor to sca
9540: 6e 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  n for */.  int i
9550: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
9560: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20     /* Column to 
9570: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33  scan for */.  u3
9580: 32 20 6f 70 4d 61 73 6b 2c 20 20 20 20 20 20 20  2 opMask,       
9590: 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f        /* Operato
95a0: 72 28 73 29 20 74 6f 20 73 63 61 6e 20 66 6f 72  r(s) to scan for
95b0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
95c0: 78 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x             /*
95d0: 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   Must be compati
95e0: 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e  ble with this in
95f0: 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  dex */.){.  int 
9600: 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28  j;..  /* memset(
9610: 70 53 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66  pScan, 0, sizeof
9620: 28 2a 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20  (*pScan)); */.  
9630: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d  pScan->pOrigWC =
9640: 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70   pWC;.  pScan->p
9650: 57 43 20 3d 20 70 57 43 3b 0a 20 20 69 66 28 20  WC = pWC;.  if( 
9660: 70 49 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e  pIdx && iColumn>
9670: 3d 30 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d  =0 ){.    pScan-
9680: 3e 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e  >idxaff = pIdx->
9690: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
96a0: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
96b0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64      for(j=0; pId
96c0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d  x->aiColumn[j]!=
96d0: 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  iColumn; j++){. 
96e0: 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a       if( NEVER(j
96f0: 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  >=pIdx->nColumn)
9700: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
9710: 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43   }.    pScan->zC
9720: 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e  ollName = pIdx->
9730: 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c  azColl[j];.  }el
9740: 73 65 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69  se{.    pScan->i
9750: 64 78 61 66 66 20 3d 20 30 3b 0a 20 20 20 20 70  dxaff = 0;.    p
9760: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
9770: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e  = 0;.  }.  pScan
9780: 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73  ->opMask = opMas
9790: 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20  k;.  pScan->k = 
97a0: 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75  0;.  pScan->aEqu
97b0: 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20  iv[0] = iCur;.  
97c0: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d  pScan->aEquiv[1]
97d0: 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53   = iColumn;.  pS
97e0: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 32 3b  can->nEquiv = 2;
97f0: 0a 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  .  pScan->iEquiv
9800: 20 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 77   = 2;.  return w
9810: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63  hereScanNext(pSc
9820: 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  an);.}../*.** Se
9830: 61 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20  arch for a term 
9840: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
9850: 75 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74  use that is of t
9860: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
9870: 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65  <expr>".** where
9880: 20 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63   X is a referenc
9890: 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e  e to the iColumn
98a0: 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 61   of table iCur a
98b0: 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  nd <op> is one o
98c0: 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f  f.** the WO_xx o
98d0: 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70  perator codes sp
98e0: 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 6f  ecified by the o
98f0: 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20  p parameter..** 
9900: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
9910: 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52   to the term.  R
9920: 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66  eturn 0 if not f
9930: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ound..**.** The 
9940: 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69  term returned mi
9950: 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20  ght by Y=<expr> 
9960: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74  if there is anot
9970: 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  her constraint i
9980: 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
9990: 6c 61 75 73 65 20 74 68 61 74 20 73 70 65 63 69  lause that speci
99a0: 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20  fies that X=Y.  
99b0: 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61  Any such constra
99c0: 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  ints will be.** 
99d0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
99e0: 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69  e WO_EQUIV bit i
99f0: 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70  n the pTerm->eOp
9a00: 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54  erator field.  T
9a10: 68 65 0a 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61  he.** aEquiv[] a
9a20: 72 72 61 79 20 68 6f 6c 64 73 20 58 20 61 6e 64  rray holds X and
9a30: 20 61 6c 6c 20 69 74 73 20 65 71 75 69 76 61 6c   all its equival
9a40: 65 6e 74 73 2c 20 77 69 74 68 20 65 61 63 68 20  ents, with each 
9a50: 53 51 4c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  SQL variable.** 
9a60: 74 61 6b 69 6e 67 20 75 70 20 74 77 6f 20 73 6c  taking up two sl
9a70: 6f 74 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e  ots in aEquiv[].
9a80: 20 20 54 68 65 20 66 69 72 73 74 20 73 6c 6f 74    The first slot
9a90: 20 69 73 20 66 6f 72 20 74 68 65 20 63 75 72 73   is for the curs
9aa0: 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64  or number.** and
9ab0: 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 66   the second is f
9ac0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  or the column nu
9ad0: 6d 62 65 72 2e 20 20 54 68 65 72 65 20 61 72 65  mber.  There are
9ae0: 20 32 32 20 73 6c 6f 74 73 20 69 6e 20 61 45 71   22 slots in aEq
9af0: 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74  uiv[].** so that
9b00: 20 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f   means we can lo
9b10: 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70  ok for X plus up
9b20: 20 74 6f 20 31 30 20 6f 74 68 65 72 20 65 71 75   to 10 other equ
9b30: 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a  ivalent values..
9b40: 2a 2a 20 48 65 6e 63 65 20 61 20 73 65 61 72 63  ** Hence a searc
9b50: 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74  h for X will ret
9b60: 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d  urn <expr> if X=
9b70: 41 31 20 61 6e 64 20 41 31 3d 41 32 20 61 6e 64  A1 and A1=A2 and
9b80: 20 41 32 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e   A2=A3.** and ..
9b90: 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64  . and A9=A10 and
9ba0: 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a   A10=<expr>..**.
9bb0: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
9bc0: 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69  multiple terms i
9bd0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
9be0: 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  se of the form "
9bf0: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
9c00: 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74  * then try for t
9c10: 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64  he one with no d
9c20: 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c  ependencies on <
9c30: 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72  expr> - in other
9c40: 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20   words where.** 
9c50: 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73  <expr> is a cons
9c60: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
9c70: 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f  of some kind.  O
9c80: 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69  nly return entri
9c90: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72  es of.** the for
9ca0: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
9cb0: 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re Y is a column
9cc0: 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   in another tabl
9cd0: 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66  e if no terms of
9ce0: 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20  .** the form "X 
9cf0: 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72  <op> <const-expr
9d00: 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e  >" exist.   If n
9d10: 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61 20 63  o terms with a c
9d20: 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65  onstant RHS.** e
9d30: 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74  xist, try to ret
9d40: 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20  urn a term that 
9d50: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f  does not use WO_
9d60: 45 51 55 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63  EQUIV..*/.static
9d70: 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64   WhereTerm *find
9d80: 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61  Term(.  WhereCla
9d90: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a  use *pWC,     /*
9da0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
9db0: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
9dc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
9de0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
9df0: 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  LHS */.  int iCo
9e00: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  lumn,          /
9e10: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
9e20: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d  of LHS */.  Bitm
9e30: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
9e40: 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f    /* RHS must no
9e50: 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74  t overlap with t
9e60: 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33  his mask */.  u3
9e70: 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  2 op,           
9e80: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57      /* Mask of W
9e90: 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73 63  O_xx values desc
9ea0: 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20  ribing operator 
9eb0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
9ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
9ed0: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
9ee0: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
9ef0: 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  , if not NULL */
9f00: 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
9f10: 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20  *pResult = 0;.  
9f20: 57 68 65 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20  WhereTerm *p;.  
9f30: 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a  WhereScan scan;.
9f40: 0a 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e  .  p = whereScan
9f50: 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 57 43 2c  Init(&scan, pWC,
9f60: 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20   iCur, iColumn, 
9f70: 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20 77 68 69  op, pIdx);.  whi
9f80: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
9f90: 20 28 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74   (p->prereqRight
9fa0: 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20   & notReady)==0 
9fb0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
9fc0: 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26  prereqRight==0 &
9fd0: 26 20 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26  & (p->eOperator&
9fe0: 57 4f 5f 45 51 29 21 3d 30 20 29 7b 0a 20 20 20  WO_EQ)!=0 ){.   
9ff0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20       return p;. 
a000: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a010: 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52   pResult==0 ) pR
a020: 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d  esult = p;.    }
a030: 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65 53 63  .    p = whereSc
a040: 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20  anNext(&scan);. 
a050: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73   }.  return pRes
a060: 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  ult;.}../* Forwa
a070: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
a080: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
a090: 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a  Analyze(SrcList*
a0a0: 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20  , WhereClause*, 
a0b0: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  int);../*.** Cal
a0c0: 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e  l exprAnalyze on
a0d0: 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20   all terms in a 
a0e0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a  WHERE clause.  .
a0f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
a100: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20  xprAnalyzeAll(. 
a110: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
a120: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65  st,       /* the
a130: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
a140: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
a150: 57 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  WC         /* th
a160: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
a170: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
a180: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
a190: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  or(i=pWC->nTerm-
a1a0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
a1b0: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
a1c0: 54 61 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29  TabList, pWC, i)
a1d0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
a1e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
a1f0: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f  E_OPTIMIZATION./
a200: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
a210: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  e if the given e
a220: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c  xpression is a L
a230: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
a240: 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e  ator that.** can
a250: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73   be optimized us
a260: 69 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63  ing inequality c
a270: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74  onstraints.  Ret
a280: 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
a290: 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73  s.** so and fals
a2a0: 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  e if not..**.** 
a2b0: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  In order for the
a2c0: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
a2d0: 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65  optimizible, the
a2e0: 20 52 48 53 20 6d 75 73 74 20 62 65 20 61 20 73   RHS must be a s
a2f0: 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c  tring.** literal
a300: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62   that does not b
a310: 65 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64  egin with a wild
a320: 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  card.  .*/.stati
a330: 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c  c int isLikeOrGl
a340: 6f 62 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ob(.  Parse *pPa
a350: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
a360: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
a370: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
a380: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
a390: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
a3a0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
a3b0: 0a 20 20 45 78 70 72 20 2a 2a 70 70 50 72 65 66  .  Expr **ppPref
a3c0: 69 78 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ix,  /* Pointer 
a3d0: 74 6f 20 54 4b 5f 53 54 52 49 4e 47 20 65 78 70  to TK_STRING exp
a3e0: 72 65 73 73 69 6f 6e 20 77 69 74 68 20 70 61 74  ression with pat
a3f0: 74 65 72 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20  tern prefix */. 
a400: 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74   int *pisComplet
a410: 65 2c 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68  e, /* True if th
a420: 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20  e only wildcard 
a430: 69 73 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74  is % in the last
a440: 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20   character */.  
a450: 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20  int *pnoCase    
a460: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70    /* True if upp
a470: 65 72 63 61 73 65 20 69 73 20 65 71 75 69 76 61  ercase is equiva
a480: 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73  lent to lowercas
a490: 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
a4a0: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20  char *z = 0;    
a4b0: 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f       /* String o
a4c0: 6e 20 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70  n RHS of LIKE op
a4d0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72  erator */.  Expr
a4e0: 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74   *pRight, *pLeft
a4f0: 3b 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20  ;      /* Right 
a500: 61 6e 64 20 6c 65 66 74 20 73 69 7a 65 20 6f 66  and left size of
a510: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
a520: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
a530: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
a540: 2a 20 4c 69 73 74 20 6f 66 20 6f 70 65 72 61 6e  * List of operan
a550: 64 73 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f  ds to the LIKE o
a560: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
a570: 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   c;             
a580: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63          /* One c
a590: 68 61 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20  haracter in z[] 
a5a0: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20  */.  int cnt;   
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e  /* Number of non
a5d0: 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66 69 78  -wildcard prefix
a5e0: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
a5f0: 20 63 68 61 72 20 77 63 5b 33 5d 3b 20 20 20 20   char wc[3];    
a600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
a610: 69 6c 64 63 61 72 64 20 63 68 61 72 61 63 74 65  ildcard characte
a620: 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rs */.  sqlite3 
a630: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
a640: 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
a650: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73  onnection */.  s
a660: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
a670: 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70  al = 0;.  int op
a680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a690: 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f       /* Opcode o
a6a0: 66 20 70 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69  f pRight */..  i
a6b0: 66 28 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b  f( !sqlite3IsLik
a6c0: 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45  eFunction(db, pE
a6d0: 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63  xpr, pnoCase, wc
a6e0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
a6f0: 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  0;.  }.#ifdef SQ
a700: 4c 49 54 45 5f 45 42 43 44 49 43 0a 20 20 69 66  LITE_EBCDIC.  if
a710: 28 20 2a 70 6e 6f 43 61 73 65 20 29 20 72 65 74  ( *pnoCase ) ret
a720: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  urn 0;.#endif.  
a730: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
a740: 2e 70 4c 69 73 74 3b 0a 20 20 70 4c 65 66 74 20  .pList;.  pLeft 
a750: 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  = pList->a[1].pE
a760: 78 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74  xpr;.  if( pLeft
a770: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
a780: 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78  .   || sqlite3Ex
a790: 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74  prAffinity(pLeft
a7a0: 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  )!=SQLITE_AFF_TE
a7b0: 58 54 20 0a 20 20 20 7c 7c 20 49 73 56 69 72 74  XT .   || IsVirt
a7c0: 75 61 6c 28 70 4c 65 66 74 2d 3e 70 54 61 62 29  ual(pLeft->pTab)
a7d0: 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50  .  ){.    /* IMP
a7e0: 3a 20 52 2d 30 32 30 36 35 2d 34 39 34 36 35 20  : R-02065-49465 
a7f0: 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69  The left-hand si
a800: 64 65 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f  de of the LIKE o
a810: 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  r GLOB operator 
a820: 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74  must.    ** be t
a830: 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e  he name of an in
a840: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74  dexed column wit
a850: 68 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e  h TEXT affinity.
a860: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
a870: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a880: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pLeft->iColumn!=
a890: 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65 63 61 75  (-1) ); /* Becau
a8a0: 73 65 20 49 50 4b 20 6e 65 76 65 72 20 68 61 73  se IPK never has
a8b0: 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20   AFF_TEXT */..  
a8c0: 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e  pRight = pList->
a8d0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 6f 70  a[0].pExpr;.  op
a8e0: 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20   = pRight->op;. 
a8f0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
a900: 53 54 45 52 20 29 7b 0a 20 20 20 20 6f 70 20 3d  STER ){.    op =
a910: 20 70 52 69 67 68 74 2d 3e 6f 70 32 3b 0a 20 20   pRight->op2;.  
a920: 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56  }.  if( op==TK_V
a930: 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 56  ARIABLE ){.    V
a940: 64 62 65 20 2a 70 52 65 70 72 65 70 61 72 65 20  dbe *pReprepare 
a950: 3d 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65  = pParse->pRepre
a960: 70 61 72 65 3b 0a 20 20 20 20 69 6e 74 20 69 43  pare;.    int iC
a970: 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f  ol = pRight->iCo
a980: 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d  lumn;.    pVal =
a990: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42   sqlite3VdbeGetB
a9a0: 6f 75 6e 64 56 61 6c 75 65 28 70 52 65 70 72 65  oundValue(pRepre
a9b0: 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49  pare, iCol, SQLI
a9c0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20  TE_AFF_NONE);.  
a9d0: 20 20 69 66 28 20 70 56 61 6c 20 26 26 20 73 71    if( pVal && sq
a9e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
a9f0: 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54  (pVal)==SQLITE_T
aa00: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  EXT ){.      z =
aa10: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
aa20: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
aa30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
aa40: 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
aa50: 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  sk(pParse->pVdbe
aa60: 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73  , iCol);.    ass
aa70: 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d  ert( pRight->op=
aa80: 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20  =TK_VARIABLE || 
aa90: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52  pRight->op==TK_R
aaa0: 45 47 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c  EGISTER );.  }el
aab0: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54  se if( op==TK_ST
aac0: 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20  RING ){.    z = 
aad0: 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  pRight->u.zToken
aae0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b  ;.  }.  if( z ){
aaf0: 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20  .    cnt = 0;.  
ab00: 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e    while( (c=z[cn
ab10: 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b  t])!=0 && c!=wc[
ab20: 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26  0] && c!=wc[1] &
ab30: 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20  & c!=wc[2] ){.  
ab40: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d      cnt++;.    }
ab50: 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20  .    if( cnt!=0 
ab60: 26 26 20 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e  && 255!=(u8)z[cn
ab70: 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20 45 78  t-1] ){.      Ex
ab80: 70 72 20 2a 70 50 72 65 66 69 78 3b 0a 20 20 20  pr *pPrefix;.   
ab90: 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20     *pisComplete 
aba0: 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b  = c==wc[0] && z[
abb0: 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20  cnt+1]==0;.     
abc0: 20 70 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74   pPrefix = sqlit
abd0: 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54  e3Expr(db, TK_ST
abe0: 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20  RING, z);.      
abf0: 69 66 28 20 70 50 72 65 66 69 78 20 29 20 70 50  if( pPrefix ) pP
ac00: 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  refix->u.zToken[
ac10: 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  cnt] = 0;.      
ac20: 2a 70 70 50 72 65 66 69 78 20 3d 20 70 50 72 65  *ppPrefix = pPre
ac30: 66 69 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  fix;.      if( o
ac40: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  p==TK_VARIABLE )
ac50: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a  {.        Vdbe *
ac60: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
ac70: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
ac80: 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
ac90: 28 76 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c  (v, pRight->iCol
aca0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  umn);.        if
acb0: 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26  ( *pisComplete &
acc0: 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  & pRight->u.zTok
acd0: 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  en[1] ){.       
ace0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73     /* If the rhs
acf0: 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70   of the LIKE exp
ad00: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72  ression is a var
ad10: 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63  iable, and the c
ad20: 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20  urrent.         
ad30: 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65   ** value of the
ad40: 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20   variable means 
ad50: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
ad60: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c   to invoke the L
ad70: 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  IKE.          **
ad80: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20   function, then 
ad90: 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77  no OP_Variable w
ada0: 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20  ill be added to 
adb0: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20  the program..   
adc0: 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63         ** This c
add0: 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66  auses problems f
ade0: 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  or the sqlite3_b
adf0: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
ae00: 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a  me().          *
ae10: 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72  * API. To workar
ae20: 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61  ound them, add a
ae30: 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62   dummy OP_Variab
ae40: 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20  le here..       
ae50: 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20     */ .         
ae60: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
ae70: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
ae80: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  se);.          s
ae90: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
aea0: 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 52 69  rget(pParse, pRi
aeb0: 67 68 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ght, r1);.      
aec0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
aed0: 68 61 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74  hangeP3(v, sqlit
aee0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
aef0: 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20  r(v)-1, 0);.    
af00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
af10: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
af20: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
af30: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
af40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20  else{.      z = 
af50: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
af60: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
af70: 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (pVal);.  return
af80: 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69   (z!=0);.}.#endi
af90: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
afa0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
afb0: 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ON */...#ifndef 
afc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
afd0: 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43  UALTABLE./*.** C
afe0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
aff0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
b000: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
b010: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  rm.**.**        
b020: 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78   column MATCH ex
b030: 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69  pr.**.** If it i
b040: 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52  s then return TR
b050: 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74  UE.  If not, ret
b060: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74  urn FALSE..*/.st
b070: 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68  atic int isMatch
b080: 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72  OfColumn(.  Expr
b090: 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20   *pExpr      /* 
b0a0: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
b0b0: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  sion */.){.  Exp
b0c0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20  rList *pList;.. 
b0d0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
b0e0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  TK_FUNCTION ){. 
b0f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
b100: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
b110: 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
b120: 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d  Token,"match")!=
b130: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
b140: 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d  0;.  }.  pList =
b150: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
b160: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45  .  if( pList->nE
b170: 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65  xpr!=2 ){.    re
b180: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
b190: 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ( pList->a[1].pE
b1a0: 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f  xpr->op != TK_CO
b1b0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  LUMN ){.    retu
b1c0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
b1d0: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
b1e0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
b1f0: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
b200: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73  *.** If the pBas
b210: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
b220: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
b230: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
b240: 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20  e of.** a join, 
b250: 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
b260: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61  e appropriate ma
b270: 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64  rkings over to d
b280: 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  erived..*/.stati
b290: 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a  c void transferJ
b2a0: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72  oinMarkings(Expr
b2b0: 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72   *pDerived, Expr
b2c0: 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72   *pBase){.  pDer
b2d0: 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70  ived->flags |= p
b2e0: 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50  Base->flags & EP
b2f0: 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65  _FromJoin;.  pDe
b300: 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69  rived->iRightJoi
b310: 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e  nTable = pBase->
b320: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b  iRightJoinTable;
b330: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
b340: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
b350: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
b360: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b370: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
b380: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20  /*.** Analyze a 
b390: 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73  term that consis
b3a0: 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ts of two or mor
b3b0: 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a  e OR-connected.*
b3c0: 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20  * subterms.  So 
b3d0: 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  in:.**.**     ..
b3e0: 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41  . WHERE  (a=5) A
b3f0: 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f  ND (b=7 OR c=9 O
b400: 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31  R d=13) AND (d=1
b410: 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  3).**           
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e                 ^
b430: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
b440: 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ^^^.**.** This r
b450: 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20  outine analyzes 
b460: 74 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68  terms such as th
b470: 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e  e middle term in
b480: 20 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70   the above examp
b490: 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72  le..** A WhereOr
b4a0: 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63  Term object is c
b4b0: 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61  omputed and atta
b4c0: 63 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d  ched to the term
b4d0: 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73   under.** analys
b4e0: 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  is, regardless o
b4f0: 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66  f the outcome of
b500: 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20   the analysis.  
b510: 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  Hence:.**.**    
b520: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
b530: 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52  gs   |=  TERM_OR
b540: 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72  INFO.**     Wher
b550: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20  eTerm.u.pOrInfo 
b560: 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   =  a dynamicall
b570: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
b580: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a  eOrTerm object.*
b590: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65  *.** The term be
b5a0: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73  ing analyzed mus
b5b0: 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f  t have two or mo
b5c0: 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74  re of OR-connect
b5d0: 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20  ed subterms..** 
b5e0: 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d  A single subterm
b5f0: 20 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20   might be a set 
b600: 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64  of AND-connected
b610: 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a   sub-subterms..*
b620: 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65  * Examples of te
b630: 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73  rms under analys
b640: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41  is:.**.**     (A
b650: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
b660: 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20  OR t1.x=t2.z OR 
b670: 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d  t1.y=15 OR t1.z=
b680: 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42  t3.a+5.**     (B
b690: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
b6a0: 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78   expr2=x OR x=ex
b6b0: 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20  pr3.**     (C)  
b6c0: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
b6d0: 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74  (t1.x=t2.z AND t
b6e0: 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28  1.y=15).**     (
b6f0: 44 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f  D)     x=expr1 O
b700: 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32  R (y>11 AND y<22
b710: 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65   AND z LIKE '*he
b720: 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45  llo*').**     (E
b730: 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44  )     (p.a=1 AND
b740: 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33   q.b=2 AND r.c=3
b750: 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20  ) OR (p.x=4 AND 
b760: 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29  q.y=5 AND r.z=6)
b770: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a  .**.** CASE 1:.*
b780: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74  *.** If all subt
b790: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
b7a0: 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f  form T.C=expr fo
b7b0: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f  r some single co
b7c0: 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a  lumn of C and.**
b7d0: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
b7e0: 54 20 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65  T (as shown in e
b7f0: 78 61 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20  xample B above) 
b800: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
b810: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
b820: 6d 20 74 68 61 74 20 69 73 20 61 6e 20 65 71 75  m that is an equ
b830: 69 76 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65  ivalent IN expre
b840: 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72  ssion.  In other
b850: 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74   words, if the t
b860: 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61  erm.** being ana
b870: 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  lyzed is:.**.** 
b880: 20 20 20 20 20 78 20 3d 20 65 78 70 72 31 20 20       x = expr1  
b890: 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f  OR  expr2 = x  O
b8a0: 52 20 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a  R  x = expr3.**.
b8b0: 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
b8c0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
b8d0: 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  m like this:.**.
b8e0: 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65 78  **      x IN (ex
b8f0: 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29  pr1,expr2,expr3)
b900: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a  .**.** CASE 2:.*
b910: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74  *.** If all subt
b920: 65 72 6d 73 20 61 72 65 20 69 6e 64 65 78 61 62  erms are indexab
b930: 6c 65 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74  le by a single t
b940: 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 73 65 74  able T, then set
b950: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  .**.**     Where
b960: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20  Term.eOperator  
b970: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 20 57              =  W
b980: 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65 72  O_OR.**     Wher
b990: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d  eTerm.u.pOrInfo-
b9a0: 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20 20  >indexable  |=  
b9b0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
b9c0: 72 20 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a  r for table T.**
b9d0: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
b9e0: 20 22 69 6e 64 65 78 61 62 6c 65 22 20 69 66 20   "indexable" if 
b9f0: 69 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  it is of the for
ba00: 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c  m.** "T.C <op> <
ba10: 65 78 70 72 3e 22 20 77 68 65 72 65 20 43 20 69  expr>" where C i
ba20: 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  s any column of 
ba30: 74 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20  table T and .** 
ba40: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22  <op> is one of "
ba50: 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22  =", "<", "<=", "
ba60: 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55  >", ">=", "IS NU
ba70: 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a  LL", or "IN"..**
ba80: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 61 6c   A subterm is al
ba90: 73 6f 20 69 6e 64 65 78 61 62 6c 65 20 69 66 20  so indexable if 
baa0: 69 74 20 69 73 20 61 6e 20 41 4e 44 20 6f 66 20  it is an AND of 
bab0: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73  two or more.** s
bac0: 75 62 73 75 62 74 65 72 6d 73 20 61 74 20 6c 65  ubsubterms at le
bad0: 61 73 74 20 6f 6e 65 20 6f 66 20 77 68 69 63 68  ast one of which
bae0: 20 69 73 20 69 6e 64 65 78 61 62 6c 65 2e 20 20   is indexable.  
baf0: 49 6e 64 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a  Indexable AND .*
bb00: 2a 20 73 75 62 74 65 72 6d 73 20 68 61 76 65 20  * subterms have 
bb10: 74 68 65 69 72 20 65 4f 70 65 72 61 74 6f 72 20  their eOperator 
bb20: 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e  set to WO_AND an
bb30: 64 20 74 68 65 79 20 68 61 76 65 0a 2a 2a 20 75  d they have.** u
bb40: 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f  .pAndInfo set to
bb50: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
bb60: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 41 6e  llocated WhereAn
bb70: 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a  dTerm object..**
bb80: 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72  .** From another
bb90: 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20   point of view, 
bba0: 22 69 6e 64 65 78 61 62 6c 65 22 20 6d 65 61 6e  "indexable" mean
bbb0: 73 20 74 68 61 74 20 74 68 65 20 73 75 62 74 65  s that the subte
bbc0: 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65  rm could.** pote
bbd0: 6e 74 69 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ntially be used 
bbe0: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 69 66  with an index if
bbf0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
bc00: 69 6e 64 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a  index exists..**
bc10: 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64   This analysis d
bc20: 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72  oes not consider
bc30: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
bc40: 74 68 65 20 69 6e 64 65 78 20 65 78 69 73 74 73  the index exists
bc50: 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20 64 65 63  ; that.** is dec
bc60: 69 64 65 64 20 65 6c 73 65 77 68 65 72 65 2e 20  ided elsewhere. 
bc70: 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 6f   This analysis o
bc80: 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65  nly looks at whe
bc90: 74 68 65 72 20 73 75 62 74 65 72 6d 73 0a 2a 2a  ther subterms.**
bca0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
bcb0: 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73 74 2e   indexing exist.
bcc0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70  .**.** All examp
bcd0: 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20 45 20  les A through E 
bce0: 61 62 6f 76 65 20 73 61 74 69 73 66 79 20 63 61  above satisfy ca
bcf0: 73 65 20 32 2e 20 20 42 75 74 20 69 66 20 61 20  se 2.  But if a 
bd00: 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61  term.** also sta
bd10: 74 69 73 66 69 65 73 20 63 61 73 65 20 31 20 28  tisfies case 1 (
bd20: 73 75 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e  such as B) we kn
bd30: 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70 74 69  ow that the opti
bd40: 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c  mizer will.** al
bd50: 77 61 79 73 20 70 72 65 66 65 72 20 63 61 73 65  ways prefer case
bd60: 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63   1, so in that c
bd70: 61 73 65 20 77 65 20 70 72 65 74 65 6e 64 20 74  ase we pretend t
bd80: 68 61 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f  hat case 2 is no
bd90: 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a  t.** satisfied..
bda0: 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62  **.** It might b
bdb0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
bdc0: 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20  multiple tables 
bdd0: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20  are indexable.  
bde0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20  For example,.** 
bdf0: 28 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64  (E) above is ind
be00: 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73  exable on tables
be10: 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a   P, Q, and R..**
be20: 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73  .** Terms that s
be30: 61 74 69 73 66 79 20 63 61 73 65 20 32 20 61 72  atisfy case 2 ar
be40: 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  e candidates for
be50: 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67   lookup by using
be60: 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64  .** separate ind
be70: 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77  ices to find row
be80: 69 64 73 20 66 6f 72 20 65 61 63 68 20 73 75 62  ids for each sub
be90: 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69  term and composi
bea0: 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20  ng.** the union 
beb0: 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73  of all rowids us
bec0: 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a  ing a RowSet obj
bed0: 65 63 74 2e 20 20 54 68 69 73 20 69 73 20 73 69  ect.  This is si
bee0: 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74  milar.** to "bit
bef0: 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20  map indices" in 
bf00: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 65  other database e
bf10: 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54  ngines..**.** OT
bf20: 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49  HERWISE:.**.** I
bf30: 66 20 6e 65 69 74 68 65 72 20 63 61 73 65 20 31  f neither case 1
bf40: 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c   nor case 2 appl
bf50: 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68  y, then leave th
bf60: 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20  e eOperator set 
bf70: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69  to.** zero.  Thi
bf80: 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73  s term is not us
bf90: 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e  eful for search.
bfa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bfb0: 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72  exprAnalyzeOrTer
bfc0: 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  m(.  SrcList *pS
bfd0: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rc,            /
bfe0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
bff0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
c000: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
c010: 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   /* the complete
c020: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
c030: 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20  .  int idxTerm  
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c050: 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d  Index of the OR-
c060: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
c070: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  zed */.){.  Wher
c080: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
c090: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 20 20 20  pWC->pWInfo;    
c0a0: 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
c0b0: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  use processing c
c0c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
c0d0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
c0e0: 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  fo->pParse;     
c0f0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
c100: 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
c110: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c120: 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
c130: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
c140: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57  onnection */.  W
c150: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20  hereTerm *pTerm 
c160: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
c170: 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65  m];    /* The te
c180: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
c190: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  d */.  Expr *pEx
c1a0: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
c1b0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
c1c0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
c1d0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a   of the term */.
c1e0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
c210: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
c220: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
c230: 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65  Wc;       /* Bre
c240: 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e  akup of pTerm in
c250: 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
c260: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
c270: 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20  erm;       /* A 
c280: 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20  Sub-term within 
c290: 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57  the pOrWc */.  W
c2a0: 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49  hereOrInfo *pOrI
c2b0: 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69  nfo;     /* Addi
c2c0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
c2d0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
c2e0: 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69  th pTerm */.  Bi
c2f0: 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20  tmask chngToIN; 
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 6d 69 67 68 74 20 73 61 74  s that might sat
c320: 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20  isfy case 1 */. 
c330: 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62   Bitmask indexab
c340: 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61  le;        /* Ta
c350: 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  bles that are in
c360: 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79  dexable, satisfy
c370: 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20  ing case 2 */.. 
c380: 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74   /*.  ** Break t
c390: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74  he OR clause int
c3a0: 6f 20 69 74 73 20 73 65 70 61 72 61 74 65 20 73  o its separate s
c3b0: 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75  ubterms.  The su
c3c0: 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20  bterms are.  ** 
c3d0: 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72  stored in a Wher
c3e0: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
c3f0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74  e containing wit
c400: 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49  hin the WhereOrI
c410: 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20  nfo.  ** object 
c420: 74 68 61 74 20 69 73 20 61 74 74 61 63 68 65 64  that is attached
c430: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
c440: 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e   OR clause term.
c450: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
c460: 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
c470: 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c  & (TERM_DYNAMIC|
c480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d  TERM_ORINFO|TERM
c490: 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b  _ANDINFO))==0 );
c4a0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
c4b0: 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ->op==TK_OR );. 
c4c0: 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66   pTerm->u.pOrInf
c4d0: 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71  o = pOrInfo = sq
c4e0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
c4f0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f  o(db, sizeof(*pO
c500: 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70  rInfo));.  if( p
c510: 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75  OrInfo==0 ) retu
c520: 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46  rn;.  pTerm->wtF
c530: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49  lags |= TERM_ORI
c540: 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26  NFO;.  pOrWc = &
c550: 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77  pOrInfo->wc;.  w
c560: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70  hereClauseInit(p
c570: 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  OrWc, pWInfo);. 
c580: 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f 72 57   whereSplit(pOrW
c590: 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29  c, pExpr, TK_OR)
c5a0: 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  ;.  exprAnalyzeA
c5b0: 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b  ll(pSrc, pOrWc);
c5c0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
c5d0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
c5e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 57  ;.  assert( pOrW
c5f0: 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a  c->nTerm>=2 );..
c600: 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74    /*.  ** Comput
c610: 65 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  e the set of tab
c620: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
c630: 61 74 69 73 66 79 20 63 61 73 65 73 20 31 20 6f  atisfy cases 1 o
c640: 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65  r 2..  */.  inde
c650: 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73  xable = ~(Bitmas
c660: 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20  k)0;.  chngToIN 
c670: 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
c680: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
c690: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
c6a0: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26  OrWc->a; i>=0 &&
c6b0: 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c   indexable; i--,
c6c0: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
c6d0: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
c6e0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49  Operator & WO_SI
c6f0: 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NGLE)==0 ){.    
c700: 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a    WhereAndInfo *
c710: 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAndInfo;.      
c720: 61 73 73 65 72 74 28 20 28 70 4f 72 54 65 72 6d  assert( (pOrTerm
c730: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
c740: 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f  M_ANDINFO|TERM_O
c750: 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  RINFO))==0 );.  
c760: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
c770: 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e 66 6f  ;.      pAndInfo
c780: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
c790: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
c7a0: 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20  (*pAndInfo));.  
c7b0: 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e 66 6f      if( pAndInfo
c7c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
c7d0: 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 3b  eClause *pAndWC;
c7e0: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
c7f0: 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20  rm *pAndTerm;.  
c800: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
c810: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
c820: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54   0;.        pOrT
c830: 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20  erm->u.pAndInfo 
c840: 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20  = pAndInfo;.    
c850: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
c860: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44  lags |= TERM_AND
c870: 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f  INFO;.        pO
c880: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
c890: 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20   = WO_AND;.     
c8a0: 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70 41 6e     pAndWC = &pAn
c8b0: 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
c8c0: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
c8d0: 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e  it(pAndWC, pWC->
c8e0: 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
c8f0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64   whereSplit(pAnd
c900: 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  WC, pOrTerm->pEx
c910: 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  pr, TK_AND);.   
c920: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
c930: 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43  All(pSrc, pAndWC
c940: 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  );.        pAndW
c950: 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b  C->pOuter = pWC;
c960: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
c970: 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e( db->mallocFai
c980: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69  led );.        i
c990: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
c9a0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
c9b0: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e 64 54    for(j=0, pAndT
c9c0: 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b 20 6a  erm=pAndWC->a; j
c9d0: 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b 20  <pAndWC->nTerm; 
c9e0: 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b 2b 29  j++, pAndTerm++)
c9f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
ca00: 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d 2d 3e  sert( pAndTerm->
ca10: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20  pExpr );.       
ca20: 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77 65 64       if( allowed
ca30: 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78  Op(pAndTerm->pEx
ca40: 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20 20 20  pr->op) ){.     
ca50: 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65           b |= ge
ca60: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
ca70: 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65 72  MaskSet, pAndTer
ca80: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  m->leftCursor);.
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
caa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cab0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64 65    }.        inde
cac0: 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20  xable &= b;.    
cad0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
cae0: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
caf0: 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44  gs & TERM_COPIED
cb00: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69   ){.      /* Ski
cb10: 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72 20  p this term for 
cb20: 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69 74  now.  We revisit
cb30: 20 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f 63   it when we proc
cb40: 65 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ess the.      **
cb50: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54   corresponding T
cb60: 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72 6d  ERM_VIRTUAL term
cb70: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
cb80: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a       Bitmask b;.
cb90: 20 20 20 20 20 20 62 20 3d 20 67 65 74 4d 61 73        b = getMas
cba0: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
cbb0: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
cbc0: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
cbd0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
cbe0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
cbf0: 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  TUAL ){.        
cc00: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
cc10: 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f  r = &pOrWc->a[pO
cc20: 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  rTerm->iParent];
cc30: 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65  .        b |= ge
cc40: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
cc50: 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d  MaskSet, pOther-
cc60: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
cc70: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 64 65      }.      inde
cc80: 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20  xable &= b;.    
cc90: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
cca0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
ccb0: 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Q)==0 ){.       
ccc0: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20   chngToIN = 0;. 
ccd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cce0: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20      chngToIN &= 
ccf0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
cd00: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
cd10: 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20 6f  Record the set o
cd20: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73 61  f tables that sa
cd30: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 54  tisfy case 2.  T
cd40: 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65 0a  he set might be.
cd50: 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f    ** empty..  */
cd60: 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .  pOrInfo->inde
cd70: 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c  xable = indexabl
cd80: 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65  e;.  pTerm->eOpe
cd90: 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c  rator = indexabl
cda0: 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52  e==0 ? 0 : WO_OR
cdb0: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e  ;..  /*.  ** chn
cdc0: 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73 65  gToIN holds a se
cdd0: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
cde0: 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66 79   *might* satisfy
cdf0: 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20 20   case 1.  But.  
ce00: 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64 6f  ** we have to do
ce10: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
ce20: 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65   checking to see
ce30: 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c 6c   if case 1 reall
ce40: 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73 66  y.  ** is satisf
ce50: 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63  ied..  **.  ** c
ce60: 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c  hngToIN will hol
ce70: 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20 6f  d either 0, 1, o
ce80: 72 20 32 20 62 69 74 73 2e 20 20 54 68 65 20 30  r 2 bits.  The 0
ce90: 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73 0a  -bit case means.
cea0: 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20    ** that there 
ceb0: 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74  is no possibilit
cec0: 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e  y of transformin
ced0: 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  g the OR clause 
cee0: 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20  into an.  ** IN 
cef0: 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73 65  operator because
cf00: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65 72   one or more ter
cf10: 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61  ms in the OR cla
cf20: 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a  use contain.  **
cf30: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
cf40: 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f   than == on a co
cf50: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e 67  lumn in the sing
cf60: 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 31  le table.  The 1
cf70: 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d  -bit.  ** case m
cf80: 65 61 6e 73 20 74 68 61 74 20 65 76 65 72 79 20  eans that every 
cf90: 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63  term of the OR c
cfa0: 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 20  lause is of the 
cfb0: 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65  form.  ** "table
cfc0: 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f  .column=expr" fo
cfd0: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61  r some single ta
cfe0: 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62 69  ble.  The one bi
cff0: 74 20 74 68 61 74 20 69 73 20 73 65 74 0a 20 20  t that is set.  
d000: 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f  ** will correspo
d010: 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  nd to the common
d020: 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69 6c   table.  We stil
d030: 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  l need to check 
d040: 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  to make.  ** sur
d050: 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  e the same colum
d060: 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c  n is used on all
d070: 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d 62   terms.  The 2-b
d080: 69 74 20 63 61 73 65 20 69 73 20 77 68 65 6e 0a  it case is when.
d090: 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65 72    ** the all ter
d0a0: 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f  ms are of the fo
d0b0: 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d  rm "table1.colum
d0c0: 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22  n=table2.column"
d0d0: 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74  .  It.  ** might
d0e0: 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
d0f0: 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61  form an IN opera
d100: 74 6f 72 20 77 69 74 68 20 65 69 74 68 65 72 20  tor with either 
d110: 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20  table1.column.  
d120: 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c  ** or table2.col
d130: 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20 69  umn as the LHS i
d140: 66 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d 6d  f either is comm
d150: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
d160: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20   of.  ** the OR 
d170: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
d180: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72 6d  * Note that term
d190: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  s of the form "t
d1a0: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62  able.column1=tab
d1b0: 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65  le.column2" (the
d1c0: 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65  .  ** same table
d1d0: 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20 6f   on both sizes o
d1e0: 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74  f the ==) cannot
d1f0: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20   be optimized.. 
d200: 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54 6f   */.  if( chngTo
d210: 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b  IN ){.    int ok
d220: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20  ToChngToIN = 0; 
d230: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
d240: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f  he conversion to
d250: 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a   IN is valid */.
d260: 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20      int iColumn 
d270: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  = -1;         /*
d280: 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e   Column index on
d290: 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72 61   lhs of IN opera
d2a0: 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  tor */.    int i
d2b0: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20  Cursor = -1;    
d2c0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 75       /* Table cu
d2d0: 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  rsor common to a
d2e0: 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  ll terms */.    
d2f0: 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20 20  int j = 0;      
d300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
d310: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
d320: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
d330: 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  a table and colu
d340: 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73 20  mn that appears 
d350: 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74  on one side or t
d360: 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  he.    ** other 
d370: 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61 74  of the == operat
d380: 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62 74  or in every subt
d390: 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c 65  erm.  That table
d3a0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   and column.    
d3b0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72  ** will be recor
d3c0: 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20 61  ded in iCursor a
d3d0: 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65  nd iColumn.  The
d3e0: 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  re might not be 
d3f0: 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20  any.    ** such 
d400: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
d410: 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54  .  Set okToChngT
d420: 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f 70  oIN if an approp
d430: 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20 20  riate table.    
d440: 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  ** and column is
d450: 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76 65   found but leave
d460: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61   okToChngToIN fa
d470: 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  lse if not found
d480: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
d490: 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b  (j=0; j<2 && !ok
d4a0: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29  ToChngToIN; j++)
d4b0: 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d 20  {.      pOrTerm 
d4c0: 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20  = pOrWc->a;.    
d4d0: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
d4e0: 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
d4f0: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
d500: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d510: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
d520: 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
d530: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
d540: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
d550: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  R_OK;.        if
d560: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
d570: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
d580: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
d590: 68 69 73 20 69 73 20 74 68 65 20 32 2d 62 69 74  his is the 2-bit
d5a0: 20 63 61 73 65 20 61 6e 64 20 77 65 20 61 72 65   case and we are
d5b0: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
d5c0: 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20  teration and.   
d5d0: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
d5e0: 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74  t term is from t
d5f0: 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
d600: 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69  on.  So skip thi
d610: 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  s term. */.     
d620: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
d630: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  1 );.          c
d640: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
d650: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
d660: 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61  chngToIN & getMa
d670: 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
d680: 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c  kSet, pOrTerm->l
d690: 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29  eftCursor))==0 )
d6a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
d6b0: 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65  his term must be
d6c0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e   of the form t1.
d6d0: 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32  a==t2.b where t2
d6e0: 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20   is in the.     
d6f0: 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e       ** chngToIN
d700: 20 73 65 74 20 62 75 74 20 74 31 20 69 73 20 6e   set but t1 is n
d710: 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77  ot.  This term w
d720: 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70 72  ill be either pr
d730: 65 63 65 65 64 65 64 0a 20 20 20 20 20 20 20 20  eceeded.        
d740: 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20    ** or follwed 
d750: 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20 63  by an inverted c
d760: 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29  opy (t2.b==t1.a)
d770: 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65 72  .  Skip this ter
d780: 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  m .          ** 
d790: 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76 65  and use its inve
d7a0: 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  rsion. */.      
d7b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
d7c0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
d7d0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a   TERM_COPIED );.
d7e0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
d7f0: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
d800: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
d810: 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  UAL );.         
d820: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
d830: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
d840: 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49  M_COPIED|TERM_VI
d850: 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20 20  RTUAL) );.      
d860: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
d870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d880: 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72  iColumn = pOrTer
d890: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
d8a0: 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f 72  .        iCursor
d8b0: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74   = pOrTerm->left
d8c0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
d8d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
d8e0: 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a       if( i<0 ){.
d8f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61          /* No ca
d900: 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63 6f  ndidate table+co
d910: 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20  lumn was found. 
d920: 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
d930: 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ccur.        ** 
d940: 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74  on the second it
d950: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  eration */.     
d960: 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20     assert( j==1 
d970: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
d980: 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28  t( IsPowerOfTwo(
d990: 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20  chngToIN) );.   
d9a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 63 68 6e       assert( chn
d9b0: 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 26  gToIN==getMask(&
d9c0: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
d9d0: 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  , iCursor) );.  
d9e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d9f0: 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
da00: 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20  ase( j==1 );..  
da10: 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 66      /* We have f
da20: 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74 65  ound a candidate
da30: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
da40: 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  n.  Check to see
da50: 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   if that.      *
da60: 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  * table and colu
da70: 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  mn is common to 
da80: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
da90: 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a 20  e OR clause */. 
daa0: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
dab0: 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  N = 1;.      for
dac0: 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43  (; i>=0 && okToC
dad0: 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f  hngToIN; i--, pO
dae0: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
daf0: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
db00: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
db10: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
db20: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
db30: 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72  tCursor!=iCursor
db40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
db50: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
db60: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
db70: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
db80: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
db90: 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
dba0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54  ){.          okT
dbb0: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20  oChngToIN = 0;. 
dbc0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
dbd0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c          int affL
dbe0: 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20  eft, affRight;. 
dbf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
dc00: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
dc10: 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c  de is also a col
dc20: 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66  umn, then the af
dc30: 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20  finities.       
dc40: 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69     ** of both ri
dc50: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64  ght and left sid
dc60: 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68 20  es must be such 
dc70: 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20  that no type.   
dc80: 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72         ** conver
dc90: 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72  sions are requir
dca0: 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  ed on the right.
dcb0: 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39 29    (Ticket #2249)
dcc0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
dcd0: 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68 74          affRight
dce0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
dcf0: 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e  finity(pOrTerm->
dd00: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
dd10: 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65 66            affLef
dd20: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
dd30: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
dd40: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  >pExpr->pLeft);.
dd50: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 66            if( af
dd60: 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66 66  fRight!=0 && aff
dd70: 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29  Right!=affLeft )
dd80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b  {.            ok
dd90: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
dda0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
ddb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72  .            pOr
ddc0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
ddd0: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20   TERM_OR_OK;.   
dde0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ddf0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
de00: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
de10: 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67   point, okToChng
de20: 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66 20  ToIN is true if 
de30: 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73  original pTerm s
de40: 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20  atisfies.    ** 
de50: 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74  case 1.  In that
de60: 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74   case, construct
de70: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
de80: 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20  erm that is .   
de90: 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72   ** pTerm conver
dea0: 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f  ted into an IN o
deb0: 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a  perator..    */.
dec0: 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67      if( okToChng
ded0: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  ToIN ){.      Ex
dee0: 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20  pr *pDup;       
def0: 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69       /* A transi
df00: 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65 78  ent duplicate ex
df10: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
df20: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
df30: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  t = 0;   /* The 
df40: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
df50: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
df60: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b  Expr *pLeft = 0;
df70: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48         /* The LH
df80: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
df90: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  ator */.      Ex
dfa0: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
dfb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
dfc0: 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  lete IN operator
dfd0: 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69   */..      for(i
dfe0: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
dff0: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
e000: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  a; i>=0; i--, pO
e010: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
e020: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
e030: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
e040: 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69  R_OK)==0 ) conti
e050: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  nue;.        ass
e060: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
e070: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
e080: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
e090: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t( pOrTerm->left
e0a0: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
e0b0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
e0c0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  t( pOrTerm->u.le
e0d0: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
e0e0: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75  n );.        pDu
e0f0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
e100: 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e  up(db, pOrTerm->
e110: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30  pExpr->pRight, 0
e120: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
e130: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
e140: 73 74 41 70 70 65 6e 64 28 70 57 49 6e 66 6f 2d  stAppend(pWInfo-
e150: 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  >pParse, pList, 
e160: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 70  pDup);.        p
e170: 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Left = pOrTerm->
e180: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
e190: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
e1a0: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
e1b0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
e1c0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
e1d0: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
e1e0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50   pNew = sqlite3P
e1f0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
e200: 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b  IN, pDup, 0, 0);
e210: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
e220: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
e230: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74  dxNew;.        t
e240: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
e250: 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29  ngs(pNew, pExpr)
e260: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e270: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
e280: 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53  ty(pNew, EP_xIsS
e290: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
e2a0: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
e2b0: 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = pList;.       
e2c0: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
e2d0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
e2e0: 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54   pNew, TERM_VIRT
e2f0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
e300: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
e310: 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
e320: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
e330: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
e340: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
e350: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
e360: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
e370: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
e380: 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w].iParent = idx
e390: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
e3a0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
e3b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e3c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e3d0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
e3e0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
e3f0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
e400: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50  erator = WO_NOOP
e410: 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72 75  ;  /* case 1 tru
e420: 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a 20 20  mps case 2 */.  
e430: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
e440: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
e450: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
e460: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
e470: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
e480: 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f  .** The input to
e490: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e4a0: 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74   an WhereTerm st
e4b0: 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c  ructure with onl
e4c0: 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22  y the.** "pExpr"
e4d0: 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e   field filled in
e4e0: 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .  The job of th
e4f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
e500: 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20   analyze the.** 
e510: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  subexpression an
e520: 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74  d populate all t
e530: 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  he other fields 
e540: 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  of the WhereTerm
e550: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
e560: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
e570: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
e580: 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f   form "<expr> <o
e590: 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f  p> X" it gets co
e5a0: 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  mmuted.** to the
e5b0: 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f   standard form o
e5c0: 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  f "X <op> <expr>
e5d0: 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  "..**.** If the 
e5e0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
e5f0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
e600: 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20  > Y" where both 
e610: 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63  X and Y are.** c
e620: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65  olumns, then the
e630: 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73   original expres
e640: 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65  sion is unchange
e650: 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74  d and a new virt
e660: 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74  ual.** term of t
e670: 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20  he form "Y <op> 
e680: 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  X" is added to t
e690: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
e6a0: 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  and.** analyzed 
e6b0: 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65  separately.  The
e6c0: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69   original term i
e6d0: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45  s marked with TE
e6e0: 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64  RM_COPIED.** and
e6f0: 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73   the new term is
e700: 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52   marked with TER
e710: 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75  M_DYNAMIC (becau
e720: 73 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a  se it's pExpr.**
e730: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
e740: 65 64 20 77 69 74 68 20 74 68 65 20 57 68 65 72  ed with the Wher
e750: 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52  eClause) and TER
e760: 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61 75  M_VIRTUAL (becau
e770: 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f  se it.** is a co
e780: 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61  mmuted copy of a
e790: 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54   prior term.)  T
e7a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
e7b0: 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a   has nChild=1.**
e7c0: 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61   and the copy ha
e7d0: 73 20 69 64 78 50 61 72 65 6e 74 20 73 65 74 20  s idxParent set 
e7e0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
e7f0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  the original ter
e800: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
e810: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20  d exprAnalyze(. 
e820: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
e830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
e840: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
e850: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
e860: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
e870: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
e880: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
e890: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
e8a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
e8b0: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
e8c0: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  zed */.){.  Wher
e8d0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
e8e0: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a 20  pWC->pWInfo; /* 
e8f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
e900: 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  cessing context 
e910: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
e920: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
e930: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72        /* The ter
e940: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
e950: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
e960: 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
e970: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66         /* Set of
e980: 20 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73   table index mas
e990: 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  ks */.  Expr *pE
e9a0: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
e9b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e9c0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
e9d0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42   analyzed */.  B
e9e0: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66  itmask prereqLef
e9f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
ea00: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
ea10: 20 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70   of the pExpr->p
ea20: 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Left */.  Bitmas
ea30: 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20  k prereqAll;    
ea40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
ea50: 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 70  erequesites of p
ea60: 45 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Expr */.  Bitmas
ea70: 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30  k extraRight = 0
ea80: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ;          /* Ex
ea90: 74 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73  tra dependencies
eaa0: 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f   on LEFT JOIN */
eab0: 0a 20 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d  .  Expr *pStr1 =
eac0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   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 6f 70 65 72 61 74 6f 72  KE/GLOB operator
eaf0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70   */.  int isComp
eb00: 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  lete = 0;       
eb10: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
eb20: 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20   LIKE/GLOB ends 
eb30: 77 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f  with wildcard */
eb40: 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20  .  int noCase = 
eb50: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
eb60: 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42      /* LIKE/GLOB
eb70: 20 64 69 73 74 69 6e 67 75 69 73 68 65 73 20 63   distinguishes c
eb80: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ase */.  int op;
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
ebb0: 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e  -level operator.
ebc0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20    pExpr->op */. 
ebd0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
ebe0: 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
ebf0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
ec00: 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
ec10: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
ec20: 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  db;        /* Da
ec30: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ec40: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  n */..  if( db->
ec50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
ec60: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
ec70: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
ec80: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d  a[idxTerm];.  pM
ec90: 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f  askSet = &pWInfo
eca0: 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45  ->sMaskSet;.  pE
ecb0: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
ecc0: 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  pr;.  assert( pE
ecd0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 26  xpr->op!=TK_AS &
ece0: 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
ecf0: 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 70 72 65  COLLATE );.  pre
ed00: 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61  reqLeft = exprTa
ed10: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
ed20: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
ed30: 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  ;.  op = pExpr->
ed40: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
ed50: 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _IN ){.    asser
ed60: 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t( pExpr->pRight
ed70: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 45  ==0 );.    if( E
ed80: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
ed90: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
eda0: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70 54 65  ct) ){.      pTe
edb0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
edc0: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
edd0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
ede0: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
edf0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
ee00: 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72       pTerm->prer
ee10: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69  eqRight = exprLi
ee20: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
ee30: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
ee40: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
ee50: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
ee60: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70  _ISNULL ){.    p
ee70: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
ee80: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
ee90: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
eea0: 71 52 69 67 68 74 20 3d 20 65 78 70 72 54 61 62  qRight = exprTab
eeb0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
eec0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
eed0: 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c  ;.  }.  prereqAl
eee0: 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  l = exprTableUsa
eef0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
ef00: 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  pr);.  if( ExprH
ef10: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
ef20: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
ef30: 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78 20  {.    Bitmask x 
ef40: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
ef50: 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68  et, pExpr->iRigh
ef60: 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20  tJoinTable);.   
ef70: 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b   prereqAll |= x;
ef80: 0a 20 20 20 20 65 78 74 72 61 52 69 67 68 74 20  .    extraRight 
ef90: 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c  = x-1;  /* ON cl
efa0: 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20 6e  ause terms may n
efb0: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
efc0: 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  an index.       
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efe0: 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65  ** on left table
eff0: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
f000: 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a    Ticket #3015 *
f010: 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70  /.  }.  pTerm->p
f020: 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65  rereqAll = prere
f030: 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c  qAll;.  pTerm->l
f040: 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  eftCursor = -1;.
f050: 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74    pTerm->iParent
f060: 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e   = -1;.  pTerm->
f070: 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20  eOperator = 0;. 
f080: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f   if( allowedOp(o
f090: 70 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  p) ){.    Expr *
f0a0: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
f0b0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
f0c0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
f0d0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
f0e0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
f0f0: 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70  Collate(pExpr->p
f100: 52 69 67 68 74 29 3b 0a 20 20 20 20 75 31 36 20  Right);.    u16 
f110: 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65 72 6d 2d  opMask = (pTerm-
f120: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
f130: 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 3f 20  rereqLeft)==0 ? 
f140: 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51 55 49  WO_ALL : WO_EQUI
f150: 56 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  V;.    if( pLeft
f160: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
f170: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
f180: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
f190: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
f1a0: 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43    pTerm->u.leftC
f1b0: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
f1c0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54  Column;.      pT
f1d0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
f1e0: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70   operatorMask(op
f1f0: 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20  ) & opMask;.    
f200: 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  }.    if( pRight
f210: 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d   && pRight->op==
f220: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
f230: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
f240: 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ew;.      Expr *
f250: 70 44 75 70 3b 0a 20 20 20 20 20 20 75 31 36 20  pDup;.      u16 
f260: 65 45 78 74 72 61 4f 70 20 3d 20 30 3b 20 20 20  eExtraOp = 0;   
f270: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 69       /* Extra bi
f280: 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65 4f 70  ts for pNew->eOp
f290: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
f2a0: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
f2b0: 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20  ursor>=0 ){.    
f2c0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
f2d0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
f2e0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
f2f0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
f300: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
f310: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
f320: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
f330: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75  prDelete(db, pDu
f340: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
f350: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
f360: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
f370: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
f380: 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45  rt(pWC, pDup, TE
f390: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
f3a0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
f3b0: 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20    if( idxNew==0 
f3c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
f3d0: 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61    pNew = &pWC->a
f3e0: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
f3f0: 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20    pNew->iParent 
f400: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
f410: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
f420: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
f430: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
f440: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ld = 1;.        
f450: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
f460: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
f470: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
f480: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20 20 20 20  ->op==TK_EQ.    
f490: 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
f4a0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f4b0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
f4c0: 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
f4d0: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
f4e0: 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69 74 69   SQLITE_Transiti
f4f0: 76 65 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ve).        ){. 
f500: 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
f510: 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20 57 4f 5f  eOperator |= WO_
f520: 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 20  EQUIV;.         
f530: 20 65 45 78 74 72 61 4f 70 20 3d 20 57 4f 5f 45   eExtraOp = WO_E
f540: 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 7d 0a  QUIV;.        }.
f550: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f560: 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70       pDup = pExp
f570: 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  r;.        pNew 
f580: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
f590: 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75  .      exprCommu
f5a0: 74 65 28 70 50 61 72 73 65 2c 20 70 44 75 70 29  te(pParse, pDup)
f5b0: 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20  ;.      pLeft = 
f5c0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
f5d0: 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e 70 4c 65  ollate(pDup->pLe
f5e0: 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ft);.      pNew-
f5f0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
f600: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
f610: 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43     pNew->u.leftC
f620: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
f630: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74 65  Column;.      te
f640: 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71 4c  stcase( (prereqL
f650: 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74  eft | extraRight
f660: 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74 20  ) != prereqLeft 
f670: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
f680: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
f690: 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52  reqLeft | extraR
f6a0: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  ight;.      pNew
f6b0: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
f6c0: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70  ereqAll;.      p
f6d0: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  New->eOperator =
f6e0: 20 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70   (operatorMask(p
f6f0: 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78 74 72  Dup->op) + eExtr
f700: 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  aOp) & opMask;. 
f710: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65     }.  }..#ifnde
f720: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  f SQLITE_OMIT_BE
f730: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
f740: 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72  ON.  /* If a ter
f750: 6d 20 69 73 20 74 68 65 20 42 45 54 57 45 45 4e  m is the BETWEEN
f760: 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74   operator, creat
f770: 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61  e two new virtua
f780: 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61  l terms.  ** tha
f790: 74 20 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e  t define the ran
f7a0: 67 65 20 74 68 61 74 20 74 68 65 20 42 45 54 57  ge that the BETW
f7b0: 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20  EEN implements. 
f7c0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   For example:.  
f7d0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61 20 42  **.  **      a B
f7e0: 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 0a 20  ETWEEN b AND c. 
f7f0: 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76   **.  ** is conv
f800: 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  erted into:.  **
f810: 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20 42 45  .  **      (a BE
f820: 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29 20 41  TWEEN b AND c) A
f830: 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20 28 61  ND (a>=b) AND (a
f840: 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  <=c).  **.  ** T
f850: 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72 6d 73  he two new terms
f860: 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74 6f 20   are added onto 
f870: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
f880: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
f890: 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77 20  t..  ** The new 
f8a0: 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e 61 6d  terms are "dynam
f8b0: 69 63 22 20 61 6e 64 20 61 72 65 20 63 68 69 6c  ic" and are chil
f8c0: 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72 69 67  dren of the orig
f8d0: 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a  inal BETWEEN.  *
f8e0: 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20 6d 65  * term.  That me
f8f0: 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 20  ans that if the 
f900: 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20  BETWEEN term is 
f910: 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69 6c 64  coded, the child
f920: 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69  ren are.  ** ski
f930: 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20 74 68  pped.  Or, if th
f940: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 73  e children are s
f950: 61 74 69 73 66 69 65 64 20 62 79 20 61 6e 20 69  atisfied by an i
f960: 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67 69 6e  ndex, the origin
f970: 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e 20  al.  ** BETWEEN 
f980: 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65 64 2e  term is skipped.
f990: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
f9a0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42   pExpr->op==TK_B
f9b0: 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f  ETWEEN && pWC->o
f9c0: 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
f9d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
f9e0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
f9f0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
fa00: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
fa10: 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45  8 ops[] = {TK_GE
fa20: 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73  , TK_LE};.    as
fa30: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
fa40: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
fa50: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b  ist->nExpr==2 );
fa60: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
fa70: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  2; i++){.      E
fa80: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
fa90: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
faa0: 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20  .      pNewExpr 
fab0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
fac0: 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a  Parse, ops[i], .
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 20 73 71 6c               sql
faf0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
fb00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29  pExpr->pLeft, 0)
fb10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
fb30: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
fb40: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
fb50: 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  xpr, 0), 0);.   
fb60: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
fb70: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
fb80: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
fb90: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
fba0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
fbb0: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
fbc0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
fbd0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
fbe0: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
fbf0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
fc00: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
fc10: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
fc20: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
fc30: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  rm;.    }.    pT
fc40: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
fc50: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
fc60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
fc70: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EN_OPTIMIZATION 
fc80: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
fc90: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
fca0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
fcb0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
fcc0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
fcd0: 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74    /* Analyze a t
fce0: 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70  erm that is comp
fcf0: 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d  osed of two or m
fd00: 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e  ore subterms con
fd10: 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61  nected by.  ** a
fd20: 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n OR operator.. 
fd30: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
fd40: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
fd50: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
fd60: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
fd70: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
fd80: 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57  eOrTerm(pSrc, pW
fd90: 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  C, idxTerm);.   
fda0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
fdb0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23  [idxTerm];.  }.#
fdc0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
fdd0: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
fde0: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
fdf0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
fe00: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
fe10: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
fe20: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
fe30: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
fe40: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
fe50: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
fe60: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65    **.  ** A like
fe70: 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20   pattern of the 
fe80: 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62  form "x LIKE 'ab
fe90: 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20  c%'" is changed 
fea0: 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73  into constraints
feb0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
fec0: 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44      x>='abc' AND
fed0: 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c   x<'abd' AND x L
fee0: 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a  IKE 'abc%'.  **.
fef0: 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68    ** The last ch
ff00: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70  aracter of the p
ff10: 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69  refix "abc" is i
ff20: 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f  ncremented to fo
ff30: 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d  rm the.  ** term
ff40: 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f  ination conditio
ff50: 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20  n "abd"..  */.  
ff60: 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  if( pWC->op==TK_
ff70: 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b  AND .   && isLik
ff80: 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20  eOrGlob(pParse, 
ff90: 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26  pExpr, &pStr1, &
ffa0: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43  isComplete, &noC
ffb0: 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78  ase).  ){.    Ex
ffc0: 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
ffd0: 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f   /* LHS of LIKE/
ffe0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
fff0: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32  .    Expr *pStr2
10000 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ;       /* Copy 
10010 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f  of pStr1 - RHS o
10020 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
10030 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  ator */.    Expr
10040 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20   *pNewExpr1;.   
10050 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32   Expr *pNewExpr2
10060 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
10070 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  1;.    int idxNe
10080 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43  w2;.    Token sC
10090 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20  ollSeqName;  /* 
100a0 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
100b0 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
100c0 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
100d0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
100e0 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32  pExpr;.    pStr2
100f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
10100 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b  p(db, pStr1, 0);
10110 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
10120 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
10130 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20      u8 c, *pC;  
10140 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61       /* Last cha
10150 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
10160 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
10170 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28   */.      pC = (
10180 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54  u8*)&pStr2->u.zT
10190 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c  oken[sqlite3Strl
101a0 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54  en30(pStr2->u.zT
101b0 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20  oken)-1];.      
101c0 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69  c = *pC;.      i
101d0 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
101e0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
101f0 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e  t is to incremen
10200 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
10210 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
10220 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
10230 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20   wildcard.  But 
10240 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20  if we increment 
10250 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70  '@', that will p
10260 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  ush it into the.
10270 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61          ** alpha
10280 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72  betic range wher
10290 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f  e case conversio
102a0 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20  ns will mess up 
102b0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
102c0 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20  inequality.  To 
102d0 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65  avoid this, make
102e0 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75   sure to also ru
102f0 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20  n the full.     
10300 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c     ** LIKE on al
10310 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  l candidate expr
10320 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72  essions by clear
10330 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65  ing the isComple
10340 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20  te flag.        
10350 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  */.        if( c
10360 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70  =='A'-1 ) isComp
10370 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  lete = 0;.      
10380 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70    c = sqlite3Upp
10390 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20  erToLower[c];.  
103a0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20      }.      *pC 
103b0 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  = c + 1;.    }. 
103c0 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e     sCollSeqName.
103d0 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f  z = noCase ? "NO
103e0 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22  CASE" : "BINARY"
103f0 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61  ;.    sCollSeqNa
10400 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e  me.n = 6;.    pN
10410 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
10420 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
10430 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77  ft, 0);.    pNew
10440 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50  Expr1 = sqlite3P
10450 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
10460 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  GE, .           
10470 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
10480 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
10490 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f  e,pNewExpr1,&sCo
104a0 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
104b0 20 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29         pStr1, 0)
104c0 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20  ;.    idxNew1 = 
104d0 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
104e0 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31  t(pWC, pNewExpr1
104f0 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
10500 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
10510 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
10520 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78  ew1==0 );.    ex
10530 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
10540 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20  pWC, idxNew1);. 
10550 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73     pNewExpr2 = s
10560 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
10570 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  , pLeft, 0);.   
10580 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c   pNewExpr2 = sql
10590 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
105a0 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20  , TK_LT,.       
105b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
105c0 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
105d0 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 32 2c  Parse,pNewExpr2,
105e0 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a  &sCollSeqName),.
105f0 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72 32             pStr2
10600 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  , 0);.    idxNew
10610 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  2 = whereClauseI
10620 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
10630 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55  xpr2, TERM_VIRTU
10640 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
10650 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
10660 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20  idxNew2==0 );.  
10670 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
10680 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32  rc, pWC, idxNew2
10690 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  );.    pTerm = &
106a0 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
106b0 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c  .    if( isCompl
106c0 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57 43  ete ){.      pWC
106d0 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61  ->a[idxNew1].iPa
106e0 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
106f0 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
10700 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20  New2].iParent = 
10710 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
10720 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32  Term->nChild = 2
10730 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
10740 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
10750 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
10760 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ION */..#ifndef 
10770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
10780 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64  UALTABLE.  /* Ad
10790 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75 78  d a WO_MATCH aux
107a0 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20 74  iliary term to t
107b0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 65  he constraint se
107c0 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75  t if the.  ** cu
107d0 72 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  rrent expression
107e0 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
107f0 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65    column MATCH e
10800 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69  xpr..  ** This i
10810 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
10820 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
10830 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a  ndex methods of.
10840 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62    ** virtual tab
10850 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76 65  les.  The native
10860 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72   query optimizer
10870 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70   does not attemp
10880 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79  t.  ** to do any
10890 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43 48  thing with MATCH
108a0 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
108b0 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f 66  .  if( isMatchOf
108c0 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29 7b  Column(pExpr) ){
108d0 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
108e0 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
108f0 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57  t, *pLeft;.    W
10900 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65  hereTerm *pNewTe
10910 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20  rm;.    Bitmask 
10920 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72  prereqColumn, pr
10930 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20 70  ereqExpr;..    p
10940 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
10950 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
10960 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20  pr;.    pLeft = 
10970 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
10980 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
10990 70 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70  prereqExpr = exp
109a0 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
109b0 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  kSet, pRight);. 
109c0 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20     prereqColumn 
109d0 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
109e0 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74  (pMaskSet, pLeft
109f0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72  );.    if( (prer
10a00 65 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43  eqExpr & prereqC
10a10 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  olumn)==0 ){.   
10a20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
10a30 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70  r;.      pNewExp
10a40 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
10a50 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43  (pParse, TK_MATC
10a60 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  H, .            
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a80 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72    0, sqlite3Expr
10a90 44 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c 20  Dup(db, pRight, 
10aa0 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  0), 0);.      id
10ab0 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
10ac0 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
10ad0 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
10ae0 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
10af0 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
10b00 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
10b10 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20  .      pNewTerm 
10b20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
10b30 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ];.      pNewTer
10b40 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
10b50 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20 20   prereqExpr;.   
10b60 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66     pNewTerm->lef
10b70 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
10b80 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
10b90 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  NewTerm->u.leftC
10ba0 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
10bb0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
10bc0 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  ewTerm->eOperato
10bd0 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20  r = WO_MATCH;.  
10be0 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50      pNewTerm->iP
10bf0 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
10c00 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
10c10 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
10c20 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
10c30 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
10c40 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
10c50 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
10c60 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
10c70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d  rereqAll = pTerm
10c80 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  ->prereqAll;.   
10c90 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
10ca0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
10cb0 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
10cc0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
10cd0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 29 20 7c  _ENABLE_STAT4) |
10ce0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
10cf0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 0a 20  _ENABLE_STAT3). 
10d00 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f   /* When sqlite_
10d10 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20  stat3 histogram 
10d20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
10d30 65 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66  e an operator of
10d40 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22   the.  ** form "
10d50 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63  x IS NOT NULL" c
10d60 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20  an sometimes be 
10d70 65 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65  evaluated more e
10d80 66 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20  fficiently.  ** 
10d90 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78  as "x>NULL" if x
10da0 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
10db0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  ER PRIMARY KEY. 
10dc0 20 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a   So construct a.
10dd0 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72    ** virtual ter
10de0 6d 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a  m of that form..
10df0 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
10e00 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20  hat the virtual 
10e10 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67  term must be tag
10e20 67 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e  ged with TERM_VN
10e30 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ULL.  This.  ** 
10e40 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77  TERM_VNULL tag w
10e50 69 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65  ill suppress the
10e60 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
10e70 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
10e80 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f  .  ** of the loo
10e90 70 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20  p.  Without the 
10ea0 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c  TERM_VNULL flag,
10eb0 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68   the not-null ch
10ec0 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  eck at.  ** the 
10ed0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f  start of the loo
10ee0 70 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61  p will prevent a
10ef0 6e 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ny results from 
10f00 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a  being returned..
10f10 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
10f20 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op==TK_NOTNULL
10f30 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
10f40 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
10f50 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  MN.   && pExpr->
10f60 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pLeft->iColumn>=
10f70 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  0.   && Optimiza
10f80 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
10f90 53 51 4c 49 54 45 5f 53 74 61 74 33 29 0a 20 20  SQLITE_Stat3).  
10fa0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
10fb0 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  wExpr;.    Expr 
10fc0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
10fd0 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69  pLeft;.    int i
10fe0 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65  dxNew;.    Where
10ff0 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
11000 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20  .    pNewExpr = 
11010 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
11020 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20  rse, TK_GT,.    
11030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
11050 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
11060 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70    sqlite3PExpr(p
11090 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
110a0 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20  0, 0, 0), 0);.. 
110b0 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
110c0 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
110d0 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20  C, pNewExpr,.   
110e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110f0 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f             TERM_
11100 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
11110 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29  AMIC|TERM_VNULL)
11120 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77  ;.    if( idxNew
11130 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   ){.      pNewTe
11140 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
11150 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
11160 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
11170 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  t = 0;.      pNe
11180 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
11190 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
111a0 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
111b0 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
111c0 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
111d0 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
111e0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
111f0 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  _GT;.      pNewT
11200 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
11210 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
11220 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
11230 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
11240 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
11250 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
11260 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
11270 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
11280 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
11290 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
112a0 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
112b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
112c0 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20  NABLE_STAT */.. 
112d0 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63   /* Prevent ON c
112e0 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61  lause terms of a
112f0 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20   LEFT JOIN from 
11300 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72  being used to dr
11310 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ive.  ** an inde
11320 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20  x for tables to 
11330 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
11340 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65  join..  */.  pTe
11350 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
11360 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d  |= extraRight;.}
11370 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11380 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 70  ction searches p
11390 4c 69 73 74 20 66 6f 72 20 61 20 65 6e 74 72 79  List for a entry
113a0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
113b0 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
113c0 0a 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70 49 64  .** of index pId
113d0 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68  x..**.** If such
113e0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
113f0 73 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64  s found, its ind
11400 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d  ex in pList->a[]
11410 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
11420 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f  .** no expressio
11430 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69  n is found, -1 i
11440 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
11450 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e  tatic int findIn
11460 64 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20  dexCol(.  Parse 
11470 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
11490 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
114a0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114c0 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69  /* Expression li
114d0 73 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  st to search */.
114e0 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20    int iBase,    
114f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11500 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20    /* Cursor for 
11510 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
11520 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20   with pIdx */.  
11530 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
11540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11550 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63  /* Index to matc
11560 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20  h column of */. 
11570 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20   int iCol       
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11590 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e   /* Column of in
115a0 64 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a  dex to match */.
115b0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  ){.  int i;.  co
115c0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
115d0 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
115e0 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Col];..  for(i=0
115f0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
11600 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
11610 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70   *p = sqlite3Exp
11620 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
11630 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
11640 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
11650 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26  TK_COLUMN.     &
11660 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  & p->iColumn==pI
11670 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f  dx->aiColumn[iCo
11680 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54  l].     && p->iT
11690 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20  able==iBase.    
116a0 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
116b0 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
116c0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
116d0 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
116e0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  .pExpr);.      i
116f0 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29  f( ALWAYS(pColl)
11700 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
11710 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
11720 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
11730 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
11740 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11750 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  }..  return -1;.
11760 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11770 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  true if the DIST
11780 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d  INCT expression-
11790 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
117a0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
117b0 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e  t.** is redundan
117c0 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49  t..**.** A DISTI
117d0 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75  NCT list is redu
117e0 6e 64 61 6e 74 20 69 66 20 74 68 65 20 64 61 74  ndant if the dat
117f0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73  abase contains s
11800 6f 6d 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  ome subset of.**
11810 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
11820 65 20 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e  e unique and non
11830 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  -null..*/.static
11840 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52   int isDistinctR
11850 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73  edundant(.  Pars
11860 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11870 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11880 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
11890 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
118a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
118b0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
118c0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
118d0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
118e0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
118f0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
11900 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20  stinct       /* 
11910 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  The result set t
11920 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
11930 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20  DISTINCT */.){. 
11940 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
11950 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
11960 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
11980 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20    int iBase;..  
11990 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d  /* If there is m
119a0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62  ore than one tab
119b0 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74  le or sub-select
119c0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
119d0 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  use of.  ** this
119e0 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
119f0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
11a00 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61  ible to show tha
11a10 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a  t the DISTINCT .
11a20 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72    ** clause is r
11a30 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69  edundant. */.  i
11a40 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
11a50 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
11a60 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c  .  iBase = pTabL
11a70 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
11a80 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62  r;.  pTab = pTab
11a90 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  List->a[0].pTab;
11aa0 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..  /* If any of
11ab0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
11ac0 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d   is an IPK colum
11ad0 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65  n on table iBase
11ae0 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20  , then return . 
11af0 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20   ** true. Note: 
11b00 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d  The (p->iTable==
11b10 69 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74  iBase) part of t
11b20 68 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20  his test may be 
11b30 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a  false if the.  *
11b40 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  * current SELECT
11b50 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
11b60 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f   sub-query..  */
11b70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44  .  for(i=0; i<pD
11b80 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20  istinct->nExpr; 
11b90 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
11ba0 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
11bb0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74  kipCollate(pDist
11bc0 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  inct->a[i].pExpr
11bd0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  );.    if( p->op
11be0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
11bf0 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20  ->iTable==iBase 
11c00 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  && p->iColumn<0 
11c10 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
11c20 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
11c30 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  gh all indices o
11c40 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65  n the table, che
11c50 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65  cking each to se
11c60 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20  e if it makes.  
11c70 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ** the DISTINCT 
11c80 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64  qualifier redund
11c90 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20  ant. It does so 
11ca0 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  if:.  **.  **   
11cb0 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  1. The index is 
11cc0 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61  itself UNIQUE, a
11cd0 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  nd.  **.  **   2
11ce0 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c  . All of the col
11cf0 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
11d00 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72  x are either par
11d10 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e  t of the pDistin
11d20 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73  ct.  **      lis
11d30 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57  t, or else the W
11d40 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
11d50 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ains a term of t
11d60 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c  he form "col=X",
11d70 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65  .  **      where
11d80 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74   X is a constant
11d90 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c   value. The coll
11da0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
11db0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  of the.  **     
11dc0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20   comparison and 
11dd0 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72  select-list expr
11de0 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74  essions must mat
11df0 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20  ch those of the 
11e00 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
11e10 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f     3. All of tho
11e20 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  se index columns
11e30 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57   for which the W
11e40 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73  HERE clause does
11e50 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63   not.  **      c
11e60 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22  ontain a "col=X"
11e70 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63   term are subjec
11e80 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20  t to a NOT NULL 
11e90 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
11ea0 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
11eb0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
11ec0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
11ed0 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  ){.    if( pIdx-
11ee0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
11ef0 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
11f00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
11f10 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
11f20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
11f30 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
11f40 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  n[i];.      if( 
11f50 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c  0==findTerm(pWC,
11f60 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28   iBase, iCol, ~(
11f70 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51  Bitmask)0, WO_EQ
11f80 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  , pIdx) ){.     
11f90 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d     int iIdxCol =
11fa0 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50   findIndexCol(pP
11fb0 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c  arse, pDistinct,
11fc0 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29   iBase, pIdx, i)
11fd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 49  ;.        if( iI
11fe0 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d  dxCol<0 || pTab-
11ff0 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
12000 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c  lumn[i]].notNull
12010 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12020 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
12030 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
12040 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d      if( i==pIdx-
12050 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
12060 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
12070 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65  implies that the
12080 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
12090 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74  ier is redundant
120a0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
120b0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 1;.    }.  }..
120c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
120d0 2a 20 0a 2a 2a 20 46 69 6e 64 20 28 61 6e 20 61  * .** Find (an a
120e0 70 70 72 6f 78 69 6d 61 74 65 29 20 73 75 6d 20  pproximate) sum 
120f0 6f 66 20 74 77 6f 20 57 68 65 72 65 43 6f 73 74  of two WhereCost
12100 73 2e 20 20 54 68 69 73 20 63 6f 6d 70 75 74 61  s.  This computa
12110 74 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 61  tion is.** not a
12120 20 73 69 6d 70 6c 65 20 22 2b 22 20 6f 70 65 72   simple "+" oper
12130 61 74 6f 72 20 62 65 63 61 75 73 65 20 57 68 65  ator because Whe
12140 72 65 43 6f 73 74 20 69 73 20 73 74 6f 72 65 64  reCost is stored
12150 20 61 73 20 61 20 6c 6f 67 61 72 69 74 68 6d 69   as a logarithmi
12160 63 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 20 0a  c.** value..** .
12170 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43  */.static WhereC
12180 6f 73 74 20 77 68 65 72 65 43 6f 73 74 41 64 64  ost whereCostAdd
12190 28 57 68 65 72 65 43 6f 73 74 20 61 2c 20 57 68  (WhereCost a, Wh
121a0 65 72 65 43 6f 73 74 20 62 29 7b 0a 20 20 73 74  ereCost b){.  st
121b0 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
121c0 6e 65 64 20 63 68 61 72 20 78 5b 5d 20 3d 20 7b  ned char x[] = {
121d0 0a 20 20 20 20 20 31 30 2c 20 31 30 2c 20 20 20  .     10, 10,   
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 20 20 20 20 20 2f 2a 20 30 2c 31 20 2a 2f 0a        /* 0,1 */.
12200 20 20 20 20 20 20 39 2c 20 39 2c 20 20 20 20 20        9, 9,     
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12220 20 20 20 20 20 2f 2a 20 32 2c 33 20 2a 2f 0a 20       /* 2,3 */. 
12230 20 20 20 20 20 38 2c 20 38 2c 20 20 20 20 20 20       8, 8,      
12240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12250 20 20 20 20 2f 2a 20 34 2c 35 20 2a 2f 0a 20 20      /* 4,5 */.  
12260 20 20 20 20 37 2c 20 37 2c 20 37 2c 20 20 20 20      7, 7, 7,    
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 20 20 20 2f 2a 20 36 2c 37 2c 38 20 2a 2f 0a 20     /* 6,7,8 */. 
12290 20 20 20 20 20 36 2c 20 36 2c 20 36 2c 20 20 20       6, 6, 6,   
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122b0 20 20 20 20 2f 2a 20 39 2c 31 30 2c 31 31 20 2a      /* 9,10,11 *
122c0 2f 0a 20 20 20 20 20 20 35 2c 20 35 2c 20 35 2c  /.      5, 5, 5,
122d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122e0 20 20 20 20 20 20 20 2f 2a 20 31 32 2d 31 34 20         /* 12-14 
122f0 2a 2f 0a 20 20 20 20 20 20 34 2c 20 34 2c 20 34  */.      4, 4, 4
12300 2c 20 34 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 4,            
12310 20 20 20 20 20 20 20 20 2f 2a 20 31 35 2d 31 38          /* 15-18
12320 20 2a 2f 0a 20 20 20 20 20 20 33 2c 20 33 2c 20   */.      3, 3, 
12330 33 2c 20 33 2c 20 33 2c 20 33 2c 20 20 20 20 20  3, 3, 3, 3,     
12340 20 20 20 20 20 20 20 20 20 2f 2a 20 31 39 2d 32           /* 19-2
12350 34 20 2a 2f 0a 20 20 20 20 20 20 32 2c 20 32 2c  4 */.      2, 2,
12360 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20   2, 2, 2, 2, 2, 
12370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 35 2d            /* 25-
12380 33 31 20 2a 2f 0a 20 20 7d 3b 0a 20 20 69 66 28  31 */.  };.  if(
12390 20 61 3e 3d 62 20 29 7b 0a 20 20 20 20 69 66 28   a>=b ){.    if(
123a0 20 61 3e 62 2b 34 39 20 29 20 72 65 74 75 72 6e   a>b+49 ) return
123b0 20 61 3b 0a 20 20 20 20 69 66 28 20 61 3e 62 2b   a;.    if( a>b+
123c0 33 31 20 29 20 72 65 74 75 72 6e 20 61 2b 31 3b  31 ) return a+1;
123d0 0a 20 20 20 20 72 65 74 75 72 6e 20 61 2b 78 5b  .    return a+x[
123e0 61 2d 62 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  a-b];.  }else{. 
123f0 20 20 20 69 66 28 20 62 3e 61 2b 34 39 20 29 20     if( b>a+49 ) 
12400 72 65 74 75 72 6e 20 62 3b 0a 20 20 20 20 69 66  return b;.    if
12410 28 20 62 3e 61 2b 33 31 20 29 20 72 65 74 75 72  ( b>a+31 ) retur
12420 6e 20 62 2b 31 3b 0a 20 20 20 20 72 65 74 75 72  n b+1;.    retur
12430 6e 20 62 2b 78 5b 62 2d 61 5d 3b 0a 20 20 7d 0a  n b+x[b-a];.  }.
12440 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
12450 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f   an integer into
12460 20 61 20 57 68 65 72 65 43 6f 73 74 2e 20 20 49   a WhereCost.  I
12470 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 63  n other words, c
12480 6f 6d 70 75 74 65 20 61 0a 2a 2a 20 67 6f 6f 64  ompute a.** good
12490 20 61 70 70 72 6f 78 69 6d 61 74 61 74 69 6f 6e   approximatation
124a0 20 66 6f 72 20 31 30 2a 6c 6f 67 32 28 78 29 2e   for 10*log2(x).
124b0 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
124c0 43 6f 73 74 20 77 68 65 72 65 43 6f 73 74 28 74  Cost whereCost(t
124d0 52 6f 77 63 6e 74 20 78 29 7b 0a 20 20 73 74 61  Rowcnt x){.  sta
124e0 74 69 63 20 57 68 65 72 65 43 6f 73 74 20 61 5b  tic WhereCost a[
124f0 5d 20 3d 20 7b 20 30 2c 20 32 2c 20 33 2c 20 35  ] = { 0, 2, 3, 5
12500 2c 20 36 2c 20 37 2c 20 38 2c 20 39 20 7d 3b 0a  , 6, 7, 8, 9 };.
12510 20 20 57 68 65 72 65 43 6f 73 74 20 79 20 3d 20    WhereCost y = 
12520 34 30 3b 0a 20 20 69 66 28 20 78 3c 38 20 29 7b  40;.  if( x<8 ){
12530 0a 20 20 20 20 69 66 28 20 78 3c 32 20 29 20 72  .    if( x<2 ) r
12540 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69  eturn 0;.    whi
12550 6c 65 28 20 78 3c 38 20 29 7b 20 20 79 20 2d 3d  le( x<8 ){  y -=
12560 20 31 30 3b 20 78 20 3c 3c 3d 20 31 3b 20 7d 0a   10; x <<= 1; }.
12570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
12580 6c 65 28 20 78 3e 32 35 35 20 29 7b 20 79 20 2b  le( x>255 ){ y +
12590 3d 20 34 30 3b 20 78 20 3e 3e 3d 20 34 3b 20 7d  = 40; x >>= 4; }
125a0 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3e 31 35  .    while( x>15
125b0 20 29 7b 20 20 79 20 2b 3d 20 31 30 3b 20 78 20   ){  y += 10; x 
125c0 3e 3e 3d 20 31 3b 20 7d 0a 20 20 7d 0a 20 20 72  >>= 1; }.  }.  r
125d0 65 74 75 72 6e 20 61 5b 78 26 37 5d 20 2b 20 79  eturn a[x&7] + y
125e0 20 2d 20 31 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65   - 10;.}..#ifnde
125f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
12600 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
12610 20 43 6f 6e 76 65 72 74 20 61 20 64 6f 75 62 6c   Convert a doubl
12620 65 20 28 61 73 20 72 65 63 65 69 76 65 64 20 66  e (as received f
12630 72 6f 6d 20 78 42 65 73 74 49 6e 64 65 78 20 6f  rom xBestIndex o
12640 66 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  f a virtual tabl
12650 65 29 0a 2a 2a 20 69 6e 74 6f 20 61 20 57 68 65  e).** into a Whe
12660 72 65 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65  reCost.  In othe
12670 72 20 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65  r words, compute
12680 20 61 6e 20 61 70 70 72 6f 78 69 6d 61 74 69 6f   an approximatio
12690 6e 20 66 6f 72 0a 2a 2a 20 31 30 2a 6c 6f 67 32  n for.** 10*log2
126a0 28 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  (x)..*/.static W
126b0 68 65 72 65 43 6f 73 74 20 77 68 65 72 65 43 6f  hereCost whereCo
126c0 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 64 6f 75  stFromDouble(dou
126d0 62 6c 65 20 78 29 7b 0a 20 20 75 36 34 20 61 3b  ble x){.  u64 a;
126e0 0a 20 20 57 68 65 72 65 43 6f 73 74 20 65 3b 0a  .  WhereCost e;.
126f0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
12700 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66  (x)==8 && sizeof
12710 28 61 29 3d 3d 38 20 29 3b 0a 20 20 69 66 28 20  (a)==8 );.  if( 
12720 78 3c 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  x<=1 ) return 0;
12730 0a 20 20 69 66 28 20 78 3c 3d 32 30 30 30 30 30  .  if( x<=200000
12740 30 30 30 30 20 29 20 72 65 74 75 72 6e 20 77 68  0000 ) return wh
12750 65 72 65 43 6f 73 74 28 28 74 52 6f 77 63 6e 74  ereCost((tRowcnt
12760 29 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61  )x);.  memcpy(&a
12770 2c 20 26 78 2c 20 38 29 3b 0a 20 20 65 20 3d 20  , &x, 8);.  e = 
12780 28 61 3e 3e 35 32 29 20 2d 20 31 30 32 32 3b 0a  (a>>52) - 1022;.
12790 20 20 72 65 74 75 72 6e 20 65 2a 31 30 3b 0a 7d    return e*10;.}
127a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
127b0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
127c0 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 73  BLE */../*.** Es
127d0 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72  timate the logar
127e0 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75  ithm of the inpu
127f0 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20  t value to base 
12800 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  2..*/.static Whe
12810 72 65 43 6f 73 74 20 65 73 74 4c 6f 67 28 57 68  reCost estLog(Wh
12820 65 72 65 43 6f 73 74 20 4e 29 7b 0a 20 20 57 68  ereCost N){.  Wh
12830 65 72 65 43 6f 73 74 20 78 20 3d 20 77 68 65 72  ereCost x = wher
12840 65 43 6f 73 74 28 4e 29 3b 0a 20 20 72 65 74 75  eCost(N);.  retu
12850 72 6e 20 78 3e 33 33 20 3f 20 78 20 2d 20 33 33  rn x>33 ? x - 33
12860 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   : 0;.}../*.** T
12870 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  wo routines for 
12880 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e  printing the con
12890 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74  tent of an sqlit
128a0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a  e3_index_info.**
128b0 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65   structure.  Use
128c0 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
128d0 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
128e0 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  .  If neither.**
128f0 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20   SQLITE_TEST or 
12900 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65  SQLITE_DEBUG are
12910 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
12920 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a  hese routines.**
12930 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a   are no-ops..*/.
12940 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
12950 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
12960 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
12970 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
12980 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69  BLED).static voi
12990 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  d TRACE_IDX_INPU
129a0 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
129b0 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
129c0 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
129d0 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
129e0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
129f0 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
12a00 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
12a10 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12a20 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25  ("  constraint[%
12a30 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69  d]: col=%d termi
12a40 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c  d=%d op=%d usabl
12a50 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ed=%d\n",.      
12a60 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
12a70 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f  onstraint[i].iCo
12a80 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
12a90 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
12aa0 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20  TermOffset,.    
12ab0 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
12ac0 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20  t[i].op,.       
12ad0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
12ae0 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20  ].usable);.  }. 
12af0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
12b00 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
12b10 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
12b20 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79  rintf("  orderby
12b30 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73  [%d]: col=%d des
12b40 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
12b50 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  i,.       p->aOr
12b60 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
12b70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
12b80 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20  erBy[i].desc);. 
12b90 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
12ba0 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
12bb0 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
12bc0 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
12bd0 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
12be0 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
12bf0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
12c00 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
12c10 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
12c20 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12c30 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61  ("  usage[%d]: a
12c40 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25  rgvIdx=%d omit=%
12c50 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
12c60 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
12c70 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
12c80 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  gvIndex,.       
12c90 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
12ca0 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20  age[i].omit);.  
12cb0 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
12cc0 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d  Printf("  idxNum
12cd0 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75  =%d\n", p->idxNu
12ce0 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
12cf0 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53  ugPrintf("  idxS
12d00 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78  tr=%s\n", p->idx
12d10 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
12d20 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
12d30 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64  derByConsumed=%d
12d40 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43  \n", p->orderByC
12d50 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69  onsumed);.  sqli
12d60 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12d70 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d    estimatedCost=
12d80 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61  %g\n", p->estima
12d90 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73  tedCost);.}.#els
12da0 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  e.#define TRACE_
12db0 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64  IDX_INPUTS(A).#d
12dc0 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
12dd0 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69  OUTPUTS(A).#endi
12de0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
12df0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
12e00 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74  _INDEX./*.** Ret
12e10 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
12e20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
12e30 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20  m pTerm is of a 
12e40 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a  form where it.**
12e50 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77   could be used w
12e60 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ith an index to 
12e70 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73  access pSrc, ass
12e80 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72  uming an appropr
12e90 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78  iate.** index ex
12ea0 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  isted..*/.static
12eb0 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76   int termCanDriv
12ec0 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54  eIndex(.  WhereT
12ed0 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20  erm *pTerm,     
12ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
12ef0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  E clause term to
12f00 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75   check */.  stru
12f10 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
12f20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61  *pSrc,     /* Ta
12f30 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e  ble we are tryin
12f40 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20  g to access */. 
12f50 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
12f60 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
12f70 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74  /* Tables in out
12f80 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20  er loops of the 
12f90 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  join */.){.  cha
12fa0 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65  r aff;.  if( pTe
12fb0 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
12fc0 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
12fd0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
12fe0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
12ff0 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20  r & WO_EQ)==0 ) 
13000 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
13010 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
13020 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21  ght & notReady)!
13030 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
13040 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65   if( pTerm->u.le
13050 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  ftColumn<0 ) ret
13060 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70  urn 0;.  aff = p
13070 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  Src->pTab->aCol[
13080 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
13090 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  umn].affinity;. 
130a0 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
130b0 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65  exAffinityOk(pTe
130c0 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20  rm->pExpr, aff) 
130d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
130e0 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
130f0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
13100 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
13110 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e  _INDEX./*.** Gen
13120 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f  erate code to co
13130 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
13140 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20  x object for an 
13150 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a  automatic index.
13160 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70  ** and to set up
13170 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20   the WhereLevel 
13180 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f  object pLevel so
13190 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67   that the code g
131a0 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65  enerator.** make
131b0 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74  s use of the aut
131c0 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f  omatic index..*/
131d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
131e0 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
131f0 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
13200 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
13210 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
13220 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
13230 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
13240 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
13250 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
13260 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
13270 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
13280 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
13290 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20  use term to get 
132a0 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a  the next index *
132b0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
132c0 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
132d0 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
132e0 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
132f0 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57  available */.  W
13300 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
13310 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
13320 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65  ite new index he
13330 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
13340 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
13350 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
13360 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
13370 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  he constructed i
13380 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54  ndex */.  WhereT
13390 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
133a0 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
133b0 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
133c0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
133d0 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
133e0 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  d;          /* E
133f0 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a  nd of pWC->a[] *
13400 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
13410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13420 2f 2a 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72  /* Byte of memor
13430 79 20 6e 65 65 64 65 64 20 66 6f 72 20 70 49 64  y needed for pId
13440 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
13450 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
13460 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
13470 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
13480 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
13490 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
134a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
134b0 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
134c0 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
134d0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
134e0 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
134f0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
13500 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
13510 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
13520 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
13530 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
13540 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
13550 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
13560 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
13570 65 79 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyinfo;         
13580 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
13590 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ion for the inde
135a0 78 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64  x */   .  int ad
135b0 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
135c0 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
135d0 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
135e0 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
135f0 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
13600 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
13610 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
13620 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
13630 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
13640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
13650 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
13660 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13680 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
13690 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
136b0 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
136c0 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
136d0 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
136e0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
136f0 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
13700 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
13710 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
13720 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
13730 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
13740 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
13750 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b  Bitmask idxCols;
13760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
13770 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73  itmap of columns
13780 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69   used for indexi
13790 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
137a0 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20  extraCols;      
137b0 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
137c0 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
137d0 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74  mns */.  u8 sent
137e0 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20  Warning = 0;    
137f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
13800 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62  a warnning has b
13810 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 0a 20  een issued */.. 
13820 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
13830 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
13840 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
13850 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
13860 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
13870 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
13880 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
13890 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
138a0 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
138b0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
138c0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
138d0 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20  );.  addrInit = 
138e0 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
138f0 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 43  pParse);..  /* C
13900 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
13910 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
13920 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
13930 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
13940 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
13950 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
13960 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
13970 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70  nColumn = 0;.  p
13980 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
13990 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
139a0 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
139b0 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  m];.  pLoop = pL
139c0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
139d0 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
139e0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
139f0 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
13a00 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
13a10 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
13a20 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
13a30 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
13a40 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
13a50 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
13a60 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
13a70 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
13a80 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
13a90 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
13aa0 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ol);.      testc
13ab0 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
13ac0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13ad0 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
13ae0 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e 74  .      if( !sent
13af0 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20  Warning ){.     
13b00 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
13b10 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55  QLITE_WARNING_AU
13b20 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20 20  TOINDEX,.       
13b30 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63 20       "automatic 
13b40 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29 22  index on %s(%s)"
13b50 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
13b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61  .            pTa
13b70 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  ble->aCol[iCol].
13b80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
13b90 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b  sentWarning = 1;
13ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13bb0 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
13bc0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
13bd0 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
13be0 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64  Resize(pParse->d
13bf0 62 2c 20 70 4c 6f 6f 70 2c 20 6e 43 6f 6c 75 6d  b, pLoop, nColum
13c00 6e 2b 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  n+1) ) return;. 
13c10 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
13c20 54 65 72 6d 5b 6e 43 6f 6c 75 6d 6e 2b 2b 5d 20  Term[nColumn++] 
13c30 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
13c40 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
13c50 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
13c60 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
13c70 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c  Column>0 );.  pL
13c80 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
13c90 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
13ca0 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 4c   = nColumn;.  pL
13cb0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
13cc0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
13cd0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
13ce0 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a  | WHERE_INDEXED.
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d00 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54       | WHERE_AUT
13d10 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43  O_INDEX;..  /* C
13d20 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
13d30 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
13d40 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
13d50 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
13d60 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
13d70 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
13d80 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
13d90 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
13da0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
13db0 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
13dc0 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
13dd0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
13de0 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
13df0 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
13e00 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
13e10 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
13e20 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
13e30 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
13e40 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
13e50 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
13e60 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
13e70 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
13e80 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
13e90 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
13ea0 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
13eb0 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
13ec0 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
13ed0 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
13ee0 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
13ef0 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
13f00 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54  dxCols | MASKBIT
13f10 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69  (BMS-1));.  mxBi
13f20 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e  tCol = (pTable->
13f30 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f  nCol >= BMS-1) ?
13f40 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d   BMS-1 : pTable-
13f50 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73  >nCol;.  testcas
13f60 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  e( pTable->nCol=
13f70 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74  =BMS-1 );.  test
13f80 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
13f90 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66  ol==BMS-2 );.  f
13fa0 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43  or(i=0; i<mxBitC
13fb0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
13fc0 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41  ( extraCols & MA
13fd0 53 4b 42 49 54 28 69 29 20 29 20 6e 43 6f 6c 75  SKBIT(i) ) nColu
13fe0 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  mn++;.  }.  if( 
13ff0 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
14000 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
14010 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d  {.    nColumn +=
14020 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20   pTable->nCol - 
14030 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70  BMS + 1;.  }.  p
14040 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
14050 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
14060 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   | WHERE_IDX_ONL
14070 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75  Y;..  /* Constru
14080 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
14090 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  ect to describe 
140a0 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
140b0 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49  nByte = sizeof(I
140c0 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65 20 2b  ndex);.  nByte +
140d0 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
140e0 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49 6e  (int);     /* In
140f0 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a  dex.aiColumn */.
14100 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
14110 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  mn*sizeof(char*)
14120 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43  ;   /* Index.azC
14130 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  oll */.  nByte +
14140 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  = nColumn;      
14150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
14160 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
14170 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74  /.  pIdx = sqlit
14180 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
14190 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65  Parse->db, nByte
141a0 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
141b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f   ) return;.  pLo
141c0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
141d0 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64  ex = pIdx;.  pId
141e0 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
141f0 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20  r**)&pIdx[1];.  
14200 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  pIdx->aiColumn =
14210 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a   (int*)&pIdx->az
14220 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20  Coll[nColumn];. 
14230 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
14240 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d 3e  r = (u8*)&pIdx->
14250 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e  aiColumn[nColumn
14260 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  ];.  pIdx->zName
14270 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
14280 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .  pIdx->nColumn
14290 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49   = nColumn;.  pI
142a0 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  dx->pTable = pTa
142b0 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  ble;.  n = 0;.  
142c0 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
142d0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
142e0 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
142f0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
14300 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
14310 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
14320 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
14330 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
14340 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
14350 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
14360 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
14370 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
14380 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
14390 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ol);.      testc
143a0 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
143b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
143c0 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b  se( iCol==BMS );
143d0 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
143e0 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
143f0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
14400 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
14410 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  pr;.        idxC
14420 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
14430 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
14440 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d  lumn[n] = pTerm-
14450 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
14460 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
14470 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
14480 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
14490 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
144a0 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
144b0 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
144c0 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c  n] = ALWAYS(pCol
144d0 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  l) ? pColl->zNam
144e0 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  e : "BINARY";.  
144f0 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
14500 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
14510 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70  ssert( (u32)n==p
14520 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
14530 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61  q );..  /* Add a
14540 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
14550 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65  s needed to make
14560 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
14570 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  ndex into.  ** a
14580 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
14590 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
145a0 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
145b0 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
145c0 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29  s & MASKBIT(i) )
145d0 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
145e0 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
145f0 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
14600 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[n] = "BINARY";
14610 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
14620 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  }.  }.  if( pSrc
14630 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
14640 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20  BIT(BMS-1) ){.  
14650 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69    for(i=BMS-1; i
14660 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
14670 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ++){.      pIdx-
14680 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
14690 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
146a0 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
146b0 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
146c0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
146d0 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b  t( n==nColumn );
146e0 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
146f0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
14700 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20  x */.  pKeyinfo 
14710 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
14720 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
14730 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dx);.  assert( p
14740 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d  Level->iIdxCur>=
14750 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69  0 );.  pLevel->i
14760 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  IdxCur = pParse-
14770 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74  >nTab++;.  sqlit
14780 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14790 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78  OP_OpenAutoindex
147a0 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
147b0 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c  r, nColumn+1, 0,
147c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
147d0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
147e0 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  info, P4_KEYINFO
147f0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62  _HANDOFF);.  Vdb
14800 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f  eComment((v, "fo
14810 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  r %s", pTable->z
14820 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69  Name));..  /* Fi
14830 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ll the automatic
14840 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74   index with cont
14850 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  ent */.  addrTop
14860 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14870 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
14880 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  d, pLevel->iTabC
14890 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64  ur);.  regRecord
148a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
148b0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
148c0 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
148d0 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
148e0 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  pIdx, pLevel->iT
148f0 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  abCur, regRecord
14900 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 1, 0);.  sqlit
14910 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14920 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c  OP_IdxInsert, pL
14930 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72  evel->iIdxCur, r
14940 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
14950 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
14960 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
14970 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
14980 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14990 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65  , OP_Next, pLeve
149a0 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72  l->iTabCur, addr
149b0 54 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Top+1);.  sqlite
149c0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
149d0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
149e0 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20  US_AUTOINDEX);. 
149f0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
14a00 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29  Here(v, addrTop)
14a10 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
14a20 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
14a30 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
14a40 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
14a50 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68  when skipping th
14a60 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
14a70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
14a80 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
14a90 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  rInit);.}.#endif
14aa0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
14ab0 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
14ac0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
14ad0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
14ae0 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ABLE./*.** Alloc
14af0 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
14b00 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
14b10 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
14b20 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
14b30 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
14b40 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
14b50 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
14b60 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  se the structure
14b70 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74  .** by passing t
14b80 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
14b90 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
14ba0 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f  tion to sqlite3_
14bb0 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
14bc0 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  c sqlite3_index_
14bd0 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e  info *allocateIn
14be0 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65  dexInfo(.  Parse
14bf0 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65 72   *pParse,.  Wher
14c00 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20  eClause *pWC,.  
14c10 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
14c20 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70  tem *pSrc,.  Exp
14c30 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a  rList *pOrderBy.
14c40 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
14c50 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74   int nTerm;.  st
14c60 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14c70 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
14c80 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
14c90 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
14ca0 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64  orderby *pIdxOrd
14cb0 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73  erBy;.  struct s
14cc0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
14cd0 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
14ce0 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
14cf0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
14d00 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c   nOrderBy;.  sql
14d10 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
14d20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  *pIdxInfo;..  /*
14d30 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
14d40 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48  r of possible WH
14d50 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
14d60 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67  raints referring
14d70 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69  .  ** to this vi
14d80 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
14d90 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20   for(i=nTerm=0, 
14da0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
14db0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
14dc0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
14dd0 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
14de0 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
14df0 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
14e00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73  ;.    assert( Is
14e10 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d  PowerOfTwo(pTerm
14e20 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57  ->eOperator & ~W
14e30 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20  O_EQUIV) );.    
14e40 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
14e50 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
14e60 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IN );.    testca
14e70 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
14e80 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
14e90 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72   );.    if( pTer
14ea0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
14eb0 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e  WO_ISNULL) ) con
14ec0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
14ed0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
14ee0 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
14ef0 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d  tinue;.    nTerm
14f00 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ++;.  }..  /* If
14f10 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
14f20 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  ause contains on
14f30 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ly columns in th
14f40 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20  e current .  ** 
14f50 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
14f60 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  en allocate spac
14f70 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72  e for the aOrder
14f80 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20  By part of.  ** 
14f90 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
14fa0 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
14fb0 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42  ..  */.  nOrderB
14fc0 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72  y = 0;.  if( pOr
14fd0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74  derBy ){.    int
14fe0 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e   n = pOrderBy->n
14ff0 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Expr;.    for(i=
15000 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
15010 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
15020 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
15030 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
15040 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
15050 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d  COLUMN || pExpr-
15060 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69  >iTable!=pSrc->i
15070 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
15080 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
15090 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65  =n){.      nOrde
150a0 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20  rBy = n;.    }. 
150b0 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
150c0 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  e the sqlite3_in
150d0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
150e0 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  re.  */.  pIdxIn
150f0 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
15100 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
15110 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64  >db, sizeof(*pId
15120 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20  xInfo).         
15130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15140 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64    + (sizeof(*pId
15150 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28  xCons) + sizeof(
15160 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a  *pUsage))*nTerm.
15170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15180 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
15190 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79  eof(*pIdxOrderBy
151a0 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  )*nOrderBy );.  
151b0 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
151c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
151d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
151e0 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
151f0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
15200 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
15210 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
15220 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
15230 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
15240 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
15250 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
15260 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
15270 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
15280 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
15290 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
152a0 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
152b0 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
152c0 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
152d0 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
152e0 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
152f0 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  ds..  */.  pIdxC
15300 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
15310 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
15320 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66  traint*)&pIdxInf
15330 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  o[1];.  pIdxOrde
15340 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
15350 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
15360 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
15370 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
15380 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
15390 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
153a0 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
153b0 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
153c0 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
153d0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
153e0 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
153f0 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
15400 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
15410 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
15420 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
15430 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
15440 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
15450 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
15460 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
15470 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
15480 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
15490 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
154a0 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
154b0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
154c0 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
154d0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
154e0 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15530 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  pUsage;..  for(i
15540 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
15550 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
15560 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
15570 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20  .    u8 op;.    
15580 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
15590 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
155a0 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
155b0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
155c0 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
155d0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
155e0 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
155f0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
15600 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
15610 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
15620 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
15630 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
15640 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  L );.    if( pTe
15650 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
15660 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  (WO_ISNULL) ) co
15670 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
15680 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
15690 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
156a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
156b0 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
156c0 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
156d0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
156e0 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
156f0 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
15700 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
15710 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
15720 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
15730 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
15740 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
15750 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20  op = op;.    /* 
15760 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67  The direct assig
15770 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65  nment in the pre
15780 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f  vious line is po
15790 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61  ssible only beca
157a0 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57  use.    ** the W
157b0 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
157c0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
157d0 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
157e0 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  cal.  The.    **
157f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
15800 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
15810 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  act. */.    asse
15820 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
15830 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
15840 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73  NT_EQ );.    ass
15850 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
15860 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
15870 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73  INT_LT );.    as
15880 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
15890 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
158a0 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61  AINT_LE );.    a
158b0 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
158c0 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
158d0 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
158e0 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
158f0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
15900 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
15910 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43   assert( WO_MATC
15920 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  H==SQLITE_INDEX_
15930 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
15940 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15950 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
15960 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   & (WO_IN|WO_EQ|
15970 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
15980 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
15990 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  ) );.    j++;.  
159a0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
159b0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
159c0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
159d0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
159e0 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f  pExpr;.    pIdxO
159f0 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
15a00 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
15a10 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  mn;.    pIdxOrde
15a20 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
15a30 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
15a40 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  tOrder;.  }..  r
15a50 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
15a60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
15a70 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
15a80 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
15a90 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
15aa0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
15ab0 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
15ac0 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
15ad0 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
15ae0 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
15af0 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
15b00 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
15b10 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
15b20 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
15b30 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74  ex_info object t
15b40 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20  hat.** comes in 
15b50 61 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d  as the 3rd argum
15b60 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
15b70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
15b80 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
15b90 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61  pParse is popula
15ba0 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
15bb0 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a  r message and a.
15bc0 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
15bd0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
15be0 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
15bf0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
15c00 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f  output.** part o
15c10 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
15c20 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
15c30 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c  re is left popul
15c40 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ated..**.** Whet
15c50 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72  her or not an er
15c60 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ror is returned,
15c70 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
15c80 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
15c90 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
15ca0 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d  entually free p-
15cb0 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65  >idxStr if p->ne
15cc0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69  edToFreeIdxStr i
15cd0 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74  ndicates.** that
15ce0 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65   this is require
15cf0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15d00 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50   vtabBestIndex(P
15d10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
15d20 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74  ble *pTab, sqlit
15d30 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
15d40 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
15d50 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74  b *pVtab = sqlit
15d60 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72  e3GetVTable(pPar
15d70 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70  se->db, pTab)->p
15d80 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vtab;.  int i;. 
15d90 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43   int rc;..  TRAC
15da0 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b  E_IDX_INPUTS(p);
15db0 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70  .  rc = pVtab->p
15dc0 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64  Module->xBestInd
15dd0 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20  ex(pVtab, p);.  
15de0 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
15df0 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  S(p);..  if( rc!
15e00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15e10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15e20 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
15e30 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
15e40 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
15e50 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74    }else if( !pVt
15e60 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
15e70 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15e80 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
15e90 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
15ea0 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (rc));.    }else
15eb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
15ec0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15ed0 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72  "%s", pVtab->zEr
15ee0 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
15ef0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
15f00 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
15f10 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
15f20 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  g = 0;..  for(i=
15f30 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
15f40 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  int; i++){.    i
15f50 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69  f( !p->aConstrai
15f60 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20  nt[i].usable && 
15f70 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
15f80 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
15f90 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
15fa0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15fb0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
15fc0 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49  table %s: xBestI
15fd0 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e  ndex returned an
15fe0 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20   invalid plan", 
15ff0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
16000 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
16010 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a  n pParse->nErr;.
16020 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
16030 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16040 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a  _VIRTUALTABLE) *
16050 2f 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  /...#if defined(
16060 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
16070 41 54 34 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  AT4) || defined(
16080 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
16090 41 54 33 29 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  AT3)./*.** Estim
160a0 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ate the location
160b0 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   of a particular
160c0 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b   key among all k
160d0 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64  eys in an.** ind
160e0 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72  ex.  Store the r
160f0 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20  esults in aStat 
16100 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
16110 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20  *    aStat[0]   
16120 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f     Est. number o
16130 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  f rows less than
16140 20 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61   pVal.**    aSta
16150 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[1]      Est. n
16160 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71  umber of rows eq
16170 75 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a  ual to pVal.**.*
16180 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
16190 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
161a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
161b0 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50  ereKeyStats(.  P
161c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
161d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
161e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
161f0 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
16200 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
16210 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63     /* Index to c
16220 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f  onsider domain o
16230 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  f */.  UnpackedR
16240 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20  ecord *pRec,    
16250 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20     /* Vector of 
16260 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64  values to consid
16270 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e  er */.  int roun
16280 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  dUp,            
16290 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20      /* Round up 
162a0 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20  if true.  Round 
162b0 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f  down if false */
162c0 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61  .  tRowcnt *aSta
162d0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
162e0 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69  * OUT: stats wri
162f0 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
16300 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61    IndexSample *a
16310 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61  Sample = pIdx->a
16320 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43  Sample;.  int iC
16330 6f 6c 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c  ol = pRec->nFiel
16340 64 2d 31 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f  d-1;  /* Index o
16350 66 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73  f required stats
16360 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20   in anEq[] etc. 
16370 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20  */.  int iMin = 
16380 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
16390 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d   /* Smallest sam
163a0 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74  ple not yet test
163b0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  ed */.  int i = 
163c0 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20  pIdx->nSample;  
163d0 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20      /* Smallest 
163e0 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68  sample larger th
163f0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70  an or equal to p
16400 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  Rec */.  int iTe
16410 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
16420 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d       /* Next sam
16430 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20  ple to test */. 
16440 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
16450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16460 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  Result of compar
16470 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  ison operation *
16480 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  /..  assert( pId
16490 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  x->nSample>0 );.
164a0 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e    assert( pRec->
164b0 6e 46 69 65 6c 64 3e 30 20 26 26 20 69 43 6f 6c  nField>0 && iCol
164c0 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f  <pIdx->nSampleCo
164d0 6c 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  l );.  do{.    i
164e0 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 29 2f  Test = (iMin+i)/
164f0 32 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  2;.    res = sql
16500 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
16510 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 54  mpare(aSample[iT
16520 65 73 74 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  est].n, aSample[
16530 69 54 65 73 74 5d 2e 70 2c 20 70 52 65 63 29 3b  iTest].p, pRec);
16540 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
16550 7b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69  {.      iMin = i
16560 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  Test+1;.    }els
16570 65 7b 0a 20 20 20 20 20 20 69 20 3d 20 69 54 65  e{.      i = iTe
16580 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  st;.    }.  }whi
16590 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c  le( res && iMin<
165a0 69 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  i );..#ifdef SQL
165b0 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
165c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
165d0 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63  ert statements c
165e0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69  heck that the bi
165f0 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65  nary search code
16600 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e  .  ** above foun
16610 64 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77  d the right answ
16620 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73  er. This block s
16630 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65  erves no purpose
16640 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e   other.  ** than
16650 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61   to invoke the a
16660 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66  sserts.  */.  if
16670 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
16680 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69  /* If (res==0) i
16690 73 20 74 72 75 65 2c 20 74 68 65 6e 20 73 61 6d  s true, then sam
166a0 70 6c 65 20 24 69 20 6d 75 73 74 20 62 65 20 65  ple $i must be e
166b0 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a  qual to pRec */.
166c0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49      assert( i<pI
166d0 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20  dx->nSample );. 
166e0 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71     assert( 0==sq
166f0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
16700 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
16710 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
16720 70 2c 20 70 52 65 63 29 0a 20 20 20 20 20 20 20  p, pRec).       
16730 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
16740 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
16750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
16760 20 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63   Otherwise, pRec
16770 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72   must be smaller
16780 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20   than sample $i 
16790 61 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a  and larger than.
167a0 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24      ** sample ($
167b0 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73  i-1).  */.    as
167c0 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e  sert( i==pIdx->n
167d0 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20  Sample .        
167e0 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52   || sqlite3VdbeR
167f0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
16800 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
16810 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30  le[i].p, pRec)>0
16820 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61  .         || pPa
16830 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
16840 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73  ailed );.    ass
16850 65 72 74 28 20 69 3d 3d 30 0a 20 20 20 20 20 20  ert( i==0.      
16860 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62     || sqlite3Vdb
16870 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
16880 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61  Sample[i-1].n, a
16890 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70  Sample[i-1].p, p
168a0 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20  Rec)<0.         
168b0 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
168c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
168d0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64   }.#endif /* ifd
168e0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
168f0 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  */..  /* At this
16900 20 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b   point, aSample[
16910 69 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20  i] is the first 
16920 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67  sample that is g
16930 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a  reater than.  **
16940 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56 61   or equal to pVa
16950 6c 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49 64  l.  Or if i==pId
16960 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e  x->nSample, then
16970 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72 65   all samples are
16980 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20   less.  ** than 
16990 70 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c  pVal.  If aSampl
169a0 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e  e[i]==pVal, then
169b0 20 72 65 73 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20   res==0..  */.  
169c0 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
169d0 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61    aStat[0] = aSa
169e0 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
169f0 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d  l];.    aStat[1]
16a00 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
16a10 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73  Eq[iCol];.  }els
16a20 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  e{.    tRowcnt i
16a30 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20 69  Lower, iUpper, i
16a40 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  Gap;.    if( i==
16a50 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
16a60 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70  r = 0;.      iUp
16a70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d  per = aSample[0]
16a80 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
16a90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55   }else{.      iU
16aa0 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e  pper = i>=pIdx->
16ab0 6e 53 61 6d 70 6c 65 20 3f 20 70 49 64 78 2d 3e  nSample ? pIdx->
16ac0 61 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 61 53  aiRowEst[0] : aS
16ad0 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43  ample[i].anLt[iC
16ae0 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65  ol];.      iLowe
16af0 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  r = aSample[i-1]
16b00 2e 61 6e 45 71 5b 69 43 6f 6c 5d 20 2b 20 61 53  .anEq[iCol] + aS
16b10 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 4c 74 5b  ample[i-1].anLt[
16b20 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  iCol];.    }.   
16b30 20 61 53 74 61 74 5b 31 5d 20 3d 20 28 70 49 64   aStat[1] = (pId
16b40 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 69 43 6f 6c 20  x->nColumn>iCol 
16b50 3f 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69  ? pIdx->aAvgEq[i
16b60 43 6f 6c 5d 20 3a 20 31 29 3b 0a 20 20 20 20 69  Col] : 1);.    i
16b70 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65  f( iLower>=iUppe
16b80 72 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20  r ){.      iGap 
16b90 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
16ba0 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 55 70        iGap = iUp
16bb0 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20  per - iLower;.  
16bc0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e    }.    if( roun
16bd0 64 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61  dUp ){.      iGa
16be0 70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a  p = (iGap*2)/3;.
16bf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16c00 20 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a   iGap = iGap/3;.
16c10 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b      }.    aStat[
16c20 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47  0] = iLower + iG
16c30 61 70 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  ap;.  }.}.#endif
16c40 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
16c50 45 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  E_STAT4 */../*.*
16c60 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16c70 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d  is used to estim
16c80 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
16c90 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
16ca0 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62   be visited.** b
16cb0 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e  y scanning an in
16cc0 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20  dex for a range 
16cd0 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72  of values. The r
16ce0 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e  ange may have an
16cf0 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c   upper.** bound,
16d00 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20   a lower bound, 
16d10 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45  or both. The WHE
16d20 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
16d30 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70  that set the upp
16d40 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20  er.** and lower 
16d50 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65  bounds are repre
16d60 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72  sented by pLower
16d70 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70   and pUpper resp
16d80 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a  ectively. For.**
16d90 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
16da0 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20  ng that index p 
16db0 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a  is on t1(a):.**.
16dc0 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
16dd0 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
16de0 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20   a < ? ....**   
16df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e00 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f   |_____|   |____
16e10 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _|.**           
16e20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
16e30 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16e50 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a  Lower    pUpper.
16e60 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
16e70 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20  of the upper or 
16e80 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e  lower bound is n
16e90 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  ot present, then
16ea0 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20   NULL is passed 
16eb0 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74  in.** place of t
16ec0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
16ed0 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
16ee0 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28  * The value in (
16ef0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
16f00 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20  u.btree.nEq) is 
16f10 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
16f20 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e   index.** column
16f30 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
16f40 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
16f50 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74  . Or, equivalent
16f60 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ly, the number o
16f70 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f  f.** equality co
16f80 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69  nstraints optimi
16f90 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f  zed by the propo
16fa0 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20  sed index scan. 
16fb0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20  For example,.** 
16fc0 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70  assuming index p
16fd0 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c   is on t1(a, b),
16fe0 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65   and the SQL que
16ff0 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
17000 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
17010 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f   a = ? AND b > ?
17020 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND b < ? ....*
17030 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73  *.** then nEq is
17040 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68   set to 1 (as th
17050 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74  e range restrict
17060 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73  ed column, b, is
17070 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
17080 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
17090 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20   of the index). 
170a0 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  Or, if the query
170b0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
170c0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
170d0 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
170e0 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
170f0 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  q is set to 0..*
17100 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
17110 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
17120 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74  d, *pnOut is set
17130 20 74 6f 20 74 68 65 20 77 68 65 72 65 43 6f 73   to the whereCos
17140 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  t() of the.** nu
17150 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
17160 74 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e  t the index scan
17170 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20   is expected to 
17180 76 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a  visit without .*
17190 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68  * considering th
171a0 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
171b0 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30  nts. If nEq is 0
171c0 2c 20 74 68 69 73 20 69 73 20 74 68 65 20 6e 75  , this is the nu
171d0 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73  mber of .** rows
171e0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41   in the index. A
171f0 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
17200 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20   occurs, *pnOut 
17210 69 73 20 61 64 6a 75 73 74 65 64 20 28 72 65 64  is adjusted (red
17220 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f  uced).** to acco
17230 75 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67  unt for the rang
17240 65 20 63 6f 6e 74 72 61 69 6e 74 73 20 70 4c 6f  e contraints pLo
17250 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a  wer and pUpper..
17260 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62  ** .** In the ab
17270 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f  sence of sqlite_
17280 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61  stat4 ANALYZE da
17290 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64  ta, or if such d
172a0 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ata cannot be.**
172b0 20 75 73 65 64 2c 20 65 61 63 68 20 72 61 6e 67   used, each rang
172c0 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64  e inequality red
172d0 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20  uces the search 
172e0 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f  space by a facto
172f0 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 48 65 6e 63  r of 4. .** Henc
17300 65 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73  e a pair of cons
17310 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44  traints (x>? AND
17320 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68   x<?) reduces th
17330 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65  e expected numbe
17340 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73  r of.** rows vis
17350 69 74 65 64 20 62 79 20 61 20 66 61 63 74 6f 72  ited by a factor
17360 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74 61 74 69   of 16..*/.stati
17370 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
17380 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
17390 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
173a0 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
173b0 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
173c0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
173d0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
173e0 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72  lder,.  WhereTer
173f0 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
17400 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
17410 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
17420 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
17430 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
17440 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
17450 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
17460 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
17470 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
17480 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 43  NULL */.  WhereC
17490 6f 73 74 20 2a 70 6e 4f 75 74 20 20 20 20 20 2f  ost *pnOut     /
174a0 2a 20 49 4e 2f 4f 55 54 3a 20 4e 75 6d 62 65 72  * IN/OUT: Number
174b0 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
174c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
174d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
174e0 6e 74 20 6e 4f 75 74 20 3d 20 28 69 6e 74 29 2a  nt nOut = (int)*
174f0 70 6e 4f 75 74 3b 0a 0a 23 69 66 20 64 65 66 69  pnOut;..#if defi
17500 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
17510 45 5f 53 54 41 54 34 29 20 7c 7c 20 64 65 66 69  E_STAT4) || defi
17520 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
17530 45 5f 53 54 41 54 33 29 0a 20 20 49 6e 64 65 78  E_STAT3).  Index
17540 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
17550 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
17560 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
17570 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
17580 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a  ->u.btree.nEq;..
17590 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c    if( nEq==pBuil
175a0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a 20  der->nRecValid. 
175b0 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d    && nEq<p->nSam
175c0 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20 70 2d 3e  pleCol.   && p->
175d0 6e 53 61 6d 70 6c 65 20 0a 20 20 20 26 26 20 4f  nSample .   && O
175e0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
175f0 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  ed(pParse->db, S
17600 51 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20  QLITE_Stat3) .  
17610 29 7b 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52  ){.    UnpackedR
17620 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42  ecord *pRec = pB
17630 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20  uilder->pRec;.  
17640 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a    tRowcnt a[2];.
17650 20 20 20 20 75 38 20 61 66 66 20 3d 20 70 2d 3e      u8 aff = p->
17660 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e  pTable->aCol[p->
17670 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66  aiColumn[0]].aff
17680 69 6e 69 74 79 3b 0a 0a 20 20 20 20 2f 2a 20 56  inity;..    /* V
17690 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72 20 77  ariable iLower w
176a0 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68  ill be set to th
176b0 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  e estimate of th
176c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
176d0 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   in .    ** the 
176e0 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20 6c  index that are l
176f0 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77  ess than the low
17700 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20  er bound of the 
17710 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65  range query. The
17720 0a 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f  .    ** lower bo
17730 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f  und being the co
17740 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24  ncatenation of $
17750 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20  P and $L, where 
17760 24 50 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  $P is the.    **
17770 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72 6d   key-prefix form
17780 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 76 61  ed by the nEq va
17790 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61 67 61  lues matched aga
177a0 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65 66  inst the nEq lef
177b0 74 2d 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 63 6f  t-most.    ** co
177c0 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
177d0 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20 74 68  ex, and $L is th
177e0 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65  e value in pLowe
177f0 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
17800 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20 69   Or, if pLower i
17810 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e  s NULL or $L can
17820 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
17830 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75 73   from it (becaus
17840 65 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  e it.    ** is n
17850 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61 72 69  ot a simple vari
17860 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61 6c 20  able or literal 
17870 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f 77 65  value), the lowe
17880 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20  r bound of the. 
17890 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73 20 24     ** range is $
178a0 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75 69 72  P. Due to a quir
178b0 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77 68 65  k in the way whe
178c0 72 65 4b 65 79 53 74 61 74 73 28 29 20 77 6f 72  reKeyStats() wor
178d0 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20  ks, even.    ** 
178e0 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62  if $L is availab
178f0 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74  le, whereKeyStat
17900 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  s() is called fo
17910 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20  r both ($P) and 
17920 0a 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20  .    ** ($P:$L) 
17930 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f  and the larger o
17940 66 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e  f the two return
17950 65 64 20 76 61 6c 75 65 73 20 75 73 65 64 2e 0a  ed values used..
17960 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69      **.    ** Si
17970 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20  milarly, iUpper 
17980 69 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  is to be set to 
17990 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
179a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
179b0 77 73 0a 20 20 20 20 2a 2a 20 6c 65 73 73 20 74  ws.    ** less t
179c0 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f  han the upper bo
179d0 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  und of the range
179e0 20 71 75 65 72 79 2e 20 57 68 65 72 65 20 74 68   query. Where th
179f0 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20  e upper bound.  
17a00 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 28    ** is either (
17a10 24 50 29 20 6f 72 20 28 24 50 3a 24 55 29 2e 20  $P) or ($P:$U). 
17a20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69 66 20 24  Again, even if $
17a30 55 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  U is available, 
17a40 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 20 20  both values.    
17a50 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72 65  ** of iUpper are
17a60 20 72 65 71 75 65 73 74 65 64 20 6f 66 20 77 68   requested of wh
17a70 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 61 6e  ereKeyStats() an
17a80 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75 73  d the smaller us
17a90 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 74  ed..    */.    t
17aa0 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 0a 20  Rowcnt iLower;. 
17ab0 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65     tRowcnt iUppe
17ac0 72 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72  r;..    /* Deter
17ad0 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20  mine iLower and 
17ae0 69 55 70 70 65 72 20 75 73 69 6e 67 20 28 24 50  iUpper using ($P
17af0 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  ) only. */.    i
17b00 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20  f( nEq==0 ){.   
17b10 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     iLower = 0;. 
17b20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 70 2d       iUpper = p-
17b30 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20  >aiRowEst[0];.  
17b40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
17b50 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c  * Note: this cal
17b60 6c 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d  l could be optim
17b70 69 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63  ized away - sinc
17b80 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
17b90 73 20 6d 75 73 74 20 0a 20 20 20 20 20 20 2a 2a  s must .      **
17ba0 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65   have been reque
17bb0 73 74 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e  sted when testin
17bc0 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72  g key $P in wher
17bd0 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e  eEqualScanEst().
17be0 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65    */.      where
17bf0 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
17c00 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
17c10 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
17c20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 69 55 70 70  a[0];.      iUpp
17c30 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d  er = a[0] + a[1]
17c40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17c50 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70  If possible, imp
17c60 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77  rove on the iLow
17c70 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e  er estimate usin
17c80 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20  g ($P:$L). */.  
17c90 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
17ca0 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20        int bOk;  
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cc0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c    /* True if val
17cd0 75 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ue is extracted 
17ce0 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20  from pExpr */.  
17cf0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
17d00 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d  = pLower->pExpr-
17d10 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61  >pRight;.      a
17d20 73 73 65 72 74 28 20 28 70 4c 6f 77 65 72 2d 3e  ssert( (pLower->
17d30 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
17d40 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b  GT|WO_GE))!=0 );
17d50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
17d60 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
17d70 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
17d80 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61   &pRec, pExpr, a
17d90 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a  ff, nEq, &bOk);.
17da0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
17db0 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29  LITE_OK && bOk )
17dc0 7b 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e  {.        tRowcn
17dd0 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  t iNew;.        
17de0 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
17df0 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30  arse, p, pRec, 0
17e00 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4e  , a);.        iN
17e10 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c  ew = a[0] + ((pL
17e20 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
17e30 26 20 57 4f 5f 47 54 29 20 3f 20 61 5b 31 5d 20  & WO_GT) ? a[1] 
17e40 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  : 0);.        if
17e50 28 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20  ( iNew>iLower ) 
17e60 69 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20  iLower = iNew;. 
17e70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
17e80 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65    /* If possible
17e90 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65  , improve on the
17ea0 20 69 55 70 70 65 72 20 65 73 74 69 6d 61 74 65   iUpper estimate
17eb0 20 75 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20   using ($P:$U). 
17ec0 2a 2f 0a 20 20 20 20 69 66 28 20 70 55 70 70 65  */.    if( pUppe
17ed0 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  r ){.      int b
17ee0 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Ok;             
17ef0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
17f00 66 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61  f value is extra
17f10 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20  cted from pExpr 
17f20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
17f30 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70  Expr = pUpper->p
17f40 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
17f50 20 20 20 20 61 73 73 65 72 74 28 20 28 70 55 70      assert( (pUp
17f60 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  per->eOperator &
17f70 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21   (WO_LT|WO_LE))!
17f80 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
17f90 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
17fa0 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
17fb0 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
17fc0 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62  pr, aff, nEq, &b
17fd0 4f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Ok);.      if( r
17fe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17ff0 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 74  bOk ){.        t
18000 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20  Rowcnt iNew;.   
18010 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61       whereKeySta
18020 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
18030 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 1, a);.     
18040 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b     iNew = a[0] +
18050 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72   ((pUpper->eOper
18060 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 20 3f 20  ator & WO_LE) ? 
18070 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
18080 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70     if( iNew<iUpp
18090 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e  er ) iUpper = iN
180a0 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ew;.      }.    
180b0 7d 0a 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  }..    pBuilder-
180c0 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20  >pRec = pRec;.  
180d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
180e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 57 68 65  _OK ){.      Whe
180f0 72 65 43 6f 73 74 20 6e 4e 65 77 3b 0a 20 20 20  reCost nNew;.   
18100 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c     if( iUpper>iL
18110 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ower ){.        
18120 6e 4e 65 77 20 3d 20 77 68 65 72 65 43 6f 73 74  nNew = whereCost
18130 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72  (iUpper - iLower
18140 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18150 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 31          nNew = 1
18160 30 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74  0;        assert
18170 28 20 31 30 3d 3d 77 68 65 72 65 43 6f 73 74 28  ( 10==whereCost(
18180 32 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  2) );.      }.  
18190 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75      if( nNew<nOu
181a0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 75  t ){.        nOu
181b0 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20  t = nNew;.      
181c0 7d 0a 20 20 20 20 20 20 2a 70 6e 4f 75 74 20 3d  }.      *pnOut =
181d0 20 28 57 68 65 72 65 43 6f 73 74 29 6e 4f 75 74   (WhereCost)nOut
181e0 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
181f0 43 45 28 30 78 31 30 30 2c 20 28 22 72 61 6e 67  CE(0x100, ("rang
18200 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  e scan regions: 
18210 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e  %u..%u  est=%d\n
18220 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
18230 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32              (u32
18240 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55  )iLower, (u32)iU
18250 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20  pper, nOut));.  
18260 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18270 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
18280 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
18290 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
182a0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
182b0 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a  ETER(pBuilder);.
182c0 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
182d0 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65   pLower || pUppe
182e0 72 20 29 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  r );.  /* TUNING
182f0 3a 20 20 45 61 63 68 20 69 6e 65 71 75 61 6c 69  :  Each inequali
18300 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65  ty constraint re
18310 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
18320 20 73 70 61 63 65 20 34 2d 66 6f 6c 64 2e 0a 20   space 4-fold.. 
18330 20 2a 2a 20 41 20 42 45 54 57 45 45 4e 20 6f 70   ** A BETWEEN op
18340 65 72 61 74 6f 72 2c 20 74 68 65 72 65 66 6f 72  erator, therefor
18350 65 2c 20 72 65 64 75 63 65 73 20 74 68 65 20 73  e, reduces the s
18360 65 61 72 63 68 20 73 70 61 63 65 20 31 36 2d 66  earch space 16-f
18370 6f 6c 64 20 2a 2f 0a 20 20 69 66 28 20 70 4c 6f  old */.  if( pLo
18380 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e  wer && (pLower->
18390 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
183a0 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
183b0 6e 4f 75 74 20 2d 3d 20 32 30 3b 20 20 20 20 20  nOut -= 20;     
183c0 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 77     assert( 20==w
183d0 68 65 72 65 43 6f 73 74 28 34 29 20 29 3b 0a 20  hereCost(4) );. 
183e0 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20   }.  if( pUpper 
183f0 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2d 3d 20 32  ){.    nOut -= 2
18400 30 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74  0;        assert
18410 28 20 32 30 3d 3d 77 68 65 72 65 43 6f 73 74 28  ( 20==whereCost(
18420 34 29 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  4) );.  }.  if( 
18430 6e 4f 75 74 3c 31 30 20 29 20 6e 4f 75 74 20 3d  nOut<10 ) nOut =
18440 20 31 30 3b 0a 20 20 2a 70 6e 4f 75 74 20 3d 20   10;.  *pnOut = 
18450 28 57 68 65 72 65 43 6f 73 74 29 6e 4f 75 74 3b  (WhereCost)nOut;
18460 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18470 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
18480 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
18490 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
184a0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
184b0 29 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  )./*.** Estimate
184c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
184d0 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
184e0 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
184f0 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74  on.** an equalit
18500 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56  y constraint x=V
18510 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74  ALUE and where t
18520 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73  hat VALUE occurs
18530 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f   in.** the histo
18540 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73  gram data.  This
18550 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e   only works when
18560 20 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d   x is the left-m
18570 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66  ost.** column of
18580 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71   an index and sq
18590 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f  lite_stat3 histo
185a0 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61  gram data is ava
185b0 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68  ilable.** for th
185c0 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20  at index.  When 
185d0 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74  pExpr==NULL that
185e0 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74   means the const
185f0 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49  raint is.** "x I
18600 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20  S NULL" instead 
18610 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a  of "x=VALUE"..**
18620 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73  .** Write the es
18630 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e  timated row coun
18640 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e  t into *pnRow an
18650 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
18660 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c  OK. .** If unabl
18670 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74  e to make an est
18680 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e  imate, leave *pn
18690 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  Row unchanged an
186a0 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
186b0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  zero..**.** This
186c0 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69   routine can fai
186d0 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c  l if it is unabl
186e0 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c  e to load a coll
186f0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a  ating sequence.*
18700 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  * required for s
18710 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e  tring comparison
18720 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74  , or if unable t
18730 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
18740 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63  y.** for a UTF c
18750 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72  onversion requir
18760 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ed for compariso
18770 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73  n.  The error is
18780 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
18790 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
187a0 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
187b0 74 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  t whereEqualScan
187c0 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
187d0 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
187e0 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
187f0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
18800 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
18810 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
18820 2c 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  ,.  Expr *pExpr,
18830 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
18840 65 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45  ession for VALUE
18850 20 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20   in the x=VALUE 
18860 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
18870 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20  tRowcnt *pnRow  
18880 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
18890 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73  e revised row es
188a0 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29  timate here */.)
188b0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  {.  Index *p = p
188c0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
188d0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
188e0 20 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c   int nEq = pBuil
188f0 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
18900 65 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b  ee.nEq;.  Unpack
18910 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d  edRecord *pRec =
18920 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b   pBuilder->pRec;
18930 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20  .  u8 aff;      
18940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18950 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  Column affinity 
18960 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
18970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18980 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
18990 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
189a0 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20  Rowcnt a[2];    
189b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
189c0 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20  istics */.  int 
189d0 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  bOk;..  assert( 
189e0 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  nEq>=1 );.  asse
189f0 72 74 28 20 6e 45 71 3c 3d 28 70 2d 3e 6e 43 6f  rt( nEq<=(p->nCo
18a00 6c 75 6d 6e 2b 31 29 20 29 3b 0a 20 20 61 73 73  lumn+1) );.  ass
18a10 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
18a20 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
18a30 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  p->nSample>0 );.
18a40 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64    assert( pBuild
18a50 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45  er->nRecValid<nE
18a60 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61  q );..  /* If va
18a70 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61  lues are not ava
18a80 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66  ilable for all f
18a90 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64  ields of the ind
18aa0 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20  ex to the left. 
18ab0 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c   ** of this one,
18ac0 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e   no estimate can
18ad0 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e   be made. Return
18ae0 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
18af0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c  . */.  if( pBuil
18b00 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28  der->nRecValid<(
18b10 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  nEq-1) ){.    re
18b20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
18b30 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OUND;.  }..  /* 
18b40 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
18b50 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68  ization only. Th
18b60 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
18b70 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
18b80 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77  lue().  ** below
18b90 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68   would return th
18ba0 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a  e same value.  *
18bb0 2f 0a 20 20 69 66 28 20 6e 45 71 3e 70 2d 3e 6e  /.  if( nEq>p->n
18bc0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a 70  Column ){.    *p
18bd0 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65  nRow = 1;.    re
18be0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18bf0 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e    }..  aff = p->
18c00 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e  pTable->aCol[p->
18c10 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d  aiColumn[nEq-1]]
18c20 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 72 63 20  .affinity;.  rc 
18c30 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
18c40 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
18c50 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
18c60 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c  xpr, aff, nEq-1,
18c70 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64   &bOk);.  pBuild
18c80 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b  er->pRec = pRec;
18c90 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18ca0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
18cb0 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29  ;.  if( bOk==0 )
18cc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
18cd0 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c  OTFOUND;.  pBuil
18ce0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
18cf0 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65   nEq;..  whereKe
18d00 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
18d10 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
18d20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
18d30 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63 61  0,("equality sca
18d40 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22  n regions: %d\n"
18d50 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20  , (int)a[1]));. 
18d60 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a   *pnRow = a[1];.
18d70 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
18d80 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
18d90 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
18da0 45 5f 53 54 41 54 34 29 20 2a 2f 0a 0a 23 69 66  E_STAT4) */..#if
18db0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
18dc0 45 4e 41 42 4c 45 5f 53 54 41 54 34 29 20 7c 7c  ENABLE_STAT4) ||
18dd0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
18de0 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 0a 2f 2a  ENABLE_STAT3)./*
18df0 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
18e00 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
18e10 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
18e20 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
18e30 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  * an IN constrai
18e40 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67  nt where the rig
18e50 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
18e60 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
18e70 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ** is a list of 
18e80 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65  values.  Example
18e90 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
18ea0 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33  HERE x IN (1,2,3
18eb0 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ,4).**.** Write 
18ec0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
18ed0 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
18ee0 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
18ef0 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
18f00 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
18f10 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
18f20 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
18f30 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
18f40 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
18f50 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
18f60 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
18f70 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
18f80 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
18f90 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
18fa0 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
18fb0 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
18fc0 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
18fd0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
18fe0 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
18ff0 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
19000 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
19010 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
19020 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
19030 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
19040 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53  tic int whereInS
19050 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
19060 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
19070 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
19080 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
19090 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
190a0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
190b0 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  der,.  ExprList 
190c0 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54  *pList,     /* T
190d0 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e  he value list on
190e0 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49   the RHS of "x I
190f0 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29  N (v1,v2,v3,...)
19100 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  " */.  tRowcnt *
19110 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
19120 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
19130 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
19140 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
19150 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
19160 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
19170 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 52 65 63  ndex;.  int nRec
19180 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72  Valid = pBuilder
19190 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69  ->nRecValid;.  i
191a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
191b0 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e  K;     /* Subfun
191c0 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
191d0 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  e */.  tRowcnt n
191e0 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Est;           /
191f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
19200 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65   for a single te
19210 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  rm */.  tRowcnt 
19220 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20  nRowEst = 0;    
19230 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20  /* New estimate 
19240 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
19250 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69   rows */.  int i
19260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19270 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
19280 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
19290 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
192a0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
192b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
192c0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
192d0 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70  +){.    nEst = p
192e0 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
192f0 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
19300 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
19310 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73  , pBuilder, pLis
19320 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
19330 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
19340 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20  st += nEst;.    
19350 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
19360 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
19370 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
19380 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19390 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70   if( nRowEst > p
193a0 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20  ->aiRowEst[0] ) 
193b0 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52  nRowEst = p->aiR
193c0 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70  owEst[0];.    *p
193d0 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a  nRow = nRowEst;.
193e0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
193f0 78 31 30 30 2c 28 22 49 4e 20 72 6f 77 20 65 73  x100,("IN row es
19400 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e  timate: est=%g\n
19410 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20  ", nRowEst));.  
19420 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69  }.  assert( pBui
19430 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d  lder->nRecValid=
19440 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20  =nRecValid );.  
19450 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
19460 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
19470 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
19480 54 34 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69  T4) */../*.** Di
19490 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20  sable a term in 
194a0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
194b0 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  .  Except, do no
194c0 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  t disable the te
194d0 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74  rm.** if it cont
194e0 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45  rols a LEFT OUTE
194f0 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69  R JOIN and it di
19500 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20  d not originate 
19510 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20  in the ON.** or 
19520 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
19530 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  that join..**.**
19540 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65   Consider the te
19550 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20  rm t2.z='ok' in 
19560 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  the following qu
19570 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  eries:.**.**   (
19580 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  1)  SELECT * FRO
19590 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
195a0 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57  2 ON t1.a=t2.x W
195b0 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a  HERE t2.z='ok'.*
195c0 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20  *   (2)  SELECT 
195d0 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
195e0 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
195f0 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
19600 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45  '.**   (3)  SELE
19610 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
19620 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78   WHERE t1.a=t2.x
19630 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
19640 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f  *.** The t2.z='o
19650 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  k' is disabled i
19660 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63  n the in (2) bec
19670 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74  ause it originat
19680 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  es.** in the ON 
19690 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72  clause.  The ter
196a0 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  m is disabled in
196b0 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20   (3) because it 
196c0 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f  is not part.** o
196d0 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
196e0 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68  OIN.  In (1), th
196f0 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69  e term is not di
19700 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69  sabled..**.** Di
19710 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63  sabling a term c
19720 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20  auses that term 
19730 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  to not be tested
19740 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   in the inner lo
19750 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  op.** of the joi
19760 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73  n.  Disabling is
19770 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
19780 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72  .  When terms ar
19790 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62  e satisfied.** b
197a0 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69  y indices, we di
197b0 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72  sable them to pr
197c0 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20  event redundant 
197d0 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e  tests in the inn
197e0 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20  er.** loop.  We 
197f0 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f  would get the co
19800 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66  rrect results if
19810 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76   nothing were ev
19820 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20  er disabled,.** 
19830 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20  but joins might 
19840 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f  run a little slo
19850 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20  wer.  The trick 
19860 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73  is to disable as
19870 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63   much.** as we c
19880 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62  an without disab
19890 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20  ling too much.  
198a0 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69  If we disabled i
198b0 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a  n (1), we'd get.
198c0 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73  ** the wrong ans
198d0 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74  wer.  See ticket
198e0 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63   #813..*/.static
198f0 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72   void disableTer
19900 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c  m(WhereLevel *pL
19910 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20  evel, WhereTerm 
19920 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70  *pTerm){.  if( p
19930 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70  Term.      && (p
19940 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
19950 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20  TERM_CODED)==0. 
19960 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
19970 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c  >iLeftJoin==0 ||
19980 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
19990 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
199a0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29  P_FromJoin)).  )
199b0 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  {.    pTerm->wtF
199c0 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
199d0 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ED;.    if( pTer
199e0 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b  m->iParent>=0 ){
199f0 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
19a00 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72   *pOther = &pTer
19a10 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d  m->pWC->a[pTerm-
19a20 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20  >iParent];.     
19a30 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e   if( (--pOther->
19a40 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20  nChild)==0 ){.  
19a50 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
19a60 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72  m(pLevel, pOther
19a70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19a80 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
19a90 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74  de an OP_Affinit
19aa0 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c  y opcode to appl
19ab0 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  y the column aff
19ac0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66  inity string zAf
19ad0 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65  f.** to the n re
19ae0 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
19af0 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a   at base. .**.**
19b00 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   As an optimizat
19b10 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  ion, SQLITE_AFF_
19b20 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68  NONE entries (wh
19b30 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20  ich are no-ops) 
19b40 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e  at the.** beginn
19b50 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a  ing and end of z
19b60 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  Aff are ignored.
19b70 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73    If all entries
19b80 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20   in zAff are.** 
19b90 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c  SQLITE_AFF_NONE,
19ba0 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65   then no code ge
19bb0 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a  ts generated..**
19bc0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19bd0 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63   makes its own c
19be0 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74  opy of zAff so t
19bf0 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69  hat the caller i
19c00 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64  s free.** to mod
19c10 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74  ify zAff after t
19c20 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
19c30 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rns..*/.static v
19c40 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66  oid codeApplyAff
19c50 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61  inity(Parse *pPa
19c60 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69  rse, int base, i
19c70 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66  nt n, char *zAff
19c80 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
19c90 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
19ca0 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20  if( zAff==0 ){. 
19cb0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
19cc0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
19cd0 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
19ce0 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
19cf0 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41   v!=0 );..  /* A
19d00 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e  djust base and n
19d10 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51   to skip over SQ
19d20 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e  LITE_AFF_NONE en
19d30 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67  tries at the beg
19d40 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20  inning.  ** and 
19d50 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e  end of the affin
19d60 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f  ity string..  */
19d70 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
19d80 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45   zAff[0]==SQLITE
19d90 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
19da0 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b   n--;.    base++
19db0 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20  ;.    zAff++;.  
19dc0 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  }.  while( n>1 &
19dd0 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c  & zAff[n-1]==SQL
19de0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
19df0 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20      n--;.  }..  
19e00 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41  /* Code the OP_A
19e10 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69  ffinity opcode i
19e20 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68  f there is anyth
19e30 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20  ing left to do. 
19e40 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  */.  if( n>0 ){.
19e50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19e60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp2(v, OP_Affi
19e70 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  nity, base, n);.
19e80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19e90 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a  hangeP4(v, -1, z
19ea0 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c  Aff, n);.    sql
19eb0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
19ec0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
19ed0 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  se, base, n);.  
19ee0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
19ef0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
19f00 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20  single equality 
19f10 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
19f20 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71  E clause.  An eq
19f30 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63  uality.** term c
19f40 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65  an be either X=e
19f50 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e  xpr or X IN (...
19f60 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68  ).   pTerm is th
19f70 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a  e term to be .**
19f80 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   coded..**.** Th
19f90 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
19fa0 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69  for the constrai
19fb0 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  nt is left in re
19fc0 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a  gister iReg..**.
19fd0 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61  ** For a constra
19fe0 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  int of the form 
19ff0 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72  X=expr, the expr
1a000 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61  ession is evalua
1a010 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72  ted and its.** r
1a020 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e  esult is left on
1a030 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72   the stack.  For
1a040 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20   constraints of 
1a050 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e  the form X IN (.
1a060 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ..).** this rout
1a070 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f  ine sets up a lo
1a080 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65  op that will ite
1a090 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61  rate over all va
1a0a0 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74  lues of X..*/.st
1a0b0 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75  atic int codeEqu
1a0c0 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72  alityTerm(.  Par
1a0d0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1a0e0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1a0f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
1a100 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
1a110 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20   /* The term of 
1a120 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1a130 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
1a140 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1a150 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76  evel, /* The lev
1a160 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  el of the FROM c
1a170 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72  lause we are wor
1a180 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74  king on */.  int
1a190 20 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20   iEq,           
1a1a0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1a1b0 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77   equality term w
1a1c0 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c  ithin this level
1a1d0 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
1a1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1a1f0 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72  e for reverse-or
1a200 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e  der IN operation
1a210 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67  s */.  int iTarg
1a220 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  et         /* At
1a230 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72  tempt to leave r
1a240 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72  esults in this r
1a250 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
1a260 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
1a270 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20  ->pExpr;.  Vdbe 
1a280 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1a290 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20  be;.  int iReg; 
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2b0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
1a2c0 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ding results */.
1a2d0 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67  .  assert( iTarg
1a2e0 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58  et>0 );.  if( pX
1a2f0 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20  ->op==TK_EQ ){. 
1a300 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
1a310 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1a320 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
1a330 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  ht, iTarget);.  
1a340 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70  }else if( pX->op
1a350 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
1a360 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
1a370 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
1a380 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1a390 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23  ull, 0, iReg);.#
1a3a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a3b0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65  IT_SUBQUERY.  }e
1a3c0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79  lse{.    int eTy
1a3d0 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62  pe;.    int iTab
1a3e0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c  ;.    struct InL
1a3f0 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68  oop *pIn;.    Wh
1a400 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
1a410 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
1a420 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ..    if( (pLoop
1a430 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1a440 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
1a450 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f  =0.      && pLoo
1a460 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1a470 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c  x!=0.      && pL
1a480 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1a490 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
1a4a0 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  iEq].    ){.    
1a4b0 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d    testcase( iEq=
1a4c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1a4d0 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20  case( bRev );.  
1a4e0 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76      bRev = !bRev
1a4f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1a500 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
1a510 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  N );.    iReg = 
1a520 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79  iTarget;.    eTy
1a530 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
1a540 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
1a550 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  pX, 0);.    if( 
1a560 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
1a570 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20  INDEX_DESC ){.  
1a580 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52      testcase( bR
1a590 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76  ev );.      bRev
1a5a0 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a   = !bRev;.    }.
1a5b0 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69      iTab = pX->i
1a5c0 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
1a5d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a5e0 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
1a5f0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
1a600 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
1a610 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1a620 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
1a630 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c  OR)==0 );.    pL
1a640 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
1a650 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20  WHERE_IN_ABLE;. 
1a660 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75     if( pLevel->u
1a670 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20  .in.nIn==0 ){.  
1a680 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
1a690 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
1a6a0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1a6b0 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
1a6c0 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20  >u.in.nIn++;.   
1a6d0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
1a6e0 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73  nLoop =.       s
1a6f0 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
1a700 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  rFree(pParse->db
1a710 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
1a720 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  InLoop,.        
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a740 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65        sizeof(pLe
1a750 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
1a760 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e  p[0])*pLevel->u.
1a770 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e  in.nIn);.    pIn
1a780 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e   = pLevel->u.in.
1a790 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  aInLoop;.    if(
1a7a0 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49   pIn ){.      pI
1a7b0 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  n += pLevel->u.i
1a7c0 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20  n.nIn - 1;.     
1a7d0 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61   pIn->iCur = iTa
1a7e0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  b;.      if( eTy
1a7f0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
1a800 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  ID ){.        pI
1a810 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73  n->addrInTop = s
1a820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a830 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
1a840 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20  ab, iReg);.     
1a850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a860 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d  pIn->addrInTop =
1a870 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a880 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1a890 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b   iTab, 0, iReg);
1a8a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1a8b0 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d  In->eEndLoopOp =
1a8c0 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
1a8d0 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  : OP_Next;.     
1a8e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a8f0 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p1(v, OP_IsNull,
1a900 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73   iReg);.    }els
1a910 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
1a920 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20  >u.in.nIn = 0;. 
1a930 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
1a940 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1a950 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
1a960 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a  return iReg;.}..
1a970 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1a980 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
1a990 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e  aluate all == an
1a9a0 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
1a9b0 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78   for an.** index
1a9c0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1a9d0 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61  ple, consider ta
1a9e0 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65  ble t1(a,b,c,d,e
1a9f0 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69  ,f) with index i
1aa00 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70  1(a,b,c)..** Sup
1aa10 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63  pose the WHERE c
1aa20 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20  lause is this:  
1aa30 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31  a==5 AND b IN (1
1aa40 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e  ,2,3) AND c>5 AN
1aa50 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e  D c<10.** The in
1aa60 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20  dex has as many 
1aa70 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74  as three equalit
1aa80 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62  y constraints, b
1aa90 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78  ut in this.** ex
1aaa0 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64  ample, the third
1aab0 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e   "c" value is an
1aac0 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f   inequality.  So
1aad0 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f   only two .** co
1aae0 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
1aaf0 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ded.  This routi
1ab00 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ne will generate
1ab10 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
1ab20 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20  e.** a==5 and b 
1ab30 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65  IN (1,2,3).  The
1ab40 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
1ab50 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c  for a and b will
1ab60 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   be stored.** in
1ab70 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
1ab80 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69  isters and the i
1ab90 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
1aba0 74 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65  t register is re
1abb0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  turned..**.** In
1abc0 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
1abd0 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20  ve nEq==2.  But 
1abe0 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
1abf0 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61  works for any va
1ac00 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e  lue.** of nEq in
1ac10 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e  cluding 0.  If n
1ac20 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74  Eq==0, this rout
1ac30 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20  ine is nearly a 
1ac40 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e  no-op..** The on
1ac50 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73  ly thing it does
1ac60 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   is allocate the
1ac70 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65   pLevel->iMem me
1ac80 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a  mory cell and.**
1ac90 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66   compute the aff
1aca0 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a  inity string..**
1acb0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1acc0 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65   always allocate
1acd0 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d  s at least one m
1ace0 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
1acf0 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e  eturns.** the in
1ad00 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f  dex of that memo
1ad10 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64  ry cell. The cod
1ad20 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20  e that.** calls 
1ad30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
1ad40 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72  l use that memor
1ad50 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20  y cell to store 
1ad60 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a  the termination.
1ad70 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20  ** key value of 
1ad80 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e  the loop.  If on
1ad90 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65  e or more IN ope
1ada0 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74  rators appear, t
1adb0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
1adc0 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ine allocates an
1add0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20   additional nEq 
1ade0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
1adf0 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65   internal.** use
1ae00 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
1ae10 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66  eturning, *pzAff
1ae20 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1ae30 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
1ae40 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70  taining a.** cop
1ae50 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  y of the column 
1ae60 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
1ae70 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c  of the index all
1ae80 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20  ocated using.** 
1ae90 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
1aea0 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69  ). Except, entri
1aeb0 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f  es in the copy o
1aec0 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73  f the string ass
1aed0 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
1aee0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1aef0 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f  ints that use NO
1af00 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20  NE affinity are 
1af10 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45  set to.** SQLITE
1af20 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20  _AFF_NONE. This 
1af30 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  is to deal with 
1af40 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20  SQL such as the 
1af50 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
1af60 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1af70 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52  t1(a TEXT PRIMAR
1af80 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20  Y KEY, b);.**   
1af90 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
1afa0 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45  t1 AS t2, t1 WHE
1afb0 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a  RE t1.a = t2.b;.
1afc0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
1afd0 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20  mple above, the 
1afe0 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68  index on t1(a) h
1aff0 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79  as TEXT affinity
1b000 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74  . But since.** t
1b010 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69  he right hand si
1b020 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69  de of the equali
1b030 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74  ty constraint (t
1b040 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66  2.b) has NONE af
1b050 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f  finity,.** no co
1b060 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20  nversion should 
1b070 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66  be attempted bef
1b080 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62  ore using a t2.b
1b090 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f   value as part o
1b0a0 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65  f.** a key to se
1b0b0 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20  arch the index. 
1b0c0 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  Hence the first 
1b0d0 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75  byte in the retu
1b0e0 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a  rned affinity.**
1b0f0 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20   string in this 
1b100 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65  example would be
1b110 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41   set to SQLITE_A
1b120 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74  FF_NONE..*/.stat
1b130 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71  ic int codeAllEq
1b140 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50  ualityTerms(.  P
1b150 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1b160 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1b170 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
1b180 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
1b190 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74     /* Which nest
1b1a0 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46  ed loop of the F
1b1b0 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e  ROM we are codin
1b1c0 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  g */.  int bRev,
1b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b1e0 52 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65  Reverse the orde
1b1f0 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  r of IN operator
1b200 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  s */.  int nExtr
1b210 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  aReg,        /* 
1b220 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
1b230 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  registers to all
1b240 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  ocate */.  char 
1b250 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20  **pzAff         
1b260 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20   /* OUT: Set to 
1b270 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74  point to affinit
1b280 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
1b290 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20   int nEq;       
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b2b0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
1b2c0 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
1b2d0 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a  ints to code */.
1b2e0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1b2f0 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
1b300 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20  /* The vm under 
1b310 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1b320 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b340 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69  /* The index bei
1b350 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  ng used for this
1b360 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65   loop */.  Where
1b370 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
1b380 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
1b390 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
1b3a0 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  term */.  WhereL
1b3b0 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
1b3c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1b3d0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
1b3e0 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
1b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b400 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1b410 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  er */.  int regB
1b420 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1b430 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
1b440 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
1b450 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nReg;           
1b460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b470 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73  ber of registers
1b480 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
1b490 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20    char *zAff;   
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4b0 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
1b4c0 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ng to return */.
1b4d0 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c  .  /* This modul
1b4e0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
1b4f0 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20   on query plans 
1b500 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65  that use an inde
1b510 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20  x. */.  pLoop = 
1b520 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1b530 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
1b540 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1b550 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
1b560 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c  =0 );.  nEq = pL
1b570 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1b580 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70  ;.  pIdx = pLoop
1b590 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1b5a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
1b5b0 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  !=0 );..  /* Fig
1b5c0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
1b5d0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65   memory cells we
1b5e0 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20   will need then 
1b5f0 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20  allocate them.. 
1b600 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20   */.  regBase = 
1b610 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
1b620 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70  ;.  nReg = pLoop
1b630 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20  ->u.btree.nEq + 
1b640 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61  nExtraReg;.  pPa
1b650 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
1b660 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c  g;..  zAff = sql
1b670 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
1b680 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33  rse->db, sqlite3
1b690 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
1b6a0 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66  (v, pIdx));.  if
1b6b0 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70  ( !zAff ){.    p
1b6c0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1b6d0 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d  cFailed = 1;.  }
1b6e0 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
1b6f0 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
1b700 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
1b710 61 73 73 65 72 74 28 20 7a 41 66 66 3d 3d 30 20  assert( zAff==0 
1b720 7c 7c 20 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e  || strlen(zAff)>
1b730 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d  =nEq );.  for(j=
1b740 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a  0; j<nEq; j++){.
1b750 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
1b760 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61  pTerm = pLoop->a
1b770 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73  LTerm[j];.    as
1b780 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
1b790 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ;.    /* The fol
1b7a0 6c 6f 77 69 6e 67 20 74 72 75 65 20 66 6f 72 20  lowing true for 
1b7b0 69 6e 64 69 63 65 73 20 77 69 74 68 20 72 65 64  indices with red
1b7c0 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20  undant columns. 
1b7d0 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41  .    ** Ex: CREA
1b7e0 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
1b7f0 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54  1(a,b,a); SELECT
1b800 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
1b810 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f   a=0 AND b=0; */
1b820 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
1b830 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1b840 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20   TERM_CODED)!=0 
1b850 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1b860 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1b870 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1b880 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45  ;.    r1 = codeE
1b890 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
1b8a0 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
1b8b0 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67 42  l, j, bRev, regB
1b8c0 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20  ase+j);.    if( 
1b8d0 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b  r1!=regBase+j ){
1b8e0 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d  .      if( nReg=
1b8f0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
1b900 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1b910 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 42  Reg(pParse, regB
1b920 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ase);.        re
1b930 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20  gBase = r1;.    
1b940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b950 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b960 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
1b970 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a  r1, regBase+j);.
1b980 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b990 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1b9a0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1b9b0 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
1b9c0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1b9d0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1b9e0 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  IN );.    if( (p
1b9f0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1ba00 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  & (WO_ISNULL|WO_
1ba10 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  IN))==0 ){.     
1ba20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
1ba30 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
1ba40 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
1ba50 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c  te3ExprCodeIsNul
1ba60 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c  lJump(v, pRight,
1ba70 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76   regBase+j, pLev
1ba80 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
1ba90 20 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a      if( zAff ){.
1baa0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1bab0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1bac0 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b  ty(pRight, zAff[
1bad0 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  j])==SQLITE_AFF_
1bae0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NONE ){.        
1baf0 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49    zAff[j] = SQLI
1bb00 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
1bb10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1bb20 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
1bb30 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
1bb40 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66  nge(pRight, zAff
1bb50 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [j]) ){.        
1bb60 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49    zAff[j] = SQLI
1bb70 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
1bb80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1bb90 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66     }.  }.  *pzAf
1bba0 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75  f = zAff;.  retu
1bbb0 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23  rn regBase;.}..#
1bbc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bbd0 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
1bbe0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1bbf0 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78   a helper for ex
1bc00 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28  plainIndexRange(
1bc10 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53  ) below.**.** pS
1bc20 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78  tr holds the tex
1bc30 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
1bc40 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65 20 62  on that we are b
1bc50 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74  uilding up one t
1bc60 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65  erm.** at a time
1bc70 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1bc80 61 64 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20  adds a new term 
1bc90 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1bca0 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  e expression..**
1bcb0 20 54 65 72 6d 73 20 61 72 65 20 73 65 70 61 72   Terms are separ
1bcc0 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61  ated by AND so a
1bcd0 64 64 20 74 68 65 20 22 41 4e 44 22 20 74 65 78  dd the "AND" tex
1bce0 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64  t for second and
1bcf0 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74   subsequent.** t
1bd00 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  erms only..*/.st
1bd10 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
1bd20 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53  nAppendTerm(.  S
1bd30 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20  trAccum *pStr,  
1bd40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1bd50 65 20 74 65 78 74 20 65 78 70 72 65 73 73 69 6f  e text expressio
1bd60 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f  n being built */
1bd70 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20  .  int iTerm,   
1bd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bd90 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20  * Index of this 
1bda0 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20  term.  First is 
1bdb0 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  zero */.  const 
1bdc0 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20  char *zColumn,  
1bdd0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1bde0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   the column */. 
1bdf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
1be00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1be10 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72  Name of the oper
1be20 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ator */.){.  if(
1be30 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33   iTerm ) sqlite3
1be40 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
1be50 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29  Str, " AND ", 5)
1be60 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
1be70 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
1be80 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20  zColumn, -1);.  
1be90 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
1bea0 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c  ppend(pStr, zOp,
1beb0 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   1);.  sqlite3St
1bec0 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
1bed0 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f  r, "?", 1);.}../
1bee0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c  *.** Argument pL
1bef0 65 76 65 6c 20 64 65 73 63 72 69 62 65 73 20 61  evel describes a
1bf00 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 73 63   strategy for sc
1bf10 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61  anning table pTa
1bf20 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  b. This .** func
1bf30 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
1bf40 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69  ointer to a stri
1bf50 6e 67 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  ng buffer contai
1bf60 6e 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ning a descripti
1bf70 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  on.** of the sub
1bf80 73 65 74 20 6f 66 20 74 61 62 6c 65 20 72 6f 77  set of table row
1bf90 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65  s scanned by the
1bfa0 20 73 74 72 61 74 65 67 79 20 69 6e 20 74 68 65   strategy in the
1bfb0 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53   form of an.** S
1bfc0 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f  QL expression. O
1bfd0 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61  r, if all rows a
1bfe0 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c  re scanned, NULL
1bff0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1c000 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
1c010 20 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a   if the query:.*
1c020 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  *.**   SELECT * 
1c030 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
1c040 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a  1 AND b>2;.**.**
1c050 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72   is run and ther
1c060 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e  e is an index on
1c070 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68   (a, b), then th
1c080 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1c090 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20  rns a.** string 
1c0a0 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a  similar to:.**.*
1c0b0 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f  *   "a=? AND b>?
1c0c0 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ".**.** The retu
1c0d0 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69  rned pointer poi
1c0e0 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  nts to memory ob
1c0f0 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1c100 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a  te3DbMalloc()..*
1c110 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  * It is the resp
1c120 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
1c130 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65  e caller to free
1c140 20 74 68 65 20 62 75 66 66 65 72 20 77 68 65 6e   the buffer when
1c150 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e   it is.** no lon
1c160 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f  ger required..*/
1c170 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78  .static char *ex
1c180 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28  plainIndexRange(
1c190 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
1c1a0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54  reLoop *pLoop, T
1c1b0 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49  able *pTab){.  I
1c1c0 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70  ndex *pIndex = p
1c1d0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
1c1e0 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
1c1f0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
1c200 2e 6e 45 71 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .nEq;.  int i, j
1c210 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  ;.  Column *aCol
1c220 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20   = pTab->aCol;. 
1c230 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d   int *aiColumn =
1c240 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1c250 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78  n;.  StrAccum tx
1c260 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30  t;..  if( nEq==0
1c270 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
1c280 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d  ags & (WHERE_BTM
1c290 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
1c2a0 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20  _LIMIT))==0 ){. 
1c2b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1c2c0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1c2d0 75 6d 49 6e 69 74 28 26 74 78 74 2c 20 30 2c 20  umInit(&txt, 0, 
1c2e0 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  0, SQLITE_MAX_LE
1c2f0 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e 64 62 20  NGTH);.  txt.db 
1c300 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 53  = db;.  sqlite3S
1c310 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74  trAccumAppend(&t
1c320 78 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20  xt, " (", 2);.  
1c330 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20  for(i=0; i<nEq; 
1c340 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  i++){.    char *
1c350 7a 20 3d 20 28 69 3d 3d 70 49 6e 64 65 78 2d 3e  z = (i==pIndex->
1c360 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77  nColumn ) ? "row
1c370 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
1c380 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[i]].zName;. 
1c390 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
1c3a0 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c  Term(&txt, i, z,
1c3b0 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20   "=");.  }..  j 
1c3c0 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f 70  = i;.  if( pLoop
1c3d0 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
1c3e0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1c3f0 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70   char *z = (j==p
1c400 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
1c410 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
1c420 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
1c430 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
1c440 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
1c450 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a  , i++, z, ">");.
1c460 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
1c470 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54  >wsFlags&WHERE_T
1c480 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
1c490 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49  char *z = (j==pI
1c4a0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  ndex->nColumn ) 
1c4b0 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c  ? "rowid" : aCol
1c4c0 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  [aiColumn[j]].zN
1c4d0 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  ame;.    explain
1c4e0 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c  AppendTerm(&txt,
1c4f0 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d   i, z, "<");.  }
1c500 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1c510 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
1c520 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e  )", 1);.  return
1c530 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1c540 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a  Finish(&txt);.}.
1c550 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1c560 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
1c570 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79  unless currently
1c580 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45   processing an E
1c590 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
1c5a0 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66  N.** command. If
1c5b0 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e 67   the query being
1c5c0 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20   compiled is an 
1c5d0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1c5e0 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  AN, a single.** 
1c5f0 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20  record is added 
1c600 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f  to the output to
1c610 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61   describe the ta
1c620 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67  ble scan strateg
1c630 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e  y in .** pLevel.
1c640 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c650 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
1c660 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1c670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c680 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
1c690 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
1c6a0 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
1c6b0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1c6c0 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20   list this loop 
1c6d0 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57  refers to */.  W
1c6e0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1c6f0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
1c700 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20  * Scan to write 
1c710 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64  OP_Explain opcod
1c720 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  e for */.  int i
1c730 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
1c740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1c750 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20  lue for "level" 
1c760 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
1c770 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
1c780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c790 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
1c7a0 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e  or "from" column
1c7b0 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
1c7c0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20  u16 wctrlFlags  
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7e0 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
1c7f0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
1c800 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69  egin() */.){.  i
1c810 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
1c820 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 73 74 72  in==2 ){.    str
1c830 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1c840 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
1c850 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
1c860 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20  From];.    Vdbe 
1c870 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1c880 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62  be;      /* VM b
1c890 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
1c8a0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20   */.    sqlite3 
1c8b0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1c8c0 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
1c8d0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  e handle */.    
1c8e0 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20  char *zMsg;     
1c8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c900 20 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20   Text to add to 
1c910 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  EQP output */.  
1c920 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72    int iId = pPar
1c930 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20  se->iSelectId;  
1c940 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65  /* Select id (le
1c950 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63  ft-most output c
1c960 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  olumn) */.    in
1c970 74 20 69 73 53 65 61 72 63 68 3b 20 20 20 20 20  t isSearch;     
1c980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c990 72 75 65 20 66 6f 72 20 61 20 53 45 41 52 43 48  rue for a SEARCH
1c9a0 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e  . False for SCAN
1c9b0 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f  . */.    WhereLo
1c9c0 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
1c9d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1c9e0 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c  ntrolling WhereL
1c9f0 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
1ca00 20 20 75 33 32 20 66 6c 61 67 73 3b 20 20 20 20    u32 flags;    
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca20 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20 64 65  /* Flags that de
1ca30 73 63 72 69 62 65 20 74 68 69 73 20 6c 6f 6f 70  scribe this loop
1ca40 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d   */..    pLoop =
1ca50 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
1ca60 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f  .    flags = pLo
1ca70 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20  op->wsFlags;.   
1ca80 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
1ca90 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28  E_MULTI_OR) || (
1caa0 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
1cab0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
1cac0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69  ) return;..    i
1cad0 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61 67 73  sSearch = (flags
1cae0 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  &(WHERE_BTM_LIMI
1caf0 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
1cb00 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  T))!=0.         
1cb10 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26 57 48     || ((flags&WH
1cb20 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1cb30 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  )==0 && (pLoop->
1cb40 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29 29 0a  u.btree.nEq>0)).
1cb50 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
1cb60 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52  wctrlFlags&(WHER
1cb70 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48  E_ORDERBY_MIN|WH
1cb80 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29  ERE_ORDERBY_MAX)
1cb90 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  );..    zMsg = s
1cba0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1cbb0 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72 63 68  , "%s", isSearch
1cbc0 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e 22  ?"SEARCH":"SCAN"
1cbd0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  );.    if( pItem
1cbe0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1cbf0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1cc00 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1cc10 73 67 2c 20 22 25 73 20 53 55 42 51 55 45 52 59  sg, "%s SUBQUERY
1cc20 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d   %d", zMsg,pItem
1cc30 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  ->iSelectId);.  
1cc40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
1cc50 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1cc60 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1cc70 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20 7a  "%s TABLE %s", z
1cc80 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  Msg, pItem->zNam
1cc90 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  e);.    }..    i
1cca0 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
1ccb0 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
1ccc0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1ccd0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41  (db, zMsg, "%s A
1cce0 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74  S %s", zMsg, pIt
1ccf0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
1cd00 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67   }.    if( (flag
1cd10 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57  s & (WHERE_IPK|W
1cd20 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1cd30 45 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 41  E))==0.     && A
1cd40 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 75 2e 62  LWAYS(pLoop->u.b
1cd50 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 29 0a  tree.pIndex!=0).
1cd60 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61      ){.      cha
1cd70 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c  r *zWhere = expl
1cd80 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62  ainIndexRange(db
1cd90 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e  , pLoop, pItem->
1cda0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73  pTab);.      zMs
1cdb0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1cdc0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 0a 20 20  ndf(db, zMsg,.  
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 66               ((f
1cde0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
1cdf0 4f 5f 49 4e 44 45 58 29 20 3f 20 0a 20 20 20 20  O_INDEX) ? .    
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1ce10 25 73 20 55 53 49 4e 47 20 41 55 54 4f 4d 41 54  %s USING AUTOMAT
1ce20 49 43 20 25 73 49 4e 44 45 58 25 2e 30 73 25 73  IC %sINDEX%.0s%s
1ce30 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  " :.            
1ce40 20 20 20 20 20 20 20 22 25 73 20 55 53 49 4e 47         "%s USING
1ce50 20 25 73 49 4e 44 45 58 20 25 73 25 73 22 29 2c   %sINDEX %s%s"),
1ce60 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1ce70 20 7a 4d 73 67 2c 20 28 28 66 6c 61 67 73 20 26   zMsg, ((flags &
1ce80 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
1ce90 20 3f 20 22 43 4f 56 45 52 49 4e 47 20 22 20 3a   ? "COVERING " :
1cea0 20 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20   ""),.          
1ceb0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
1cec0 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
1ced0 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  e, zWhere);.    
1cee0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1cef0 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20  db, zWhere);.   
1cf00 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
1cf10 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d  s & WHERE_IPK)!=
1cf20 30 20 26 26 20 28 66 6c 61 67 73 20 26 20 57 48  0 && (flags & WH
1cf30 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21  ERE_CONSTRAINT)!
1cf40 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  =0 ){.      zMsg
1cf50 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1cf60 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1cf70 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50   USING INTEGER P
1cf80 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73  RIMARY KEY", zMs
1cf90 67 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66  g);..      if( f
1cfa0 6c 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55  lags&(WHERE_COLU
1cfb0 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_EQ|WHERE_COLU
1cfc0 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20  MN_IN) ){.      
1cfd0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1cfe0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1cff0 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29  g, "%s (rowid=?)
1d000 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
1d010 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
1d020 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  &WHERE_BOTH_LIMI
1d030 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c  T)==WHERE_BOTH_L
1d040 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
1d050 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1d060 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1d070 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e   "%s (rowid>? AN
1d080 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73  D rowid<?)", zMs
1d090 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
1d0a0 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f  if( flags&WHERE_
1d0b0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1d0c0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1d0d0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1d0e0 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
1d0f0 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  >?)", zMsg);.   
1d100 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
1d110 41 59 53 28 66 6c 61 67 73 26 57 48 45 52 45 5f  AYS(flags&WHERE_
1d120 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20  TOP_LIMIT) ){.  
1d130 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1d140 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1d150 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
1d160 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d<?)", zMsg);.  
1d170 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e      }.    }.#ifn
1d180 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d190 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
1d1a0 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73   else if( (flags
1d1b0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
1d1c0 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
1d1d0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1d1e0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1d1f0 73 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20  sg, "%s VIRTUAL 
1d200 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25  TABLE INDEX %d:%
1d210 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20  s", zMsg,.      
1d220 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1d230 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
1d240 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  , pLoop->u.vtab.
1d250 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23  idxStr);.    }.#
1d260 65 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d  endif.    zMsg =
1d270 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1d280 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 22 2c  (db, zMsg, "%s",
1d290 20 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69   zMsg);.    sqli
1d2a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1d2b0 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64   OP_Explain, iId
1d2c0 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c  , iLevel, iFrom,
1d2d0 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
1d2e0 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
1d2f0 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
1d300 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c  OneScan(u,v,w,x,
1d310 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  y,z).#endif /* S
1d320 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
1d330 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  IN */.../*.** Ge
1d340 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1d350 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1d360 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20   iLevel-th loop 
1d370 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
1d380 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  use.** implement
1d390 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ation described 
1d3a0 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74  by pWInfo..*/.st
1d3b0 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64  atic Bitmask cod
1d3c0 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20  eOneLoopStart(. 
1d3d0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1d3e0 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74  fo,   /* Complet
1d3f0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
1d400 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  out the WHERE cl
1d410 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
1d420 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  evel,          /
1d430 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66  * Which level of
1d440 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f   pWInfo->a[] sho
1d450 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a  uld be coded */.
1d460 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
1d470 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20  dy     /* Which 
1d480 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72 65  tables are curre
1d490 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a  ntly available *
1d4a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b  /.){.  int j, k;
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1d4c0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
1d4d0 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
1d4e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
1d4f0 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
1d500 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
1d510 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20   addrNxt;       
1d520 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75    /* Where to ju
1d530 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  mp to continue w
1d540 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
1d550 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d  case */.  int om
1d560 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f  itTable;       /
1d570 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65  * True if we use
1d580 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   the index only 
1d590 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20  */.  int bRev;  
1d5a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d5b0 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
1d5c0 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  scan in reverse 
1d5d0 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  order */.  Where
1d5e0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
1d5f0 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65 76  /* The where lev
1d600 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  el to be coded *
1d610 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
1d620 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65 20  Loop;    /* The 
1d630 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1d640 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
1d650 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1d660 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70  WC;    /* Decomp
1d670 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  osition of the e
1d680 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75  ntire WHERE clau
1d690 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
1d6a0 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
1d6b0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45          /* A WHE
1d6c0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a  RE clause term *
1d6d0 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
1d6e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1d6f0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1d700 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
1d710 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
1d720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1d730 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1d740 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  on */.  Vdbe *v;
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d760 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1d770 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64  repared stmt und
1d780 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73  er constructions
1d790 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1d7a0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
1d7b0 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  tem;  /* FROM cl
1d7c0 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
1d7d0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  coded */.  int a
1d7e0 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
1d7f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
1d800 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
1d810 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
1d820 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
1d830 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
1d840 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
1d850 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
1d860 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  ith next cycle *
1d870 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65  /.  int iRowidRe
1d880 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  g = 0;        /*
1d890 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64   Rowid is stored
1d8a0 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
1d8b0 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a  r, if not zero *
1d8c0 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65  /.  int iRelease
1d8d0 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Reg = 0;      /*
1d8e0 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74   Temp register t
1d8f0 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65  o free before re
1d900 74 75 72 6e 69 6e 67 20 2a 2f 0a 20 20 42 69 74  turning */.  Bit
1d910 6d 61 73 6b 20 6e 65 77 4e 6f 74 52 65 61 64 79  mask newNotReady
1d920 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
1d930 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 70 50 61   value */..  pPa
1d940 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
1d950 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72  arse;.  v = pPar
1d960 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43  se->pVdbe;.  pWC
1d970 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
1d980 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1d990 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26  db;.  pLevel = &
1d9a0 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c  pWInfo->a[iLevel
1d9b0 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  ];.  pLoop = pLe
1d9c0 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70  vel->pWLoop;.  p
1d9d0 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66  TabItem = &pWInf
1d9e0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
1d9f0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
1da00 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
1da10 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65  ->iCursor;.  bRe
1da20 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76  v = (pWInfo->rev
1da30 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b  Mask>>iLevel)&1;
1da40 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28  .  omitTable = (
1da50 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1da60 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
1da70 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  !=0 .           
1da80 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
1da90 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46  lFlags & WHERE_F
1daa0 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a  ORCE_TABLE)==0;.
1dab0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1dac0 74 28 28 76 2c 20 22 42 65 67 69 6e 20 4a 6f 69  t((v, "Begin Joi
1dad0 6e 20 4c 6f 6f 70 20 25 64 22 2c 20 69 4c 65 76  n Loop %d", iLev
1dae0 65 6c 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  el));..  /* Crea
1daf0 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68  te labels for th
1db00 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63  e "break" and "c
1db10 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63  ontinue" instruc
1db20 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74  tions.  ** for t
1db30 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e  he current loop.
1db40 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72    Jump to addrBr
1db50 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  k to break out o
1db60 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a  f a loop..  ** J
1db70 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67  ump to cont to g
1db80 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  o immediately to
1db90 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
1dba0 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
1dbb0 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  loop..  **.  ** 
1dbc0 57 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e  When there is an
1dbd0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65   IN operator, we
1dbe0 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64   also have a "ad
1dbf0 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61  drNxt" label tha
1dc00 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20  t.  ** means to 
1dc10 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
1dc20 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20  e next IN value 
1dc30 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68  combination.  Wh
1dc40 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72  en.  ** there ar
1dc50 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72  e no IN operator
1dc60 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  s in the constra
1dc70 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e  ints, the "addrN
1dc80 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69  xt" label.  ** i
1dc90 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 22 61  s the same as "a
1dca0 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20  ddrBrk"..  */.  
1dcb0 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
1dcc0 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76  ->addrBrk = pLev
1dcd0 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71  el->addrNxt = sq
1dce0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1dcf0 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e  el(v);.  addrCon
1dd00 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
1dd10 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
1dd20 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1dd30 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1dd40 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
1dd50 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
1dd60 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20   JOIN, allocate 
1dd70 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  and.  ** initial
1dd80 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ize a memory cel
1dd90 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69  l that records i
1dda0 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74  f this table mat
1ddb0 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f  ches any.  ** ro
1ddc0 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61  w of the left ta
1ddd0 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  ble of the join.
1dde0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
1ddf0 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28  el->iFrom>0 && (
1de00 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e  pTabItem[0].join
1de10 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
1de20 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  =0 ){.    pLevel
1de30 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b  ->iLeftJoin = ++
1de40 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1de50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1de60 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1de70 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  r, 0, pLevel->iL
1de80 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64  eftJoin);.    Vd
1de90 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
1dea0 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f  nit LEFT JOIN no
1deb0 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a  -match flag"));.
1dec0 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
1ded0 6c 20 63 61 73 65 20 6f 66 20 61 20 46 52 4f 4d  l case of a FROM
1dee0 20 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79   clause subquery
1def0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1df00 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
1df10 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e    if( pTabItem->
1df20 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  viaCoroutine ){.
1df30 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64      int regYield
1df40 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67   = pTabItem->reg
1df50 52 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  Return;.    sqli
1df60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1df70 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61   OP_Integer, pTa
1df80 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  bItem->addrFillS
1df90 75 62 2d 31 2c 20 72 65 67 59 69 65 6c 64 29 3b  ub-1, regYield);
1dfa0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1dfb0 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  =  sqlite3VdbeAd
1dfc0 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
1dfd0 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
1dfe0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1dff0 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 63 6f   "next row of co
1e000 2d 72 6f 75 74 69 6e 65 20 25 73 22 2c 20 70 54  -routine %s", pT
1e010 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e  abItem->pTab->zN
1e020 61 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ame));.    sqlit
1e030 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e040 4f 50 5f 49 66 2c 20 72 65 67 59 69 65 6c 64 2b  OP_If, regYield+
1e050 31 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  1, addrBrk);.   
1e060 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1e070 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a  _Goto;.  }else..
1e080 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e090 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1e0a0 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e  .  if(  (pLoop->
1e0b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1e0c0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
1e0d0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1e0e0 31 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73  1:  The table is
1e0f0 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65   a virtual-table
1e100 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74  .  Use the VFilt
1e110 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20  er and VNext.   
1e120 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20   **          to 
1e130 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e  access the data.
1e140 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
1e150 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61  iReg;   /* P3 Va
1e160 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74  lue for OP_VFilt
1e170 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
1e180 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20  drNotFound;.    
1e190 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  int nConstraint 
1e1a0 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b  = pLoop->nLTerm;
1e1b0 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ..    sqlite3Exp
1e1c0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1e1d0 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73  e);.    iReg = s
1e1e0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1e1f0 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73  ge(pParse, nCons
1e200 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61  traint+2);.    a
1e210 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c  ddrNotFound = pL
1e220 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20  evel->addrBrk;. 
1e230 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
1e240 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b  onstraint; j++){
1e250 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 72 67  .      int iTarg
1e260 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20  et = iReg+j+2;. 
1e270 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f       pTerm = pLo
1e280 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
1e290 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
1e2a0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1e2b0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
1e2c0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
1e2d0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1e2e0 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
1e2f0 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
1e300 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61  el, j, bRev, iTa
1e310 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61  rget);.        a
1e320 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c  ddrNotFound = pL
1e330 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
1e340 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e350 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e360 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  ode(pParse, pTer
1e370 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
1e380 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , iTarget);.    
1e390 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1e3a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e3b0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
1e3c0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1e3d0 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Num, iReg);.    
1e3e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e3f0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1e400 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52   nConstraint, iR
1e410 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  eg+1);.    sqlit
1e420 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1e430 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72  OP_VFilter, iCur
1e440 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20  , addrNotFound, 
1e450 69 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20  iReg,.          
1e460 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1e470 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
1e480 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e490 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
1e4a0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3f  .vtab.needFree ?
1e4b0 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34   P4_MPRINTF : P4
1e4c0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 70 4c  _STATIC);.    pL
1e4d0 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  oop->u.vtab.need
1e4e0 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Free = 0;.    fo
1e4f0 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72  r(j=0; j<nConstr
1e500 61 69 6e 74 20 26 26 20 6a 3c 31 36 3b 20 6a 2b  aint && j<16; j+
1e510 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
1e520 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  Loop->u.vtab.omi
1e530 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a 20  tMask>>j)&1 ){. 
1e540 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
1e550 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4c 6f 6f 70  rm(pLevel, pLoop
1e560 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b 0a 20 20  ->aLTerm[j]);.  
1e570 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1e580 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1e590 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  VNext;.    pLeve
1e5a0 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
1e5b0 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
1e5c0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1e5d0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
1e5e0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1e5f0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52  Range(pParse, iR
1e600 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b  eg, nConstraint+
1e610 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  2);.    sqlite3E
1e620 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1e630 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a  se, 1);.  }else.
1e640 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1e650 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1e660 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4c  LE */..  if( (pL
1e670 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1e680 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20  HERE_IPK)!=0.   
1e690 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
1e6a0 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
1e6b0 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_IN|WHERE_COLU
1e6c0 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b 0a  MN_EQ))!=0.  ){.
1e6d0 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
1e6e0 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20  We can directly 
1e6f0 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67  reference a sing
1e700 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a  le row using an.
1e710 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1e720 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
1e730 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
1e740 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72  ROWID field.  Or
1e750 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1e760 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75   we reference mu
1e770 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e  ltiple rows usin
1e780 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e  g a "rowid IN (.
1e790 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20  ..)".    **     
1e7a0 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a       construct..
1e7b0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1e7c0 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  t( pLoop->u.btre
1e7d0 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20  e.nEq==1 );.    
1e7e0 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
1e7f0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1e800 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 54 65  pParse);.    pTe
1e810 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rm = pLoop->aLTe
1e820 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72  rm[0];.    asser
1e830 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
1e840 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
1e850 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ->pExpr!=0 );.  
1e860 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
1e870 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65  ble==0 );.    te
1e880 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
1e890 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1e8a0 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 69 52 6f  RTUAL );.    iRo
1e8b0 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75  widReg = codeEqu
1e8c0 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
1e8d0 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
1e8e0 20 30 2c 20 62 52 65 76 2c 20 69 52 65 6c 65 61   0, bRev, iRelea
1e8f0 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72  seReg);.    addr
1e900 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Nxt = pLevel->ad
1e910 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  drNxt;.    sqlit
1e920 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e930 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52  OP_MustBeInt, iR
1e940 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74  owidReg, addrNxt
1e950 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1e960 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
1e970 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20  otExists, iCur, 
1e980 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52  addrNxt, iRowidR
1e990 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg);.    sqlite3
1e9a0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1e9b0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1e9c0 69 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20  iRowidReg, 1);. 
1e9d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e9e0 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
1e9f0 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
1ea00 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43  dReg);.    VdbeC
1ea10 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
1ea20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
1ea30 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d  p = OP_Noop;.  }
1ea40 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d  else if( (pLoop-
1ea50 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1ea60 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20  _IPK)!=0.       
1ea70 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
1ea80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
1ea90 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20  UMN_RANGE)!=0.  
1eaa0 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33  ){.    /* Case 3
1eab0 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e  :  We have an in
1eac0 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
1ead0 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
1eae0 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20  ROWID field..   
1eaf0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74   */.    int test
1eb00 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
1eb10 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
1eb20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65   int memEndValue
1eb30 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54   = 0;.    WhereT
1eb40 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45  erm *pStart, *pE
1eb50 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  nd;..    assert(
1eb60 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
1eb70 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
1eb80 70 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20  pStart = pEnd = 
1eb90 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  0;.    if( pLoop
1eba0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1ebb0 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53  E_BTM_LIMIT ) pS
1ebc0 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  tart = pLoop->aL
1ebd0 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69  Term[j++];.    i
1ebe0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1ebf0 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
1ec00 4d 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f  MIT ) pEnd = pLo
1ec10 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1ec20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
1ec30 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d  art!=0 || pEnd!=
1ec40 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65  0 );.    if( bRe
1ec50 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  v ){.      pTerm
1ec60 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20   = pStart;.     
1ec70 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a   pStart = pEnd;.
1ec80 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65        pEnd = pTe
1ec90 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rm;.    }.    if
1eca0 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
1ecb0 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
1ecc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
1ecd0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64  xpression that d
1ece0 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74  efines the start
1ecf0 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
1ed00 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20  int r1, rTemp;  
1ed10 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1ed20 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74  rs for holding t
1ed30 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72  he start boundar
1ed40 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  y */..      /* T
1ed50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
1ed60 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78  stant maps TK_xx
1ed70 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72   codes into corr
1ed80 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20  esponding .     
1ed90 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73   ** seek opcodes
1eda0 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e  .  It depends on
1edb0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72   a particular or
1edc0 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a  dering of TK_xx.
1edd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1ede0 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b  onst u8 aMoveOp[
1edf0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
1ee00 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50   /* TK_GT */  OP
1ee10 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20  _SeekGt,.       
1ee20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20      /* TK_LE */ 
1ee30 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20   OP_SeekLe,.    
1ee40 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20         /* TK_LT 
1ee50 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20  */  OP_SeekLt,. 
1ee60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1ee70 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65  GE */  OP_SeekGe
1ee80 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
1ee90 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54  assert( TK_LE==T
1eea0 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f  K_GT+1 );      /
1eeb0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1eec0 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20  ordering.. */.  
1eed0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1eee0 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20  T==TK_GT+2 );   
1eef0 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68     /*  ... of th
1ef00 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e  e TK_xx values..
1ef10 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1ef20 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b  t( TK_GE==TK_GT+
1ef30 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e  3 );      /*  ..
1ef40 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a  . is correcct. *
1ef50 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
1ef60 20 28 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67   (pStart->wtFlag
1ef70 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
1ef80 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1ef90 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74  case( pStart->wt
1efa0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1efb0 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58  TUAL );.      pX
1efc0 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72   = pStart->pExpr
1efd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1efe0 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  pX!=0 );.      t
1eff0 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d  estcase( pStart-
1f000 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
1f010 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69  r ); /* transiti
1f020 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ve constraints *
1f030 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  /.      r1 = sql
1f040 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f050 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
1f060 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20  ght, &rTemp);.  
1f070 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f080 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70  ddOp3(v, aMoveOp
1f090 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20  [pX->op-TK_GT], 
1f0a0 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72  iCur, addrBrk, r
1f0b0 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
1f0c0 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
1f0d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f0e0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
1f0f0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
1f100 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 1);.      sql
1f110 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1f120 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70  eg(pParse, rTemp
1f130 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65  );.      disable
1f140 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74  Term(pLevel, pSt
1f150 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  art);.    }else{
1f160 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f170 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76  beAddOp2(v, bRev
1f180 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f   ? OP_Last : OP_
1f190 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64  Rewind, iCur, ad
1f1a0 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  drBrk);.    }.  
1f1b0 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20    if( pEnd ){.  
1f1c0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
1f1d0 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70      pX = pEnd->p
1f1e0 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
1f1f0 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
1f200 20 20 20 61 73 73 65 72 74 28 20 28 70 45 6e 64     assert( (pEnd
1f210 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1f220 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20  _VNULL)==0 );.  
1f230 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
1f240 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  nd->leftCursor!=
1f250 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73  iCur ); /* Trans
1f260 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74  itive constraint
1f270 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  s */.      testc
1f280 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61  ase( pEnd->wtFla
1f290 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1f2a0 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e  L );.      memEn
1f2b0 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73  dValue = ++pPars
1f2c0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
1f2d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1f2e0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
1f2f0 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b  t, memEndValue);
1f300 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f  .      if( pX->o
1f310 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e  p==TK_LT || pX->
1f320 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20  op==TK_GT ){.   
1f330 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52       testOp = bR
1f340 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f  ev ? OP_Le : OP_
1f350 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  Ge;.      }else{
1f360 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
1f370 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a  = bRev ? OP_Lt :
1f380 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a   OP_Gt;.      }.
1f390 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
1f3a0 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b  m(pLevel, pEnd);
1f3b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74  .    }.    start
1f3c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1f3d0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1f3e0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62    pLevel->op = b
1f3f0 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
1f400 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  OP_Next;.    pLe
1f410 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
1f420 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
1f430 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73 73 65   start;.    asse
1f440 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d  rt( pLevel->p5==
1f450 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74 65 73  0 );.    if( tes
1f460 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
1f470 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20        iRowidReg 
1f480 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  = iReleaseReg = 
1f490 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1f4a0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
1f4b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f4c0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
1f4d0 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
1f4e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f4f0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
1f500 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
1f510 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1f520 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f530 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d  Op3(v, testOp, m
1f540 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72  emEndValue, addr
1f550 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Brk, iRowidReg);
1f560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f570 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
1f580 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
1f590 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   | SQLITE_JUMPIF
1f5a0 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NULL);.    }.  }
1f5b0 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  else if( pLoop->
1f5c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1f5d0 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 2f  INDEXED ){.    /
1f5e0 2a 20 43 61 73 65 20 34 3a 20 41 20 73 63 61 6e  * Case 4: A scan
1f5f0 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e   using an index.
1f600 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1f610 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45         The WHERE
1f620 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74   clause may cont
1f630 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ain zero or more
1f640 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a   equality .    *
1f650 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20  *         terms 
1f660 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70  ("==" or "IN" op
1f670 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65  erators) that re
1f680 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20  fer to the N.   
1f690 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74   **         left
1f6a0 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  -most columns of
1f6b0 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d   the index. It m
1f6c0 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a  ay also contain.
1f6d0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
1f6e0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1f6f0 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20  aints (>, <, >= 
1f700 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e  or <=) on the in
1f710 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dexed.    **    
1f720 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74       column that
1f730 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1f740 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c  lows the N equal
1f750 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20  ities. Only .   
1f760 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
1f770 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d  right-most colum
1f780 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71  n can be an ineq
1f790 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73  uality - the res
1f7a0 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20  t must.    **   
1f7b0 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d        use the "=
1f7c0 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72  =" and "IN" oper
1f7d0 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70  ators. For examp
1f7e0 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20  le, if the .    
1f7f0 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78  **         index
1f800 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20   is on (x,y,z), 
1f810 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
1f820 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61  ng clauses are a
1f830 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ll .    **      
1f840 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20     optimized:.  
1f850 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1f860 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a         x=5.    *
1f870 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1f880 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a   AND y=10.    **
1f890 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1f8a0 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
1f8b0 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1f8c0 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a  ND y>5 AND y<10.
1f8d0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1f8e0 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e    x=5 AND y=5 AN
1f8f0 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20  D z<=10.    **. 
1f900 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
1f910 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74  e z<10 term of t
1f920 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e  he following can
1f930 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c  not be used, onl
1f940 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  y.    **        
1f950 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20   the x=5 term:. 
1f960 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1f970 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1f980 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20  z<10.    **.    
1f990 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79  **         N may
1f9a0 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72   be zero if ther
1f9b0 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79  e are inequality
1f9c0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20   constraints..  
1f9d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20    **         If 
1f9e0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65  there are no ine
1f9f0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1fa00 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61  nts, then N is a
1fa10 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
1fa20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20   least one..    
1fa30 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1fa40 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61    This case is a
1fa50 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68  lso used when th
1fa60 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
1fa70 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20   clause.    **  
1fa80 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
1fa90 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20  ts but an index 
1faa0 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77  is selected anyw
1fab0 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20  ay, in order.   
1fac0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66   **         to f
1fad0 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20  orce the output 
1fae0 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d  order to conform
1faf0 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e   to an ORDER BY.
1fb00 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74  .    */  .    st
1fb10 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
1fb20 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  tartOp[] = {.   
1fb30 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20     0,.      0,. 
1fb40 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20       OP_Rewind, 
1fb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
1fb60 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  (!start_constrai
1fb70 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26  nts && startEq &
1fb80 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  &  !bRev) */.   
1fb90 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20     OP_Last,     
1fba0 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21          /* 3: (!
1fbb0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1fbc0 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
1fbd0 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
1fbe0 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20   OP_SeekGt,     
1fbf0 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61        /* 4: (sta
1fc00 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1fc10 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21  && !startEq && !
1fc20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1fc30 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20  P_SeekLt,       
1fc40 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74      /* 5: (start
1fc50 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1fc60 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52   !startEq &&  bR
1fc70 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1fc80 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20  SeekGe,         
1fc90 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63    /* 6: (start_c
1fca0 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20  onstraints  &&  
1fcb0 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76  startEq && !bRev
1fcc0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1fcd0 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20 20  ekLe            
1fce0 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 7: (start_con
1fcf0 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
1fd00 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20  artEq &&  bRev) 
1fd10 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74  */.    };.    st
1fd20 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45  atic const u8 aE
1fd30 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndOp[] = {.     
1fd40 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20   OP_Noop,       
1fd50 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e        /* 0: (!en
1fd60 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a  d_constraints) *
1fd70 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45  /.      OP_IdxGE
1fd80 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1fd90 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  1: (end_constrai
1fda0 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f  nts && !bRev) */
1fdb0 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20  .      OP_IdxLT 
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
1fdd0 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
1fde0 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20  ts && bRev) */. 
1fdf0 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45     };.    int nE
1fe00 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
1fe10 65 65 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62  ee.nEq;  /* Numb
1fe20 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74  er of == or IN t
1fe30 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  erms */.    int 
1fe40 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20  isMinQuery = 0; 
1fe50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1fe60 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   this is an opti
1fe70 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e  mized SELECT min
1fe80 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  (x).. */.    int
1fe90 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
1fea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73            /* Bas
1feb0 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
1fec0 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61  ng constraint va
1fed0 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lues */.    int 
1fee0 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
1fef0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
1ff00 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20   register */.   
1ff10 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e   WhereTerm *pRan
1ff20 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a  geStart = 0;  /*
1ff30 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   Inequality cons
1ff40 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20  traint at range 
1ff50 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65  start */.    Whe
1ff60 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e  reTerm *pRangeEn
1ff70 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65  d = 0;    /* Ine
1ff80 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1ff90 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20  nt at range end 
1ffa0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
1ffb0 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
1ffc0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1ffd0 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73 20  ange start uses 
1ffe0 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
1fff0 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20      int endEq;  
20000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20010 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67   /* True if rang
20020 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e  e end uses ==, >
20030 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69  = or <= */.    i
20040 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  nt start_constra
20050 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53  ints;       /* S
20060 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73  tart of range is
20070 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a   constrained */.
20080 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
20090 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  int;            
200a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
200b0 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a  nstraint terms *
200c0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
200d0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
200e0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
200f0 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
20100 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78   */.    int iIdx
20110 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
20120 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
20130 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
20140 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
20150 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20   nExtraReg = 0; 
20160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20170 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67  ber of extra reg
20180 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f  isters needed */
20190 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  .    int op;    
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201b0 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e    /* Instruction
201c0 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63   opcode */.    c
201d0 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20  har *zStartAff; 
201e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
201f0 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72  ffinity for star
20200 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74  t of range const
20210 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61  raint */.    cha
20220 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20 20  r *zEndAff;     
20230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
20240 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66  inity for end of
20250 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
20260 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d  t */..    pIdx =
20270 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
20280 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 49 64 78  pIndex;.    iIdx
20290 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
202a0 64 78 43 75 72 3b 0a 0a 20 20 20 20 2f 2a 20 49  dxCur;..    /* I
202b0 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69  f this loop sati
202c0 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64  sfies a sort ord
202d0 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72 65  er (pOrderBy) re
202e0 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20 20  quest that .    
202f0 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74 6f  ** was passed to
20300 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   this function t
20310 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53  o implement a "S
20320 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e  ELECT min(x) ...
20330 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c  " .    ** query,
20340 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
20350 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77   will only allow
20360 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e   the loop to run
20370 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69   for.    ** a si
20380 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20  ngle iteration. 
20390 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
203a0 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72 65  the first row re
203b0 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68  turned.    ** sh
203c0 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20  ould not have a 
203d0 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65  NULL value store
203e0 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c  d in 'x'. If col
203f0 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a  umn 'x' is.    *
20400 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20  * the first one 
20410 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71  after the nEq eq
20420 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
20430 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  ts in the index,
20440 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71  .    ** this req
20450 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69  uires some speci
20460 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20  al handling..   
20470 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49   */.    if( (pWI
20480 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26  nfo->wctrlFlags&
20490 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
204a0 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  N)!=0.     && (p
204b0 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30  WInfo->bOBSat!=0
204c0 29 0a 20 20 20 20 20 26 26 20 28 70 49 64 78 2d  ).     && (pIdx-
204d0 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20  >nColumn>nEq).  
204e0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73    ){.      /* as
204f0 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
20500 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20  nExpr==1 ); */. 
20510 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
20520 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70  pOrderBy->a[0].p
20530 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
20540 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  Idx->aiColumn[nE
20550 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 69  q] ); */.      i
20560 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20  sMinQuery = 1;. 
20570 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
20580 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
20590 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75  * Find any inequ
205a0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
205b0 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73   terms for the s
205c0 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20  tart and end .  
205d0 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67    ** of the rang
205e0 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6a  e. .    */.    j
205f0 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
20600 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
20610 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
20620 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
20630 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61  Start = pLoop->a
20640 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20  LTerm[j++];.    
20650 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
20660 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
20670 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
20680 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
20690 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45  ){.      pRangeE
206a0 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  nd = pLoop->aLTe
206b0 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e  rm[j++];.      n
206c0 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
206d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65    }..    /* Gene
206e0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
206f0 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72  luate all constr
20700 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67  aint terms using
20710 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a   == or IN.    **
20720 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76   and store the v
20730 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74  alues of those t
20740 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79  erms in an array
20750 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
20760 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
20770 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f   regBase..    */
20780 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 63  .    regBase = c
20790 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
207a0 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65 76 65  rms(pParse,pLeve
207b0 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52 65 67  l,bRev,nExtraReg
207c0 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  ,&zStartAff);.  
207d0 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c 69    zEndAff = sqli
207e0 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
207f0 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
20800 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
20810 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20  ->addrNxt;..    
20820 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
20830 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64  ng a reverse ord
20840 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73  er scan on an as
20850 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f  cending index, o
20860 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61  r.    ** a forwa
20870 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  rd order scan on
20880 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
20890 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65  dex, interchange
208a0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61   the .    ** sta
208b0 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73  rt and end terms
208c0 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e   (pRangeStart an
208d0 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20  d pRangeEnd)..  
208e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45    */.    if( (nE
208f0 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  q<pIdx->nColumn 
20900 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e  && bRev==(pIdx->
20910 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d  aSortOrder[nEq]=
20920 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29  =SQLITE_SO_ASC))
20930 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26  .     || (bRev &
20940 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  & pIdx->nColumn=
20950 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  =nEq).    ){.   
20960 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72     SWAP(WhereTer
20970 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20  m *, pRangeEnd, 
20980 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
20990 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73    }..    testcas
209a0 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
209b0 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  & (pRangeStart->
209c0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
209d0 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  E)!=0 );.    tes
209e0 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
209f0 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61  rt && (pRangeSta
20a00 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
20a10 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_GE)!=0 );.   
20a20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
20a30 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45  eEnd && (pRangeE
20a40 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
20a50 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_LE)!=0 );.   
20a60 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
20a70 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45  eEnd && (pRangeE
20a80 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
20a90 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_GE)!=0 );.   
20aa0 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e   startEq = !pRan
20ab0 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67  geStart || pRang
20ac0 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
20ad0 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
20ae0 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20  );.    endEq =  
20af0 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70   !pRangeEnd || p
20b00 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
20b10 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
20b20 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63  GE);.    start_c
20b30 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61  onstraints = pRa
20b40 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e  ngeStart || nEq>
20b50 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20  0;..    /* Seek 
20b60 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
20b70 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
20b80 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20   the range. */. 
20b90 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
20ba0 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
20bb0 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20  angeStart ){.   
20bc0 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
20bd0 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70  = pRangeStart->p
20be0 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
20bf0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20c00 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
20c10 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29  ht, regBase+nEq)
20c20 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61  ;.      if( (pRa
20c30 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
20c40 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
20c50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
20c60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
20c70 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
20c80 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  t, regBase+nEq, 
20c90 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
20ca0 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61  }.      if( zSta
20cb0 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20  rtAff ){.       
20cc0 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
20cd0 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
20ce0 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  ht, zStartAff[nE
20cf0 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  q])==SQLITE_AFF_
20d00 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20  NONE){.         
20d10 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   /* Since the co
20d20 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62  mparison is to b
20d30 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68  e performed with
20d40 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a   no conversions.
20d50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70            ** app
20d60 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72  lied to the oper
20d70 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66  ands, set the af
20d80 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20  finity to apply 
20d90 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20  to pRight to .  
20da0 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
20db0 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a  E_AFF_NONE.  */.
20dc0 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74            zStart
20dd0 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
20de0 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
20df0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
20e00 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
20e10 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
20e20 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72  ge(pRight, zStar
20e30 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20  tAff[nEq]) ){.  
20e40 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
20e50 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
20e60 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
20e70 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20    }.      }  .  
20e80 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
20e90 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
20ea0 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  e( pRangeStart->
20eb0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
20ec0 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65  IRTUAL );.    }e
20ed0 6c 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65  lse if( isMinQue
20ee0 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
20ef0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20f00 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
20f10 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
20f20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
20f30 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20        startEq = 
20f40 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63  0;.      start_c
20f50 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a  onstraints = 1;.
20f60 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70      }.    codeAp
20f70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
20f80 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
20f90 6e 73 74 72 61 69 6e 74 2c 20 7a 53 74 61 72 74  nstraint, zStart
20fa0 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61  Aff);.    op = a
20fb0 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63  StartOp[(start_c
20fc0 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b  onstraints<<2) +
20fd0 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20   (startEq<<1) + 
20fe0 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72  bRev];.    asser
20ff0 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20  t( op!=0 );.    
21000 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
21010 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 74  _Rewind );.    t
21020 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
21030 4c 61 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  Last );.    test
21040 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
21050 6b 47 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  kGt );.    testc
21060 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
21070 47 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Ge );.    testca
21080 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
21090 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
210a0 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74  e( op==OP_SeekLt
210b0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
210c0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
210d0 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
210e0 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e  rNxt, regBase, n
210f0 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20  Constraint);..  
21100 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61    /* Load the va
21110 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71  lue for the ineq
21120 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
21130 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  t at the end of 
21140 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65  the.    ** range
21150 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a   (if any)..    *
21160 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e  /.    nConstrain
21170 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  t = nEq;.    if(
21180 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20   pRangeEnd ){.  
21190 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
211a0 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45   = pRangeEnd->pE
211b0 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
211c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
211d0 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
211e0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31  , regBase+nEq, 1
211f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21200 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
21210 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
21220 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28  +nEq);.      if(
21230 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46   (pRangeEnd->wtF
21240 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
21250 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  L)==0 ){.       
21260 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21270 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52  IsNullJump(v, pR
21280 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
21290 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
212a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
212b0 45 6e 64 41 66 66 20 29 7b 0a 20 20 20 20 20 20  EndAff ){.      
212c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
212d0 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
212e0 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71  ght, zEndAff[nEq
212f0 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
21300 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ONE){.          
21310 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d  /* Since the com
21320 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65  parison is to be
21330 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20   performed with 
21340 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20  no conversions. 
21350 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c           ** appl
21360 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ied to the opera
21370 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66  nds, set the aff
21380 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74  inity to apply t
21390 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20  o pRight to .   
213a0 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
213b0 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20  _AFF_NONE.  */. 
213c0 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66           zEndAff
213d0 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
213e0 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
213f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
21400 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
21410 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
21420 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b  pRight, zEndAff[
21430 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  nEq]) ){.       
21440 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20     zEndAff[nEq] 
21450 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
21460 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
21470 20 20 20 7d 20 20 0a 20 20 20 20 20 20 63 6f 64     }  .      cod
21480 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
21490 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
214a0 6e 45 71 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b  nEq+1, zEndAff);
214b0 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
214c0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74  nt++;.      test
214d0 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d  case( pRangeEnd-
214e0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
214f0 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d  VIRTUAL );.    }
21500 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
21510 65 65 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66  ee(db, zStartAff
21520 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
21530 46 72 65 65 28 64 62 2c 20 7a 45 6e 64 41 66 66  Free(db, zEndAff
21540 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f  );..    /* Top o
21550 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20  f the loop body 
21560 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  */.    pLevel->p
21570 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
21580 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
21590 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
215a0 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
215b0 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64   is past the end
215c0 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
215d0 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f  /.    op = aEndO
215e0 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20  p[(pRangeEnd || 
215f0 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76  nEq) * (1 + bRev
21600 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  )];.    testcase
21610 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b  ( op==OP_Noop );
21620 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
21630 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20  p==OP_IdxGE );. 
21640 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
21650 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20  =OP_IdxLT );.   
21660 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70   if( op!=OP_Noop
21670 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21680 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
21690 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
216a0 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
216b0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20   nConstraint);. 
216c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
216d0 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45  ChangeP5(v, endE
216e0 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20  q!=bRev ?1:0);. 
216f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
21700 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
21710 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
21720 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
21730 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66   value.    ** of
21740 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
21750 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71 75  n that the inequ
21760 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20  ality contrains 
21770 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20  is not NULL..   
21780 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75   ** If it is, ju
21790 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
217a0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
217b0 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
217c0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
217d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
217e0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
217f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
21800 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
21810 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
21820 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
21830 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
21840 54 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4c  T );.    if( (pL
21850 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
21860 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
21870 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
21880 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
21890 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
218a0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
218b0 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b  dxCur, nEq, r1);
218c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
218d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
218e0 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43  sNull, r1, addrC
218f0 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ont);.    }.    
21900 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
21910 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
21920 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20  );..    /* Seek 
21930 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  the table cursor
21940 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  , if required */
21950 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d  .    disableTerm
21960 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53  (pLevel, pRangeS
21970 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62  tart);.    disab
21980 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
21990 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 69  RangeEnd);.    i
219a0 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b  f( !omitTable ){
219b0 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
219c0 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d   = iReleaseReg =
219d0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
219e0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
219f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21a00 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
21a10 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f  id, iIdxCur, iRo
21a20 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
21a30 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
21a40 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
21a50 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
21a60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21a70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21a80 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f  _Seek, iCur, iRo
21a90 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66  widReg);  /* Def
21aa0 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20  erred seek */.  
21ab0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f    }..    /* Reco
21ac0 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  rd the instructi
21ad0 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69  on used to termi
21ae0 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44  nate the loop. D
21af0 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57  isable .    ** W
21b00 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
21b10 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74  s made redundant
21b20 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 72 61   by the index ra
21b30 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f  nge scan..    */
21b40 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
21b50 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21b60 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  ONEROW ){.      
21b70 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
21b80 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Noop;.    }else 
21b90 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
21ba0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
21bb0 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73  P_Prev;.    }els
21bc0 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
21bd0 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20  >op = OP_Next;. 
21be0 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
21bf0 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  >p1 = iIdxCur;. 
21c00 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
21c10 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
21c20 4f 4e 53 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b  ONSTRAINT)==0 ){
21c30 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
21c40 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
21c50 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
21c60 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  TEP;.    }else{.
21c70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
21c80 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
21c90 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69     }.  }else..#i
21ca0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21cb0 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
21cc0 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  N.  if( pLoop->w
21cd0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
21ce0 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f  ULTI_OR ){.    /
21cf0 2a 20 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f  * Case 5:  Two o
21d00 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c  r more separatel
21d10 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20  y indexed terms 
21d20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a  connected by OR.
21d30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
21d40 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
21d50 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
21d60 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b  BLE t1(a,b,c,d);
21d70 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
21d80 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
21d90 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  a);.    **   CRE
21da0 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20  ATE INDEX i2 ON 
21db0 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(b);.    **   
21dc0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20  CREATE INDEX i3 
21dd0 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a  ON t1(c);.    **
21de0 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
21df0 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
21e00 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28   a=5 OR b=7 OR (
21e10 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20  c=11 AND d=13). 
21e20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
21e30 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  the example, the
21e40 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64  re are three ind
21e50 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
21e60 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20  cted by OR..    
21e70 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  ** The top of th
21e80 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b  e loop looks lik
21e90 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
21ea0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
21eb0 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
21ec0 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
21ed0 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
21ee0 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20  reg 1.    **.   
21ef0 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61   ** Then, for ea
21f00 63 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c  ch indexed term,
21f10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20   the following. 
21f20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
21f30 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65  .    ** RowSetTe
21f40 73 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74  st are such that
21f50 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
21f60 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
21f70 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a   inserted.    **
21f80 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74   into the RowSet
21f90 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
21fa0 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74  dy present, cont
21fb0 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20  rol skips the.  
21fc0 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64    ** Gosub opcod
21fd0 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61  e and jumps stra
21fe0 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65  ight to the code
21ff0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68   generated by Wh
22000 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a  ereEnd()..    **
22010 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73  .    **        s
22020 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
22030 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20  (<term>).    ** 
22040 20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54           RowSetT
22050 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  est             
22060 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f       # Insert ro
22070 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a  wid into rowset.
22080 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
22090 47 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20  Gosub      2 A. 
220a0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
220b0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20  ite3WhereEnd(). 
220c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c     **.    ** Fol
220d0 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65  lowing the above
220e0 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e  , code to termin
220f0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61  ate the loop. La
22100 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65  bel A, the targe
22110 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
22120 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d  Gosub above, jum
22130 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75  ps to the instru
22140 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65  ction right afte
22150 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20  r the Goto..    
22160 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
22170 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
22180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
22190 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
221a0 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
221b0 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20            Goto  
221c0 20 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20       B          
221d0 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70        # The loop
221e0 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20   is finished..  
221f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
22200 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e    A: <loop body>
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22220 20 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20   # Return data, 
22230 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a  whatever..    **
22240 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
22250 20 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20   Return     2   
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a               # J
22270 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
22280 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20  Gosub.    **.   
22290 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66   **       B: <af
222a0 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20  ter the loop>.  
222b0 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20    **.    */.    
222c0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
222d0 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  Wc;    /* The OR
222e0 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f  -clause broken o
222f0 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  ut into subterms
22300 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20   */.    SrcList 
22310 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f  *pOrTab;       /
22320 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c  * Shortened tabl
22330 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61  e list or OR-cla
22340 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  use generation *
22350 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f  /.    Index *pCo
22360 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  v = 0;          
22370 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20     /* Potential 
22380 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28  covering index (
22390 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20  or NULL) */.    
223a0 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50  int iCovCur = pP
223b0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f  arse->nTab++;  /
223c0 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f  * Cursor used fo
223d0 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69  r index scans (i
223e0 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69  f any) */..    i
223f0 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  nt regReturn = +
22400 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
22410 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
22420 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f  ster used with O
22430 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69  P_Gosub */.    i
22440 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30  nt regRowset = 0
22450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22460 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
22470 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20  ster for RowSet 
22480 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e  object */.    in
22490 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20  t regRowid = 0; 
224a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
224c0 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69  ter holding rowi
224d0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f  d */.    int iLo
224e0 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  opBody = sqlite3
224f0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
22500 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c  ;  /* Start of l
22510 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20  oop body */.    
22520 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20  int iRetInit;   
22530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
22550 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72  ress of regRetur
22560 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e  n init */.    in
22570 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  t untestedTerms 
22580 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
22590 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e   /* Some terms n
225a0 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65  ot completely te
225b0 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sted */.    int 
225c0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
225e0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
225f0 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64  /.    Expr *pAnd
22600 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Expr = 0;       
22610 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22           /* An "
22620 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78  .. AND (...)" ex
22630 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a  pression */.   .
22640 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
22650 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20  p->aLTerm[0];.  
22660 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
22670 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
22680 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
22690 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20  or & WO_OR );.  
226a0 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
226b0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
226c0 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20  _ORINFO)!=0 );. 
226d0 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72     pOrWc = &pTer
226e0 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
226f0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
22700 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20   = OP_Return;.  
22710 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72    pLevel->p1 = r
22720 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f  egReturn;..    /
22730 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20 53  * Set up a new S
22740 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62  rcList in pOrTab
22750 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
22760 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e  table being scan
22770 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ned.    ** by th
22780 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61  is loop in the a
22790 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c  [0] slot and all
227a0 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
227b0 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73   in a[1..] slots
227c0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65  ..    ** This be
227d0 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73  comes the SrcLis
227e0 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  t in the recursi
227f0 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ve call to sqlit
22800 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a  e3WhereBegin()..
22810 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
22820 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
22830 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f  ){.      int nNo
22840 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
22850 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
22860 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64  umber of notRead
22870 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  y tables */.    
22880 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
22890 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20  _item *origSrc; 
228a0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
228b0 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  list of tables *
228c0 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64  /.      nNotRead
228d0 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  y = pWInfo->nLev
228e0 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b  el - iLevel - 1;
228f0 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
22900 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f  sqlite3StackAllo
22910 63 52 61 77 28 64 62 2c 0a 20 20 20 20 20 20 20  cRaw(db,.       
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72       sizeof(*pOr
22940 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a  Tab)+ nNotReady*
22950 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
22960 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [0]));.      if(
22970 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74   pOrTab==0 ) ret
22980 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20  urn notReady;.  
22990 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c      pOrTab->nAll
229a0 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52 65  oc = (u8)(nNotRe
229b0 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  ady + 1);.      
229c0 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70  pOrTab->nSrc = p
229d0 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20  OrTab->nAlloc;. 
229e0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72 54       memcpy(pOrT
229f0 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c  ab->a, pTabItem,
22a00 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74 65   sizeof(*pTabIte
22a10 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67 53  m));.      origS
22a20 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  rc = pWInfo->pTa
22a30 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  bList->a;.      
22a40 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74  for(k=1; k<=nNot
22a50 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20  Ready; k++){.   
22a60 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72       memcpy(&pOr
22a70 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67  Tab->a[k], &orig
22a80 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46  Src[pLevel[k].iF
22a90 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72  rom], sizeof(pOr
22aa0 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20  Tab->a[k]));.   
22ab0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
22ac0 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 70        pOrTab = p
22ad0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
22ae0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
22af0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f  nitialize the ro
22b00 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74 6f  wset register to
22b10 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41   contain NULL. A
22b20 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20  n SQL NULL is . 
22b30 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74     ** equivalent
22b40 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f 77   to an empty row
22b50 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  set..    **.    
22b60 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69  ** Also initiali
22b70 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20  ze regReturn to 
22b80 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72  contain the addr
22b90 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72  ess of the instr
22ba0 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69  uction .    ** i
22bb0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
22bc0 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75  wing the OP_Retu
22bd0 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  rn at the bottom
22be0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68   of the loop. Th
22bf0 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71  is.    ** is req
22c00 75 69 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f  uired in a few o
22c10 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e  bscure LEFT JOIN
22c20 20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e   cases where con
22c30 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a  trol jumps.    *
22c40 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f  * over the top o
22c50 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20  f the loop into 
22c60 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20  the body of it. 
22c70 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
22c80 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74   .    ** correct
22c90 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68   response for th
22ca0 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f  e end-of-loop co
22cb0 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72  de (the OP_Retur
22cc0 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a  n) is to .    **
22cd0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
22ce0 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
22cf0 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61  ction, just as a
22d00 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69  n OP_Next does i
22d10 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20  f.    ** called 
22d20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69  on an uninitiali
22d30 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20  zed cursor..    
22d40 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e  */.    if( (pWIn
22d50 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
22d60 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45   WHERE_DUPLICATE
22d70 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  S_OK)==0 ){.    
22d80 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b    regRowset = ++
22d90 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
22da0 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b      regRowid = +
22db0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
22dc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22dd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
22de0 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29  l, 0, regRowset)
22df0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74  ;.    }.    iRet
22e00 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Init = sqlite3Vd
22e10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
22e20 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65  nteger, 0, regRe
22e30 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  turn);..    /* I
22e40 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57  f the original W
22e50 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a  HERE clause is z
22e60 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28   of the form:  (
22e70 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29  x1 OR x2 OR ...)
22e80 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68   AND y.    ** Th
22e90 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  en for every ter
22ea0 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61  m xN, evaluate a
22eb0 73 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  s the subexpress
22ec0 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20  ion: xN AND z.  
22ed0 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74    ** That way, t
22ee0 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61  erms in y that a
22ef0 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f  re factored into
22f00 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e   the disjunction
22f10 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
22f20 70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68 65  picked up by the
22f30 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
22f40 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
22f50 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20  Begin() below.. 
22f60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74     **.    ** Act
22f70 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65  ually, each sube
22f80 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
22f90 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e  verted to "xN AN
22fa0 44 20 77 22 20 77 68 65 72 65 20 77 20 69 73 0a  D w" where w is.
22fb0 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65      ** the "inte
22fc0 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f  resting" terms o
22fd0 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74  f z - terms that
22fe0 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
22ff0 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  te in the.    **
23000 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
23010 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
23020 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68  IN, and terms th
23030 61 74 20 61 72 65 20 75 73 61 62 6c 65 20 61 73  at are usable as
23040 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73   .    ** indices
23050 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
23060 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  This optimizatio
23070 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c  n also only appl
23080 69 65 73 20 69 66 20 74 68 65 20 28 78 31 20 4f  ies if the (x1 O
23090 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72  R x2 OR ...) ter
230a0 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  m.    ** is not 
230b0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
230c0 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
230d0 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a  LEFT JOIN..    *
230e0 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68 74 74  * See ticket htt
230f0 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
23100 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36  rg/src/info/f236
23110 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20  9304e4.    */.  
23120 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
23130 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
23140 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72  iTerm;.      for
23150 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c  (iTerm=0; iTerm<
23160 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72  pWC->nTerm; iTer
23170 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  m++){.        Ex
23180 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d  pr *pExpr = pWC-
23190 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b  >a[iTerm].pExpr;
231a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 26 70 57  .        if( &pW
231b0 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20 70  C->a[iTerm] == p
231c0 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Term ) continue;
231d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70  .        if( Exp
231e0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
231f0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
23200 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23210 20 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b       if( pWC->a[
23220 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26  iTerm].wtFlags &
23230 20 28 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 20 29   (TERM_ORINFO) )
23240 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
23250 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69     if( (pWC->a[i
23260 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20  Term].eOperator 
23270 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63  & WO_ALL)==0 ) c
23280 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
23290 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
232a0 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
232b0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  r, 0);.        p
232c0 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65  AndExpr = sqlite
232d0 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 41 6e  3ExprAnd(db, pAn
232e0 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20  dExpr, pExpr);. 
232f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23300 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20   pAndExpr ){.   
23310 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20       pAndExpr = 
23320 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
23330 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20  rse, TK_AND, 0, 
23340 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20 20  pAndExpr, 0);.  
23350 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
23360 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
23370 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b  rWc->nTerm; ii++
23380 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
23390 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70  rm *pOrTerm = &p
233a0 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  OrWc->a[ii];.   
233b0 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
233c0 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
233d0 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f   || (pOrTerm->eO
233e0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44  perator & WO_AND
233f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
23400 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57  WhereInfo *pSubW
23410 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
23420 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c  * Info for singl
23430 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a  e OR-term scan *
23440 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
23450 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72  pOrExpr = pOrTer
23460 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
23470 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 26    if( pAndExpr &
23480 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
23490 74 79 28 70 4f 72 45 78 70 72 2c 20 45 50 5f 46  ty(pOrExpr, EP_F
234a0 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
234b0 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e        pAndExpr->
234c0 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72 3b  pLeft = pOrExpr;
234d0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 45 78  .          pOrEx
234e0 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20  pr = pAndExpr;. 
234f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23500 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
23510 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74   table entries t
23520 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70  hat match term p
23530 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  OrTerm. */.     
23540 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73     pSubWInfo = s
23550 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
23560 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c  (pParse, pOrTab,
23570 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a   pOrExpr, 0, 0,.
23580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23590 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 4d          WHERE_OM
235a0 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c 20  IT_OPEN_CLOSE | 
235b0 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c  WHERE_AND_ONLY |
235c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
235d0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 46           WHERE_F
235e0 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48 45  ORCE_TABLE | WHE
235f0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
23600 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20  , iCovCur);.    
23610 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
23620 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d  WInfo || pParse-
23630 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
23640 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
23650 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e       if( pSubWIn
23660 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
23670 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c  WhereLoop *pSubL
23680 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 65  oop;.          e
23690 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
236a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
236b0 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53  rse, pOrTab, &pS
236c0 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69  ubWInfo->a[0], i
236d0 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69  Level, pLevel->i
236e0 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20  From, 0.        
236f0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
23700 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
23710 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
23720 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30  UPLICATES_OK)==0
23730 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23740 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d  int iSet = ((ii=
23750 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29  =pOrWc->nTerm-1)
23760 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20  ?-1:ii);.       
23770 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20       int r;.    
23780 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69          r = sqli
23790 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
237a0 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61  lumn(pParse, pTa
237b0 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c  bItem->pTab, -1,
237c0 20 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20   iCur, .        
237d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237f0 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20   regRowid, 0);. 
23800 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
23810 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
23820 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74  v, OP_RowSetTest
23830 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20  , regRowset,.   
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
23860 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
23870 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53  Addr(v)+2, r, iS
23880 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  et);.          }
23890 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
238a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
238b0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74  OP_Gosub, regRet
238c0 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  urn, iLoopBody);
238d0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
238e0 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  he pSubWInfo->un
238f0 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67  testedTerms flag
23900 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
23910 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20   OR term.       
23920 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20     ** contained 
23930 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20  one or more AND 
23940 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52  term from a notR
23950 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65  eady table.  The
23960 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
23970 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74  rms from the not
23980 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c  Ready table coul
23990 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  d not be tested 
239a0 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  and will.       
239b0 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65     ** need to be
239c0 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20   tested later.. 
239d0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
239e0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
239f0 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
23a00 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72  ms ) untestedTer
23a10 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  ms = 1;..       
23a20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20     /* If all of 
23a30 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  the OR-connected
23a40 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d   terms are optim
23a50 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ized using the s
23a60 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ame.          **
23a70 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20   index, and the 
23a80 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20  index is opened 
23a90 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  using the same c
23aa0 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20  ursor number.   
23ab0 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63         ** by eac
23ac0 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  h call to sqlite
23ad0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61  3WhereBegin() ma
23ae0 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c  de by this loop,
23af0 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20   it may.        
23b00 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65    ** be possible
23b10 20 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64   to use that ind
23b20 65 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67  ex as a covering
23b30 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
23b40 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
23b50 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  * If the call to
23b60 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
23b70 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c  in() above resul
23b80 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68  ted in a scan th
23b90 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
23ba0 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61  uses an index, a
23bb0 6e 64 20 74 68 69 73 20 69 73 20 65 69 74 68 65  nd this is eithe
23bc0 72 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63  r the first OR-c
23bd0 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20  onnected term.  
23be0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
23bf0 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65  ssed or the inde
23c00 78 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  x is the same as
23c10 20 74 68 61 74 20 75 73 65 64 20 62 79 20 61 6c   that used by al
23c20 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  l previous.     
23c30 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73       ** terms, s
23c40 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63  et pCov to the c
23c50 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e  andidate coverin
23c60 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69  g index. Otherwi
23c70 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20  se, set .       
23c80 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55     ** pCov to NU
23c90 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  LL to indicate t
23ca0 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65  hat no candidate
23cb0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
23cc0 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20  will .          
23cd0 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e  ** be available.
23ce0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
23cf0 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f 70          pSubLoop
23d00 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b   = pSubWInfo->a[
23d10 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20  0].pWLoop;.     
23d20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53       assert( (pS
23d30 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  ubLoop->wsFlags 
23d40 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
23d50 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  EX)==0 );.      
23d60 20 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f 6f      if( (pSubLoo
23d70 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
23d80 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
23d90 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69 69            && (ii
23da0 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d  ==0 || pSubLoop-
23db0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3d  >u.btree.pIndex=
23dc0 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20 20  =pCov).         
23dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23de0 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66  assert( pSubWInf
23df0 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d  o->a[0].iIdxCur=
23e00 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20  =iCovCur );.    
23e10 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70          pCov = p
23e20 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  SubLoop->u.btree
23e30 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  .pIndex;.       
23e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23e50 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a        pCov = 0;.
23e60 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
23e70 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68         /* Finish
23e80 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67   the loop throug
23e90 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
23ea0 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
23eb0 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
23ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
23ed0 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29  reEnd(pSubWInfo)
23ee0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23ef0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c    }.    }.    pL
23f00 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20  evel->u.pCovidx 
23f10 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28 20  = pCov;.    if( 
23f20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69  pCov ) pLevel->i
23f30 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75 72  IdxCur = iCovCur
23f40 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45 78  ;.    if( pAndEx
23f50 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e 64  pr ){.      pAnd
23f60 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b  Expr->pLeft = 0;
23f70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
23f80 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41 6e  prDelete(db, pAn
23f90 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  dExpr);.    }.  
23fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
23fb0 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69  ngeP1(v, iRetIni
23fc0 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
23fd0 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20  rrentAddr(v));. 
23fe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23ff0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
24000 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72   0, pLevel->addr
24010 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Brk);.    sqlite
24020 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
24030 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  l(v, iLoopBody);
24040 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ..    if( pWInfo
24050 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c  ->nLevel>1 ) sql
24060 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62  ite3StackFree(db
24070 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69  , pOrTab);.    i
24080 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d  f( !untestedTerm
24090 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28  s ) disableTerm(
240a0 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
240b0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
240c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
240d0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
240e0 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73  ..  {.    /* Cas
240f0 65 20 36 3a 20 20 54 68 65 72 65 20 69 73 20 6e  e 6:  There is n
24100 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20  o usable index. 
24110 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f   We must do a co
24120 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20  mplete.    **   
24130 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74         scan of t
24140 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e  he entire table.
24150 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74  .    */.    stat
24160 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65  ic const u8 aSte
24170 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c  p[] = { OP_Next,
24180 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20   OP_Prev };.    
24190 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
241a0 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f  aStart[] = { OP_
241b0 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20  Rewind, OP_Last 
241c0 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  };.    assert( b
241d0 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d  Rev==0 || bRev==
241e0 31 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  1 );.    pLevel-
241f0 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76  >op = aStep[bRev
24200 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  ];.    pLevel->p
24210 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
24220 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73  evel->p2 = 1 + s
24230 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24240 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d  (v, aStart[bRev]
24250 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
24260 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35  ;.    pLevel->p5
24270 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
24280 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
24290 45 50 3b 0a 20 20 7d 0a 20 20 6e 65 77 4e 6f 74  EP;.  }.  newNot
242a0 52 65 61 64 79 20 3d 20 6e 6f 74 52 65 61 64 79  Ready = notReady
242b0 20 26 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49   & ~getMask(&pWI
242c0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
242d0 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65  Cur);..  /* Inse
242e0 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
242f0 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73  every subexpress
24300 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20  ion that can be 
24310 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20  completely.  ** 
24320 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74  computed using t
24330 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f  he current set o
24340 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  f tables..  */. 
24350 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
24360 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, j=pWC->nTerm;
24370 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d   j>0; j--, pTerm
24380 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
24390 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  E;.    testcase(
243a0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
243b0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
243c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
243d0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
243e0 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
243f0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
24400 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
24410 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
24420 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
24430 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
24440 65 72 65 71 41 6c 6c 20 26 20 6e 65 77 4e 6f 74  ereqAll & newNot
24450 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20  Ready)!=0 ){.   
24460 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49     testcase( pWI
24470 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
24480 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ms==0.          
24490 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
244a0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
244b0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
244c0 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  Y)!=0 );.      p
244d0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
244e0 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  erms = 1;.      
244f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
24500 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e      pE = pTerm->
24510 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
24520 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20  t( pE!=0 );.    
24530 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
24540 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61  tJoin && !ExprHa
24550 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
24560 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
24570 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
24580 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
24590 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
245a0 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c  e, pE, addrCont,
245b0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
245c0 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  LL);.    pTerm->
245d0 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
245e0 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  CODED;.  }..  /*
245f0 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20   Insert code to 
24600 74 65 73 74 20 66 6f 72 20 69 6d 70 6c 69 65 64  test for implied
24610 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 61 73   constraints bas
24620 65 64 20 6f 6e 20 74 72 61 6e 73 69 74 69 76 69  ed on transitivi
24630 74 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 22  ty.  ** of the "
24640 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  ==" operator..  
24650 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  **.  ** Example:
24660 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
24670 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 22 74  ause contains "t
24680 31 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20 22 74  1.a=t2.b" and "t
24690 32 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20 61 6e  2.b=123".  ** an
246a0 64 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20  d we are coding 
246b0 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20  the t1 loop and 
246c0 74 68 65 20 74 32 20 6c 6f 6f 70 20 68 61 73 20  the t2 loop has 
246d0 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 2c 0a 20  not yet coded,. 
246e0 20 2a 2a 20 74 68 65 6e 20 77 65 20 63 61 6e 6e   ** then we cann
246f0 6f 74 20 75 73 65 20 74 68 65 20 22 74 31 2e 61  ot use the "t1.a
24700 3d 74 32 2e 62 22 20 63 6f 6e 73 74 72 61 69 6e  =t2.b" constrain
24710 74 2c 20 62 75 74 20 77 65 20 63 61 6e 20 63 6f  t, but we can co
24720 64 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d 70 6c  de.  ** the impl
24730 69 65 64 20 22 74 31 2e 61 3d 31 32 33 22 20 63  ied "t1.a=123" c
24740 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a  onstraint..  */.
24750 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
24760 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, j=pWC->nTerm
24770 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72  ; j>0; j--, pTer
24780 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
24790 70 45 2c 20 2a 70 45 41 6c 74 3b 0a 20 20 20 20  pE, *pEAlt;.    
247a0 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b  WhereTerm *pAlt;
247b0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
247c0 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
247d0 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
247e0 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
247f0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
24800 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51  Operator!=(WO_EQ
24810 55 49 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e  UIV|WO_EQ) ) con
24820 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
24830 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
24840 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
24850 65 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  e;.    if( pLeve
24860 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63  l->iLeftJoin ) c
24870 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20  ontinue;.    pE 
24880 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
24890 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
248a0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
248b0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b   EP_FromJoin) );
248c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
248d0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
248e0 20 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21   & newNotReady)!
248f0 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20 3d  =0 );.    pAlt =
24900 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
24910 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  Cur, pTerm->u.le
24920 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61  ftColumn, notRea
24930 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
24940 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41 6c   0);.    if( pAl
24950 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
24960 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e 77  .    if( pAlt->w
24970 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43  tFlags & (TERM_C
24980 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
24990 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
249a0 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pAlt->eOperator 
249b0 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 74  & WO_EQ );.    t
249c0 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
249d0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
249e0 20 29 3b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70   );.    VdbeNoop
249f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
24a00 69 6e 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f  in transitive co
24a10 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a 20 20 20  nstraint"));.   
24a20 20 70 45 41 6c 74 20 3d 20 73 71 6c 69 74 65 33   pEAlt = sqlite3
24a30 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62  StackAllocRaw(db
24a40 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c 74 29  , sizeof(*pEAlt)
24a50 29 3b 0a 20 20 20 20 69 66 28 20 70 45 41 6c 74  );.    if( pEAlt
24a60 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 41 6c 74   ){.      *pEAlt
24a70 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b   = *pAlt->pExpr;
24a80 0a 20 20 20 20 20 20 70 45 41 6c 74 2d 3e 70 4c  .      pEAlt->pL
24a90 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b  eft = pE->pLeft;
24aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24ab0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
24ac0 2c 20 70 45 41 6c 74 2c 20 61 64 64 72 43 6f 6e  , pEAlt, addrCon
24ad0 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
24ae0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
24af0 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62  ite3StackFree(db
24b00 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20 20 7d 0a  , pEAlt);.    }.
24b10 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20    }..  /* For a 
24b20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c  LEFT OUTER JOIN,
24b30 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
24b40 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20  hat will record 
24b50 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20  the fact that.  
24b60 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
24b70 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74  row of the right
24b80 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68   table has match
24b90 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  ed the left tabl
24ba0 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  e.  .  */.  if( 
24bb0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
24bc0 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n ){.    pLevel-
24bd0 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c  >addrFirst = sql
24be0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
24bf0 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
24c00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
24c10 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
24c20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
24c30 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  n);.    VdbeComm
24c40 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20  ent((v, "record 
24c50 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29  LEFT JOIN hit"))
24c60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
24c70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
24c80 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  se);.    for(pTe
24c90 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20  rm=pWC->a, j=0; 
24ca0 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b  j<pWC->nTerm; j+
24cb0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
24cc0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
24cd0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
24ce0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
24cf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
24d00 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
24d10 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
24d20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
24d30 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
24d40 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
24d50 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
24d60 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
24d70 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 65 77 4e  prereqAll & newN
24d80 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
24d90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
24da0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
24db0 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20  erms );.        
24dc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
24dd0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
24de0 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  pTerm->pExpr );.
24df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24e00 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
24e10 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61   pTerm->pExpr, a
24e20 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
24e30 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
24e40 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
24e50 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
24e60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
24e70 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
24e80 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65  eg(pParse, iRele
24e90 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74 75  aseReg);..  retu
24ea0 72 6e 20 6e 65 77 4e 6f 74 52 65 61 64 79 3b 0a  rn newNotReady;.
24eb0 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
24ec0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
24ed0 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65  ** Print a Where
24ee0 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20  Loop object for 
24ef0 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73  debugging purpos
24f00 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  es.*/.static voi
24f10 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74  d whereLoopPrint
24f20 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 53  (WhereLoop *p, S
24f30 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
24f40 29 7b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b  ){.  int nb = 1+
24f50 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b  (pTabList->nSrc+
24f60 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74 20 53  7)/8;.  struct S
24f70 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
24f80 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  em = pTabList->a
24f90 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61   + p->iTab;.  Ta
24fa0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65  ble *pTab = pIte
24fb0 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  m->pTab;.  sqlit
24fc0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
24fd0 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c  c%2d.%0*llx.%0*l
24fe0 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20  lx", p->cId,.   
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25000 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70    p->iTab, nb, p
25010 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20  ->maskSelf, nb, 
25020 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73 71  p->prereq);.  sq
25030 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
25040 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20  (" %12s",.      
25050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
25060 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70  Item->zAlias ? p
25070 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70  Item->zAlias : p
25080 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  Tab->zName);.  i
25090 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
250a0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
250b0 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  BLE)==0 ){.    i
250c0 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  f( p->u.btree.pI
250d0 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 63 6f  ndex ){.      co
250e0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
250f0 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
25100 64 65 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  dex->zName;.    
25110 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
25120 20 7a 4e 61 6d 65 20 3d 20 22 69 70 6b 22 3b 0a   zName = "ipk";.
25130 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
25140 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
25150 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37  _autoindex_", 17
25160 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
25170 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53  int i = sqlite3S
25180 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d  trlen30(zName) -
25190 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   1;.        whil
251a0 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27  e( zName[i]!='_'
251b0 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20   ) i--;.        
251c0 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20  zName += i;.    
251d0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
251e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25  3DebugPrintf(".%
251f0 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65  -16s %2d", zName
25200 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  , p->u.btree.nEq
25210 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25220 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
25230 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22  Printf("%20s",""
25240 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
25250 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  {.    char *z;. 
25260 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62     if( p->u.vtab
25270 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20  .idxStr ){.     
25280 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
25290 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22  intf("(%d,\"%s\"
252a0 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20  ,%x)",.         
252b0 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62         p->u.vtab
252c0 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74  .idxNum, p->u.vt
252d0 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e  ab.idxStr, p->u.
252e0 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
252f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25300 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
25310 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20  intf("(%d,%x)", 
25320 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
25330 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  , p->u.vtab.omit
25340 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mask);.    }.   
25350 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25360 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29  ntf(" %-19s", z)
25370 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
25380 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ee(z);.  }.  sql
25390 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
253a0 22 20 66 20 25 30 34 78 20 4e 20 25 64 22 2c 20  " f %04x N %d", 
253b0 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e  p->wsFlags, p->n
253c0 4c 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65  LTerm);.  sqlite
253d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63  3DebugPrintf(" c
253e0 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c  ost %d,%d,%d\n",
253f0 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72   p->rSetup, p->r
25400 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 7d  Run, p->nOut);.}
25410 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
25420 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f  onvert bulk memo
25430 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20  ry into a valid 
25440 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63  WhereLoop that c
25450 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20  an be passed.** 
25460 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  to whereLoopClea
25470 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f  r harmlessly..*/
25480 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
25490 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65  reLoopInit(Where
254a0 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61  Loop *p){.  p->a
254b0 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72  LTerm = p->aLTer
254c0 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54  mSpace;.  p->nLT
254d0 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c  erm = 0;.  p->nL
254e0 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
254f0 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  (p->aLTermSpace)
25500 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d  ;.  p->wsFlags =
25510 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
25520 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ar the WhereLoop
25530 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65  .u union.  Leave
25540 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72   WhereLoop.pLTer
25550 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61  m intact..*/.sta
25560 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
25570 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c  opClearUnion(sql
25580 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
25590 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
255a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
255b0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c  RE_VIRTUALTABLE|
255c0 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
255d0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  ) ){.    if( (p-
255e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
255f0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
25600 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e  0 && p->u.vtab.n
25610 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20  eedFree ){.     
25620 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
25630 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
25640 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
25650 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
25660 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
25670 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d  dxStr = 0;.    }
25680 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46  else if( (p->wsF
25690 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
256a0 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  O_INDEX)!=0 && p
256b0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
256c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
256d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
256e0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
256f0 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20  ->zColAff);.    
25700 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
25710 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  db, p->u.btree.p
25720 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  Index);.      p-
25730 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
25740 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
25750 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
25760 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f  te internal memo
25770 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65  ry used by a Whe
25780 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
25790 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
257a0 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69  reLoopClear(sqli
257b0 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
257c0 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
257d0 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
257e0 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
257f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
25800 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c  LTerm);.  whereL
25810 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
25820 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  , p);.  whereLoo
25830 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  pInit(p);.}../*.
25840 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  ** Increase the 
25850 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
25860 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54  n for pLoop->aLT
25870 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c  erm[] to be at l
25880 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69  east n..*/.stati
25890 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52  c int whereLoopR
258a0 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64  esize(sqlite3 *d
258b0 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  b, WhereLoop *p,
258c0 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65   int n){.  Where
258d0 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20  Term **paNew;.  
258e0 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e  if( p->nLSlot>=n
258f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
25900 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29  _OK;.  n = (n+7)
25910 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73  &~7;.  paNew = s
25920 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
25930 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  w(db, sizeof(p->
25940 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20  aLTerm[0])*n);. 
25950 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20   if( paNew==0 ) 
25960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
25970 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61  MEM;.  memcpy(pa
25980 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20  New, p->aLTerm, 
25990 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
259a0 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b  [0])*p->nLSlot);
259b0 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d  .  if( p->aLTerm
259c0 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  !=p->aLTermSpace
259d0 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
259e0 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b  (db, p->aLTerm);
259f0 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
25a00 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f  aNew;.  p->nLSlo
25a10 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20  t = n;.  return 
25a20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
25a30 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e  .** Transfer con
25a40 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65  tent from the se
25a50 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20  cond pLoop into 
25a60 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74  the first..*/.st
25a70 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
25a80 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a  opXfer(sqlite3 *
25a90 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
25aa0 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  To, WhereLoop *p
25ab0 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 77 68 65  From){.  if( whe
25ac0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
25ad0 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54   pTo, pFrom->nLT
25ae0 65 72 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51  erm) ) return SQ
25af0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 77 68  LITE_NOMEM;.  wh
25b00 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
25b10 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 6d 65  n(db, pTo);.  me
25b20 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c  mcpy(pTo, pFrom,
25b30 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52   WHERE_LOOP_XFER
25b40 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  _SZ);.  memcpy(p
25b50 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f  To->aLTerm, pFro
25b60 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e  m->aLTerm, pTo->
25b70 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54  nLTerm*sizeof(pT
25b80 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a  o->aLTerm[0]));.
25b90 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46    if( pFrom->wsF
25ba0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
25bb0 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
25bc0 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e   pFrom->u.vtab.n
25bd0 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  eedFree = 0;.  }
25be0 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d  else if( (pFrom-
25bf0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
25c00 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
25c10 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e  ){.    pFrom->u.
25c20 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
25c30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
25c40 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
25c50 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72  ** Delete a Wher
25c60 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
25c70 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
25c80 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69  eLoopDelete(sqli
25c90 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
25ca0 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c  op *p){.  whereL
25cb0 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b  oopClear(db, p);
25cc0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
25cd0 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
25ce0 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e  * Free a WhereIn
25cf0 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a  fo structure.*/.
25d00 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
25d10 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65  eInfoFree(sqlite
25d20 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f  3 *db, WhereInfo
25d30 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28   *pWInfo){.  if(
25d40 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20   ALWAYS(pWInfo) 
25d50 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75  ){.    whereClau
25d60 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d  seClear(&pWInfo-
25d70 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65  >sWC);.    while
25d80 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  ( pWInfo->pLoops
25d90 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c   ){.      WhereL
25da0 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d  oop *p = pWInfo-
25db0 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70  >pLoops;.      p
25dc0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20  WInfo->pLoops = 
25dd0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
25de0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
25df0 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ete(db, p);.    
25e00 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
25e10 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
25e20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
25e30 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20  sert or replace 
25e40 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  a WhereLoop entr
25e50 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70  y using the temp
25e60 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a  late supplied..*
25e70 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
25e80 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
25e90 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72   might be overwr
25ea0 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77  itten if the new
25eb0 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20   template.** is 
25ec0 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66  better and has f
25ed0 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
25ee0 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c  s.  Or the templ
25ef0 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  ate will be igno
25f00 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e  red.** and no in
25f10 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20  sert will occur 
25f20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  if an existing W
25f30 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74  hereLoop is fast
25f40 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65  er and has.** fe
25f50 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
25f60 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61   than the templa
25f70 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61  te.  Otherwise a
25f80 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69   new WhereLoop i
25f90 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64  s.** added based
25fa0 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65   on the template
25fb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c  ..**.** If pBuil
25fc0 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e  der->pOrSet is n
25fd0 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20  ot NULL then we 
25fe0 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
25ff0 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72  only the.** prer
26000 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52  equisites and rR
26010 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74  un and nOut cost
26020 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20  s of the N best 
26030 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20  loops.  That.** 
26040 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67  information is g
26050 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70  athered in the p
26060 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
26070 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70  object.  This sp
26080 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73  ecial.** process
26090 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
260a0 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61   only for OR cla
260b0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
260c0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d  **.** When accum
260d0 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  ulating multiple
260e0 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75   loops (when pBu
260f0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
26100 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69   NULL) we.** sti
26110 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ll might overwri
26120 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73  te similar loops
26130 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65   with the new te
26140 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a  mplate if the.**
26150 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74   template is bet
26160 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20  ter.  Loops may 
26170 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
26180 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
26190 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
261a0 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  re met:.**.**   
261b0 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20   (1)  They have 
261c0 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a  the same iTab..*
261d0 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68  *    (2)  They h
261e0 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f  ave the same iSo
261f0 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29  rtIdx..**    (3)
26200 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
26210 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72  as same or fewer
26220 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
26230 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  an the current l
26240 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54  oop.**    (4)  T
26250 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20  he template has 
26260 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65  the same or lowe
26270 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20  r cost than the 
26280 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20  current loop.** 
26290 20 20 20 28 35 29 20 20 54 68 65 20 74 65 6d 70     (5)  The temp
262a0 6c 61 74 65 20 75 73 65 73 20 6d 6f 72 65 20 74  late uses more t
262b0 65 72 6d 73 20 6f 66 20 74 68 65 20 73 61 6d 65  erms of the same
262c0 20 69 6e 64 65 78 20 62 75 74 20 68 61 73 20 6e   index but has n
262d0 6f 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  o additional.** 
262e0 20 20 20 20 20 20 20 20 64 65 70 65 6e 64 65 6e          dependen
262f0 63 69 65 73 20 20 20 20 20 20 20 20 20 20 0a 2a  cies          .*
26300 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
26310 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65  reLoopInsert(Whe
26320 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
26330 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f  Builder, WhereLo
26340 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a  op *pTemplate){.
26350 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
26360 50 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65 78 74  Prev, *p, *pNext
26370 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 49 6e 66   = 0;.  WhereInf
26380 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
26390 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
263a0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
263b0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
263c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c  ;..  /* If pBuil
263d0 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64  der->pOrSet is d
263e0 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c  efined, then onl
263f0 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  y keep track of 
26400 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61  the costs.  ** a
26410 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f  nd prereqs..  */
26420 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d  .  if( pBuilder-
26430 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23 69  >pOrSet!=0 ){.#i
26440 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
26450 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20 3d  BLED.    u16 n =
26460 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
26470 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20  t->n;.    int x 
26480 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65  =.#endif.    whe
26490 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c  reOrInsert(pBuil
264a0 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65  der->pOrSet, pTe
264b0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20  mplate->prereq, 
264c0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
264d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
264e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264f0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
26500 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45  nOut);.#if WHERE
26510 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
26520 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
26530 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
26540 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
26550 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20  bugPrintf(x?"   
26560 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72  or-%d:  ":"   or
26570 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20  -X:  ", n);.    
26580 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
26590 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e  (pTemplate, pWIn
265a0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20  fo->pTabList);. 
265b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
265c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
265d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72  ;.  }..  /* Sear
265e0 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ch for an existi
265f0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  ng WhereLoop to 
26600 6f 76 65 72 77 72 69 74 65 2c 20 6f 72 20 77 68  overwrite, or wh
26610 69 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a 20 70  ich takes.  ** p
26620 72 69 6f 72 69 74 79 20 6f 76 65 72 20 70 54 65  riority over pTe
26630 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 66  mplate..  */.  f
26640 6f 72 28 70 70 50 72 65 76 3d 26 70 57 49 6e 66  or(ppPrev=&pWInf
26650 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70  o->pLoops, p=*pp
26660 50 72 65 76 3b 20 70 3b 20 70 70 50 72 65 76 3d  Prev; p; ppPrev=
26670 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70  &p->pNextLoop, p
26680 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69  =*ppPrev){.    i
26690 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
266a0 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70  plate->iTab || p
266b0 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d  ->iSortIdx!=pTem
266c0 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20  plate->iSortIdx 
266d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65  ){.      /* If e
266e0 69 74 68 65 72 20 74 68 65 20 69 54 61 62 20 6f  ither the iTab o
266f0 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65  r iSortIdx value
26700 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c  s for two WhereL
26710 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72 65 6e  oop are differen
26720 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  t.      ** then 
26730 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73  those WhereLoops
26740 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73   need to be cons
26750 69 64 65 72 65 64 20 73 65 70 61 72 61 74 65 6c  idered separatel
26760 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20  y.  Neither is. 
26770 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64       ** a candid
26780 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74  ate to replace t
26790 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20  he other. */.   
267a0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
267b0 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65   }.    /* In the
267c0 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
267d0 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65  ntation, the rSe
267e0 74 75 70 20 76 61 6c 75 65 20 69 73 20 65 69 74  tup value is eit
267f0 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20  her zero.    ** 
26800 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62  or the cost of b
26810 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d  uilding an autom
26820 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67  atic index (Nlog
26830 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e  N) and the NlogN
26840 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73  .    ** is the s
26850 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62  ame for compatib
26860 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a  le WhereLoops. *
26870 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
26880 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54  >rSetup==0 || pT
26890 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d  emplate->rSetup=
268a0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
268b0 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75       || p->rSetu
268c0 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p==pTemplate->rS
268d0 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  etup );..    /* 
268e0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
268f0 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72  e() always gener
26900 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73  ates and inserts
26910 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
26920 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65  ndex.    ** case
26930 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63   first.  Hence c
26940 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64  ompatible candid
26950 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e  ate WhereLoops n
26960 65 76 65 72 20 68 61 76 65 20 61 20 6c 61 72 67  ever have a larg
26970 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70  er.    ** rSetup
26980 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55  . Call this SETU
26990 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20  P-INVARIANT */. 
269a0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
269b0 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  etup>=pTemplate-
269c0 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20  >rSetup );..    
269d0 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26  if( (p->prereq &
269e0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
269f0 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20  eq)==p->prereq. 
26a00 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70      && p->rSetup
26a10 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  <=pTemplate->rSe
26a20 74 75 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72  tup.     && p->r
26a30 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run<=pTemplate->
26a40 72 52 75 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  rRun.    ){.    
26a50 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
26a60 20 74 61 6b 65 6e 20 77 68 65 6e 20 70 20 69 73   taken when p is
26a70 20 65 71 75 61 6c 20 6f 72 20 62 65 74 74 65 72   equal or better
26a80 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 20   than pTemplate 
26a90 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  in .      ** all
26aa0 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64 65 6e   of (1) dependen
26ab0 63 65 73 20 28 32 29 20 73 65 74 75 70 2d 63 6f  ces (2) setup-co
26ac0 73 74 2c 20 61 6e 64 20 28 33 29 20 72 75 6e 2d  st, and (3) run-
26ad0 63 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61  cost. */.      a
26ae0 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
26af0 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  ==pTemplate->rSe
26b00 74 75 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28  tup );.      if(
26b10 20 70 2d 3e 6e 4c 54 65 72 6d 3c 70 54 65 6d 70   p->nLTerm<pTemp
26b20 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 0a 20 20 20  late->nLTerm.   
26b30 20 20 20 20 26 26 20 28 70 2d 3e 77 73 46 6c 61      && (p->wsFla
26b40 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
26b50 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26  ED)!=0.       &&
26b60 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46   (pTemplate->wsF
26b70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
26b80 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
26b90 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  && p->u.btree.pI
26ba0 6e 64 65 78 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  ndex==pTemplate-
26bb0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 0a  >u.btree.pIndex.
26bc0 20 20 20 20 20 20 20 26 26 20 70 2d 3e 70 72 65         && p->pre
26bd0 72 65 71 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  req==pTemplate->
26be0 70 72 65 72 65 71 0a 20 20 20 20 20 20 29 7b 0a  prereq.      ){.
26bf0 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 77          /* Overw
26c00 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67  rite an existing
26c10 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20   WhereLoop with 
26c20 61 6e 20 73 69 6d 69 6c 61 72 20 6f 6e 65 20 74  an similar one t
26c30 68 61 74 20 75 73 65 73 0a 20 20 20 20 20 20 20  hat uses.       
26c40 20 2a 2a 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f   ** more terms o
26c50 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  f the index */. 
26c60 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
26c70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
26c80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26c90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26ca0 20 2f 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73   /* pTemplate is
26cb0 20 6e 6f 74 20 68 65 6c 70 66 75 6c 2e 0a 20 20   not helpful..  
26cc0 20 20 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20        ** Return 
26cd0 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
26ce0 20 6f 72 20 61 64 64 69 6e 67 20 61 6e 79 74 68   or adding anyth
26cf0 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 67  ing */.        g
26d00 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  oto whereLoopIns
26d10 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20  ert_noop;.      
26d20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
26d30 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65  (p->prereq & pTe
26d40 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d  mplate->prereq)=
26d50 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72  =pTemplate->prer
26d60 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52  eq.     && p->rR
26d70 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un>=pTemplate->r
26d80 52 75 6e 0a 20 20 20 20 20 26 26 20 41 4c 57 41  Run.     && ALWA
26d90 59 53 28 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  YS(p->rSetup>=pT
26da0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 29  emplate->rSetup)
26db0 20 2f 2a 20 53 65 65 20 53 45 54 55 50 2d 49 4e   /* See SETUP-IN
26dc0 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f  VARIANT above */
26dd0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
26de0 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78   Overwrite an ex
26df0 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
26e00 20 77 69 74 68 20 61 20 62 65 74 74 65 72 20 6f   with a better o
26e10 6e 65 3a 20 6f 6e 65 20 74 68 61 74 20 69 73 0a  ne: one that is.
26e20 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20        ** better 
26e30 61 74 20 6f 6e 65 20 6f 66 20 28 31 29 20 64 65  at one of (1) de
26e40 70 65 6e 64 65 6e 63 65 73 2c 20 28 32 29 20 73  pendences, (2) s
26e50 65 74 75 70 2d 63 6f 73 74 2c 20 6f 72 20 28 33  etup-cost, or (3
26e60 29 20 72 75 6e 2d 63 6f 73 74 0a 20 20 20 20 20  ) run-cost.     
26e70 20 2a 2a 20 61 6e 64 20 69 73 20 6e 6f 20 77 6f   ** and is no wo
26e80 72 73 65 20 69 6e 20 61 6e 79 20 6f 66 20 74 68  rse in any of th
26e90 6f 73 65 20 63 61 74 65 67 6f 72 69 65 73 2e 20  ose categories. 
26ea0 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  */.      pNext =
26eb0 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
26ec0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26ed0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  }.  }..  /* If w
26ee0 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
26ef0 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  nt it means that
26f00 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75   either p[] shou
26f10 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ld be overwritte
26f20 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d  n.  ** with pTem
26f30 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65  plate[] if p[] e
26f40 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d  xists, or if p==
26f50 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61  NULL then alloca
26f60 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68  te a new.  ** Wh
26f70 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65  ereLoop and inse
26f80 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20  rt it..  */.#if 
26f90 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
26fa0 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
26fb0 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
26fc0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30   ){.    if( p!=0
26fd0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26fe0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
26ff0 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20  s-del:  ");.    
27000 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
27010 28 70 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  (p, pWInfo->pTab
27020 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
27030 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
27040 6e 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22  ntf("ins-new:  "
27050 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  );.    whereLoop
27060 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
27070 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
27080 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  t);.  }.#endif. 
27090 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
270a0 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
270b0 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
270c0 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a  of(WhereLoop));.
270d0 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
270e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
270f0 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  EM;.    whereLoo
27100 70 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20  pInit(p);.  }.  
27110 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62  whereLoopXfer(db
27120 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  , p, pTemplate);
27130 0a 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20  .  p->pNextLoop 
27140 3d 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70 50 72  = pNext;.  *ppPr
27150 65 76 20 3d 20 70 3b 0a 20 20 69 66 28 20 28 70  ev = p;.  if( (p
27160 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
27170 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
27180 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  =0 ){.    Index 
27190 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62  *pIndex = p->u.b
271a0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
271b0 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70   if( pIndex && p
271c0 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29  Index->tnum==0 )
271d0 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  {.      p->u.btr
271e0 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
271f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
27200 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
27210 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
27220 74 68 65 20 69 6e 73 65 72 74 20 69 73 20 61 20  the insert is a 
27230 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65 4c 6f  no-op */.whereLo
27240 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a 0a 23  opInsert_noop:.#
27250 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
27260 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
27270 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
27280 30 78 38 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  0x8 ){.    sqlit
27290 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69  e3DebugPrintf("i
272a0 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20  ns-noop: ");.   
272b0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
272c0 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66  pTemplate, pWInf
272d0 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  o->pTabList);.  
272e0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
272f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 7d  n SQLITE_OK;  .}
27300 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20  ../*.** We have 
27310 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20 70  so far matched p
27320 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
27330 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73  .btree.nEq terms
27340 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 70 49   of the index pI
27350 6e 64 65 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20  ndex..** Try to 
27360 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a  match one more..
27370 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d  **.** If pProbe-
27380 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d  >tnum==0, that m
27390 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61  eans pIndex is a
273a0 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64   fake index used
273b0 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45   for the.** INTE
273c0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
273d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
273e0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
273f0 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f  Index(.  WhereLo
27400 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
27410 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  der,     /* The 
27420 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72  WhereLoop factor
27430 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  y */.  struct Sr
27440 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
27450 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  ,      /* FROM c
27460 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
27470 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49   analyzed */.  I
27480 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20  ndex *pProbe,   
27490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
274a0 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53  * An index on pS
274b0 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  rc */.  WhereCos
274c0 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20  t nInMul        
274d0 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e          /* log(N
274e0 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69  umber of iterati
274f0 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a  ons due to IN) *
27500 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
27510 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
27520 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a  der->pWInfo;  /*
27530 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63   WHERE analyse c
27540 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
27550 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
27560 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  fo->pParse;     
27570 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
27580 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
27590 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
275a0 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  >db;       /* Da
275b0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
275c0 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74  n malloc context
275d0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
275e0 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
275f0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
27600 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65  e WhereLoop unde
27610 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
27620 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
27630 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
27640 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65      /* A WhereTe
27650 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65  rm under conside
27660 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
27670 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  opMask;         
27680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
27690 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66  alid operators f
276a0 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  or constraints *
276b0 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  /.  WhereScan sc
276c0 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  an;             
276d0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
276e0 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73 20  for WHERE terms 
276f0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76  */.  Bitmask sav
27700 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20  ed_prereq;      
27710 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
27720 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
27730 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20  prereq */.  u16 
27740 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20  saved_nLTerm;   
27750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
27760 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
27770 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f   pNew->nLTerm */
27780 0a 20 20 69 6e 74 20 73 61 76 65 64 5f 6e 45 71  .  int saved_nEq
27790 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
277a0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
277b0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e  alue of pNew->u.
277c0 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75  btree.nEq */.  u
277d0 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73  32 saved_wsFlags
277e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
277f0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
27800 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67   of pNew->wsFlag
27810 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  s */.  WhereCost
27820 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20   saved_nOut;    
27830 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
27840 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
27850 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20  ->nOut */.  int 
27860 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
27870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
27880 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
27890 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
278a0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
278b0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
278c0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
278d0 6f 64 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ode */.  WhereCo
278e0 73 74 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20  st nRowEst;     
278f0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69           /* Esti
27900 6d 61 74 65 64 20 69 6e 64 65 78 20 73 65 6c 65  mated index sele
27910 63 74 69 76 69 74 79 20 2a 2f 0a 20 20 57 68 65  ctivity */.  Whe
27920 72 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b  reCost rLogSize;
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27940 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62  Logarithm of tab
27950 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65  le size */.  Whe
27960 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30  reTerm *pTop = 0
27970 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20  , *pBtm = 0; /* 
27980 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72  Top and bottom r
27990 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
279a0 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42   */..  pNew = pB
279b0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
279c0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
279d0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
279e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61  LITE_NOMEM;..  a
279f0 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
27a00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
27a10 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
27a20 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  ;.  assert( (pNe
27a30 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
27a40 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
27a50 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
27a60 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27a70 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
27a80 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c   opMask = WO_LT|
27a90 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69  WO_LE;.  }else i
27aa0 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c  f( pProbe->tnum<
27ab0 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69  =0 || (pSrc->joi
27ac0 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
27ad0 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73  !=0 ){.    opMas
27ae0 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  k = WO_EQ|WO_IN|
27af0 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
27b00 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65  T|WO_LE;.  }else
27b10 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
27b20 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53  O_EQ|WO_IN|WO_IS
27b30 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  NULL|WO_GT|WO_GE
27b40 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20  |WO_LT|WO_LE;.  
27b50 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  }.  if( pProbe->
27b60 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d  bUnordered ) opM
27b70 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57  ask &= ~(WO_GT|W
27b80 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
27b90 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  );..  assert( pN
27ba0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
27bb0 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  =pProbe->nColumn
27bc0 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
27bd0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3c 20 70 50  u.btree.nEq < pP
27be0 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  robe->nColumn ){
27bf0 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f  .    iCol = pPro
27c00 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65  be->aiColumn[pNe
27c10 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b  w->u.btree.nEq];
27c20 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 77  .    nRowEst = w
27c30 68 65 72 65 43 6f 73 74 28 70 50 72 6f 62 65 2d  hereCost(pProbe-
27c40 3e 61 69 52 6f 77 45 73 74 5b 70 4e 65 77 2d 3e  >aiRowEst[pNew->
27c50 75 2e 62 74 72 65 65 2e 6e 45 71 2b 31 5d 29 3b  u.btree.nEq+1]);
27c60 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74  .    if( nRowEst
27c70 3d 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f  ==0 && pProbe->o
27c80 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
27c90 29 20 6e 52 6f 77 45 73 74 20 3d 20 31 3b 0a 20  ) nRowEst = 1;. 
27ca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c   }else{.    iCol
27cb0 20 3d 20 2d 31 3b 0a 20 20 20 20 6e 52 6f 77 45   = -1;.    nRowE
27cc0 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54  st = 0;.  }.  pT
27cd0 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49  erm = whereScanI
27ce0 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c  nit(&scan, pBuil
27cf0 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e  der->pWC, pSrc->
27d00 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20  iCursor, iCol,. 
27d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70         opMask, p
27d30 50 72 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f  Probe);.  saved_
27d40 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74  nEq = pNew->u.bt
27d50 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64  ree.nEq;.  saved
27d60 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e  _nLTerm = pNew->
27d70 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f  nLTerm;.  saved_
27d80 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e  wsFlags = pNew->
27d90 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64  wsFlags;.  saved
27da0 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e  _prereq = pNew->
27db0 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f  prereq;.  saved_
27dc0 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  nOut = pNew->nOu
27dd0 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  t;.  pNew->rSetu
27de0 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a  p = 0;.  rLogSiz
27df0 65 20 3d 20 65 73 74 4c 6f 67 28 77 68 65 72 65  e = estLog(where
27e00 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52  Cost(pProbe->aiR
27e10 6f 77 45 73 74 5b 30 5d 29 29 3b 0a 20 20 66 6f  owEst[0]));.  fo
27e20 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
27e30 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70  K && pTerm!=0; p
27e40 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
27e50 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20  Next(&scan)){.  
27e60 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23    int nIn = 0;.#
27e70 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
27e80 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 29 20  E_ENABLE_STAT4) 
27e90 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
27ea0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 0a  E_ENABLE_STAT3).
27eb0 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69      int nRecVali
27ec0 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
27ed0 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 61 73 73  ecValid;.    ass
27ee0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
27ef0 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
27f00 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77     if( (pTerm->w
27f10 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
27f20 55 4c 4c 29 21 3d 30 20 26 26 20 70 53 72 63 2d  ULL)!=0 && pSrc-
27f30 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  >pTab->aCol[iCol
27f40 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20  ].notNull ){.   
27f50 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
27f60 73 6b 69 70 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  skip IS NOT NULL
27f70 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
27f80 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  a NOT NULL colum
27f90 6e 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69  n */.    }.#endi
27fa0 66 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  f.    if( pTerm-
27fb0 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
27fc0 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
27fd0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 61  continue;..    a
27fe0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
27ff0 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
28000 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ..    pNew->wsFl
28010 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
28020 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ags;.    pNew->u
28030 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
28040 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
28050 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
28060 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28  _nLTerm;.    if(
28070 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
28080 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
28090 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
280a0 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
280b0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
280c0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d  New->nLTerm++] =
280d0 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77   pTerm;.    pNew
280e0 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65  ->prereq = (save
280f0 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d  d_prereq | pTerm
28100 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26  ->prereqRight) &
28110 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66   ~pNew->maskSelf
28120 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  ;.    pNew->rRun
28130 20 3d 20 72 4c 6f 67 53 69 7a 65 3b 20 2f 2a 20   = rLogSize; /* 
28140 42 61 73 65 6c 69 6e 65 20 63 6f 73 74 20 69 73  Baseline cost is
28150 20 6c 6f 67 32 28 4e 29 2e 20 20 41 64 6a 75 73   log2(N).  Adjus
28160 74 6d 65 6e 74 73 20 62 65 6c 6f 77 20 2a 2f 0a  tments below */.
28170 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
28180 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
28190 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
281a0 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
281b0 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
281c0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
281d0 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20  RE_COLUMN_IN;.  
281e0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
281f0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
28200 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
28210 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e          /* "x IN
28220 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20   (SELECT ...)": 
28230 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c   TUNING: the SEL
28240 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20 72  ECT returns 25 r
28250 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e  ows */.        n
28260 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74  In = 46;  assert
28270 28 20 34 36 3d 3d 77 68 65 72 65 43 6f 73 74 28  ( 46==whereCost(
28280 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  25) );.      }el
28290 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  se if( ALWAYS(pE
282a0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20  xpr->x.pList && 
282b0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
282c0 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  nExpr) ){.      
282d0 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75    /* "x IN (valu
282e0 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20  e, value, ...)" 
282f0 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d  */.        nIn =
28300 20 77 68 65 72 65 43 6f 73 74 28 70 45 78 70 72   whereCost(pExpr
28310 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
28320 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
28330 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e   pNew->rRun += n
28340 49 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  In;.      pNew->
28350 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20  u.btree.nEq++;. 
28360 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
28370 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d  = nRowEst + nInM
28380 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65  ul + nIn;.    }e
28390 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  lse if( pTerm->e
283a0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
283b0 51 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  Q) ){.      asse
283c0 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
283d0 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
283e0 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f  MN_NULL|WHERE_CO
283f0 4c 55 4d 4e 5f 49 4e 29 29 21 3d 30 0a 20 20 20  LUMN_IN))!=0.   
28400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
28410 7c 20 6e 49 6e 4d 75 6c 3d 3d 30 20 29 3b 0a 20  | nInMul==0 );. 
28420 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
28430 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
28440 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28  MN_EQ;.      if(
28450 20 69 43 6f 6c 3c 30 20 20 0a 20 20 20 20 20 20   iCol<0  .      
28460 20 7c 7c 20 28 70 50 72 6f 62 65 2d 3e 6f 6e 45   || (pProbe->onE
28470 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26  rror!=OE_None &&
28480 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20   nInMul==0.     
28490 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75        && pNew->u
284a0 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f  .btree.nEq==pPro
284b0 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 29 0a 20  be->nColumn-1). 
284c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
284d0 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
284e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
284f0 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 7c 7c 20  OLUMN_IN)==0 || 
28500 69 43 6f 6c 3c 30 20 29 3b 0a 20 20 20 20 20 20  iCol<0 );.      
28510 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
28520 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b  |= WHERE_ONEROW;
28530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
28540 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
28550 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ++;.      pNew->
28560 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b  nOut = nRowEst +
28570 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20 7d 65 6c   nInMul;.    }el
28580 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f  se if( pTerm->eO
28590 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53  perator & (WO_IS
285a0 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 70  NULL) ){.      p
285b0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
285c0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
285d0 4c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  L;.      pNew->u
285e0 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20  .btree.nEq++;.  
285f0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49      /* TUNING: I
28600 53 20 4e 55 4c 4c 20 73 65 6c 65 63 74 73 20 32  S NULL selects 2
28610 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 6e   rows */.      n
28620 49 6e 20 3d 20 31 30 3b 20 20 61 73 73 65 72 74  In = 10;  assert
28630 28 20 31 30 3d 3d 77 68 65 72 65 43 6f 73 74 28  ( 10==whereCost(
28640 32 29 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  2) );.      pNew
28650 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74  ->nOut = nRowEst
28660 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b   + nInMul + nIn;
28670 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
28680 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
28690 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20  & (WO_GT|WO_GE) 
286a0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
286b0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
286c0 74 6f 72 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20  tor & WO_GT );. 
286d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
286e0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
286f0 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20  & WO_GE );.     
28700 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
28710 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
28720 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c  ANGE|WHERE_BTM_L
28730 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 42 74 6d  IMIT;.      pBtm
28740 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
28750 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65  pTop = 0;.    }e
28760 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
28770 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
28780 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f  tor & (WO_LT|WO_
28790 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73  LE) );.      tes
287a0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
287b0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 54 20  perator & WO_LT 
287c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
287d0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
287e0 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  tor & WO_LE );. 
287f0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
28800 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
28810 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
28820 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
28830 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pTop = pTerm;.  
28840 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77      pBtm = (pNew
28850 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
28860 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20  E_BTM_LIMIT)!=0 
28870 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
28880 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
28890 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
288a0 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 20  -2] : 0;.    }. 
288b0 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46     if( pNew->wsF
288c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
288d0 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  UMN_RANGE ){.   
288e0 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75     /* Adjust nOu
288f0 74 20 61 6e 64 20 72 52 75 6e 20 66 6f 72 20 53  t and rRun for S
28900 54 41 54 33 20 72 61 6e 67 65 20 76 61 6c 75 65  TAT3 range value
28910 73 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  s */.      asser
28920 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73  t( pNew->nOut==s
28930 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20  aved_nOut );.   
28940 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61     whereRangeSca
28950 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
28960 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f  ilder, pBtm, pTo
28970 70 2c 20 26 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b  p, &pNew->nOut);
28980 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
28990 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
289a0 5f 53 54 41 54 34 29 20 7c 7c 20 64 65 66 69 6e  _STAT4) || defin
289b0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
289c0 5f 53 54 41 54 33 29 0a 20 20 20 20 69 66 28 20  _STAT3).    if( 
289d0 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20  nInMul==0 .     
289e0 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70  && pProbe->nSamp
289f0 6c 65 20 0a 20 20 20 20 20 26 26 20 70 4e 65 77  le .     && pNew
28a00 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70  ->u.btree.nEq<=p
28a10 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f  Probe->nSampleCo
28a20 6c 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69  l.     && Optimi
28a30 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
28a40 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29 20  , SQLITE_Stat3) 
28a50 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 45 78  .    ){.      Ex
28a60 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
28a70 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
28a80 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30  tRowcnt nOut = 0
28a90 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
28aa0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28ab0 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
28ac0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
28ad0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
28ae0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
28af0 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 74  _EQ );.        t
28b00 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
28b10 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
28b20 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  SNULL );.       
28b30 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
28b40 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
28b50 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d  pBuilder, pExpr-
28b60 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b  >pRight, &nOut);
28b70 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
28b80 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
28b90 6f 72 20 26 20 57 4f 5f 49 4e 29 0a 20 20 20 20  or & WO_IN).    
28ba0 20 20 20 20 20 20 20 20 20 26 26 20 20 21 45 78           &&  !Ex
28bb0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
28bc0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
28bd0 74 29 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72  t)  ){.        r
28be0 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45  c = whereInScanE
28bf0 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
28c00 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  der, pExpr->x.pL
28c10 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20  ist, &nOut);.   
28c20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
28c30 74 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20 72 63  t( nOut==0 || rc
28c40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
28c50 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29 7b       if( nOut ){
28c60 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20  .        nOut = 
28c70 77 68 65 72 65 43 6f 73 74 28 6e 4f 75 74 29 3b  whereCost(nOut);
28c80 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
28c90 4f 75 74 20 3d 20 4d 49 4e 28 6e 4f 75 74 2c 20  Out = MIN(nOut, 
28ca0 73 61 76 65 64 5f 6e 4f 75 74 29 3b 0a 20 20 20  saved_nOut);.   
28cb0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
28cc0 66 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  f.    if( (pNew-
28cd0 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
28ce0 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
28cf0 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20  _IPK))==0 ){.   
28d00 20 20 20 2f 2a 20 45 61 63 68 20 72 6f 77 20 69     /* Each row i
28d10 6e 76 6f 6c 76 65 73 20 61 20 73 74 65 70 20 6f  nvolves a step o
28d20 66 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65  f the index, the
28d30 6e 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63  n a binary searc
28d40 68 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  h of.      ** th
28d50 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 2a 2f 0a  e main table */.
28d60 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
28d70 20 3d 20 20 77 68 65 72 65 43 6f 73 74 41 64 64   =  whereCostAdd
28d80 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 4c 6f  (pNew->rRun, rLo
28d90 67 53 69 7a 65 3e 32 37 20 3f 20 72 4c 6f 67 53  gSize>27 ? rLogS
28da0 69 7a 65 2d 31 37 20 3a 20 31 30 29 3b 0a 20 20  ize-17 : 10);.  
28db0 20 20 7d 0a 20 20 20 20 2f 2a 20 53 74 65 70 20    }.    /* Step 
28dc0 63 6f 73 74 20 66 6f 72 20 65 61 63 68 20 6f 75  cost for each ou
28dd0 74 70 75 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  tput row */.    
28de0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77 68 65  pNew->rRun = whe
28df0 72 65 43 6f 73 74 41 64 64 28 70 4e 65 77 2d 3e  reCostAdd(pNew->
28e00 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74  rRun, pNew->nOut
28e10 29 3b 0a 20 20 20 20 2f 2a 20 54 42 44 3a 20 41  );.    /* TBD: A
28e20 64 6a 75 73 74 20 6e 4f 75 74 20 66 6f 72 20 61  djust nOut for a
28e30 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73 74 72  dditional constr
28e40 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 72 63 20  aints */.    rc 
28e50 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
28e60 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
28e70 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77  );.    if( (pNew
28e80 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
28e90 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a  E_TOP_LIMIT)==0.
28ea0 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e       && pNew->u.
28eb0 62 74 72 65 65 2e 6e 45 71 3c 28 70 50 72 6f 62  btree.nEq<(pProb
28ec0 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 28 70 50  e->nColumn + (pP
28ed0 72 6f 62 65 2d 3e 7a 4e 61 6d 65 21 3d 30 29 29  robe->zName!=0))
28ee0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68  .    ){.      wh
28ef0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
28f00 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
28f10 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e  Src, pProbe, nIn
28f20 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a  Mul+nIn);.    }.
28f30 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
28f40 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66   saved_nOut;.#if
28f50 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
28f60 45 4e 41 42 4c 45 5f 53 54 41 54 34 29 20 7c 7c  ENABLE_STAT4) ||
28f70 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
28f80 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 0a 20 20  ENABLE_STAT3).  
28f90 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
28fa0 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69  Valid = nRecVali
28fb0 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  d;.#endif.  }.  
28fc0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
28fd0 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70  aved_prereq;.  p
28fe0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
28ff0 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
29000 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
29010 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
29020 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
29030 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ved_nOut;.  pNew
29040 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
29050 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75 72  _nLTerm;.  retur
29060 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
29070 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74  eturn True if it
29080 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
29090 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62  t pIndex might b
290a0 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69  e useful in.** i
290b0 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  mplementing the 
290c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
290d0 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a  in pBuilder..**.
290e0 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20  ** Return False 
290f0 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73  if pBuilder does
29100 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20   not contain an 
29110 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
29120 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  or.** if there i
29130 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e  s no way for pIn
29140 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c  dex to be useful
29150 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   in implementing
29160 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42   that.** ORDER B
29170 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61  Y clause..*/.sta
29180 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67  tic int indexMig
29190 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42  htHelpWithOrderB
291a0 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  y(.  WhereLoopBu
291b0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
291c0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
291d0 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a  ,.  int iCursor.
291e0 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
291f0 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a  OB;.  int ii, jj
29200 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d  ;..  if( pIndex-
29210 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65  >bUnordered ) re
29220 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
29230 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  OB = pBuilder->p
29240 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29  WInfo->pOrderBy)
29250 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
29260 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
29270 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  OB->nExpr; ii++)
29280 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
29290 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
292a0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e  kipCollate(pOB->
292b0 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  a[ii].pExpr);.  
292c0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
292d0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
292e0 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
292f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43  Expr->iTable==iC
29300 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 66  ursor ){.      f
29310 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
29320 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 6a 2b  ex->nColumn; jj+
29330 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
29340 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
29350 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
29360 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b  [jj] ) return 1;
29370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29380 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
29390 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
293a0 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31   bitmask where 1
293b0 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
293c0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
293d0 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  g column of.** t
293e0 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64  he table is used
293f0 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f   by an index.  O
29400 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33  nly the first 63
29410 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e   columns are con
29420 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  sidered..*/.stat
29430 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d  ic Bitmask colum
29440 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20  nsInIndex(Index 
29450 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73  *pIdx){.  Bitmas
29460 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  k m = 0;.  int j
29470 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e  ;.  for(j=pIdx->
29480 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b  nColumn-1; j>=0;
29490 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78   j--){.    int x
294a0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
294b0 6e 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  n[j];.    assert
294c0 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 74 65  ( x>=0 );.    te
294d0 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31  stcase( x==BMS-1
294e0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
294f0 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  ( x==BMS-2 );.  
29500 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20    if( x<BMS-1 ) 
29510 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b  m |= MASKBIT(x);
29520 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
29530 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
29540 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
29550 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
29560 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
29570 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
29580 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
29590 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
295a0 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
295b0 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
295c0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
295d0 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
295e0 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
295f0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
29600 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
29610 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
29620 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f 72  rm *pTerm;.  for
29630 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  (i=0, pTerm=pWC-
29640 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
29650 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
29660 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
29670 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
29680 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70 57  pTerm->pExpr, pW
29690 68 65 72 65 2c 20 69 54 61 62 29 20 29 20 72 65  here, iTab) ) re
296a0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
296b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
296c0 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
296d0 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
296e0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66   single table of
296f0 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20   the join where 
29700 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  the table.** is 
29710 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69  idenfied by pBui
29720 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
29730 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
29740 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
29750 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61  e.** a b-tree ta
29760 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75  ble, not a virtu
29770 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
29780 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
29790 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65  pAddBtree(.  Whe
297a0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
297b0 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52  Builder, /* WHER
297c0 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
297d0 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
297e0 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20  k mExtra        
297f0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
29800 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72  rerequesites for
29810 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c   using this tabl
29820 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
29830 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
29840 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
29850 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
29860 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
29870 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
29880 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
29890 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
298a0 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20  /.  Index sPk;  
298b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298c0 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20  /* A fake index 
298d0 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70  object for the p
298e0 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
298f0 74 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73 74  tRowcnt aiRowEst
29900 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54  Pk[2];      /* T
29910 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61  he aiRowEst[] va
29920 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
29930 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61  index */.  int a
29940 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20  iColumnPk = -1; 
29950 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43         /* The aC
29960 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f  olumn[] value fo
29970 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
29980 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
29990 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
299a0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
299b0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
299c0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
299d0 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc;  /* The FROM
299e0 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65   clause btree te
299f0 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57  rm to add */.  W
29a00 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
29a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
29a20 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
29a30 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
29a40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29a50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
29a60 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
29a70 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20   iSortIdx = 1;  
29a80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
29a90 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  x number */.  in
29aa0 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  t b;            
29ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62            /* A b
29ac0 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a  oolean value */.
29ad0 20 20 57 68 65 72 65 43 6f 73 74 20 72 53 69 7a    WhereCost rSiz
29ae0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
29af0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
29b00 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
29b10 20 20 57 68 65 72 65 43 6f 73 74 20 72 4c 6f 67    WhereCost rLog
29b20 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Size;         /*
29b30 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   Logarithm of th
29b40 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
29b50 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
29b60 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
29b70 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pWC;           /
29b80 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45  * The parsed WHE
29b90 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 0a  RE clause */.  .
29ba0 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
29bb0 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66  r->pNew;.  pWInf
29bc0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
29bd0 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74  Info;.  pTabList
29be0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
29bf0 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70 54  ist;.  pSrc = pT
29c00 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77  abList->a + pNew
29c10 2d 3e 69 54 61 62 3b 0a 20 20 70 57 43 20 3d 20  ->iTab;.  pWC = 
29c20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
29c30 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74   assert( !IsVirt
29c40 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20  ual(pSrc->pTab) 
29c50 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  );..  if( pSrc->
29c60 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  pIndex ){.    /*
29c70 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
29c80 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
29c90 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
29ca0 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
29cb0 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
29cc0 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b  pIndex;.  }else{
29cd0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73  .    /* There is
29ce0 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63   no INDEXED BY c
29cf0 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61  lause.  Create a
29d00 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65   fake Index obje
29d10 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20  ct in local.    
29d20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20  ** variable sPk 
29d30 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  to represent the
29d40 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b   rowid primary k
29d50 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  ey index.  Make 
29d60 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65  this.    ** fake
29d70 20 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74   index the first
29d80 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49   in a chain of I
29d90 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74  ndex objects wit
29da0 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61  h all of the rea
29db0 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73  l.    ** indices
29dc0 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20   to follow */.  
29dd0 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b    Index *pFirst;
29de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29df0 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65    /* First of re
29e00 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  al indices on th
29e10 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d  e table */.    m
29e20 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73  emset(&sPk, 0, s
29e30 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20  izeof(Index));. 
29e40 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d     sPk.nColumn =
29e50 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f   1;.    sPk.aiCo
29e60 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e  lumn = &aiColumn
29e70 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f  Pk;.    sPk.aiRo
29e80 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50  wEst = aiRowEstP
29e90 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72  k;.    sPk.onErr
29ea0 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  or = OE_Replace;
29eb0 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20  .    sPk.pTable 
29ec0 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
29ed0 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20    aiRowEstPk[0] 
29ee0 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52  = pSrc->pTab->nR
29ef0 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77  owEst;.    aiRow
29f00 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20  EstPk[1] = 1;.  
29f10 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d    pFirst = pSrc-
29f20 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
29f30 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74     if( pSrc->not
29f40 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20  Indexed==0 ){.  
29f50 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20      /* The real 
29f60 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74  indices of the t
29f70 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f  able are only co
29f80 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a  nsidered if the.
29f90 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44        ** NOT IND
29fa0 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69  EXED qualifier i
29fb0 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  s omitted from t
29fc0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
29fd0 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78  /.      sPk.pNex
29fe0 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20  t = pFirst;.    
29ff0 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26  }.    pProbe = &
2a000 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65  sPk;.  }.  rSize
2a010 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70 53 72   = whereCost(pSr
2a020 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  c->pTab->nRowEst
2a030 29 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  );.  rLogSize = 
2a040 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a  estLog(rSize);..
2a050 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a060 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
2a070 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74  DEX.  /* Automat
2a080 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  ic indexes */.  
2a090 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70  if( !pBuilder->p
2a0a0 4f 72 53 65 74 0a 20 20 20 26 26 20 28 70 57 49  OrSet.   && (pWI
2a0b0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  nfo->pParse->db-
2a0c0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2a0d0 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20  AutoIndex)!=0.  
2a0e0 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65 78   && pSrc->pIndex
2a0f0 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63 2d  ==0.   && !pSrc-
2a100 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20  >viaCoroutine.  
2a110 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e   && !pSrc->notIn
2a120 64 65 78 65 64 0a 20 20 20 26 26 20 21 70 53 72  dexed.   && !pSr
2a130 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 0a  c->isCorrelated.
2a140 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65    ){.    /* Gene
2a150 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20  rate auto-index 
2a160 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20  WhereLoops */.  
2a170 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2a180 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  rm;.    WhereTer
2a190 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d  m *pWCEnd = pWC-
2a1a0 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b  >a + pWC->nTerm;
2a1b0 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
2a1c0 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54  WC->a; rc==SQLIT
2a1d0 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57  E_OK && pTerm<pW
2a1e0 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
2a1f0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
2a200 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
2a210 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
2a220 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2a230 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
2a240 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
2a250 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 0) ){.       
2a260 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
2a270 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  Eq = 1;.        
2a280 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
2a290 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
2a2a0 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2a2b0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
2a2c0 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
2a2d0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  erm;.        /* 
2a2e0 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65  TUNING: One-time
2a2f0 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74   cost for comput
2a300 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ing the automati
2a310 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20  c index is.     
2a320 20 20 20 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74     ** approximat
2a330 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32 28 4e 29 20  ely 7*N*log2(N) 
2a340 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
2a350 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
2a360 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2a370 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
2a380 78 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  xed. */.        
2a390 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72  pNew->rSetup = r
2a3a0 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20  LogSize + rSize 
2a3b0 2b 20 32 38 3b 20 20 61 73 73 65 72 74 28 20 32  + 28;  assert( 2
2a3c0 38 3d 3d 77 68 65 72 65 43 6f 73 74 28 37 29 20  8==whereCost(7) 
2a3d0 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  );.        /* TU
2a3e0 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78  NING: Each index
2a3f0 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32   lookup yields 2
2a400 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  0 rows in the ta
2a410 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20  ble.  This.     
2a420 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68     ** is more th
2a430 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65  an the usual gue
2a440 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73  ss of 10 rows, s
2a450 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20  ince we have no 
2a460 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  way.        ** o
2a470 66 20 6b 6e 6f 77 6e 69 6e 67 20 68 6f 77 20 73  f knowning how s
2a480 65 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64  elective the ind
2a490 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65  ex will ultimate
2a4a0 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64  ly be.  It would
2a4b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
2a4c0 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  be unreasonable 
2a4d0 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c  to make this val
2a4e0 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20  ue much larger. 
2a4f0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
2a500 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73  >nOut = 43;  ass
2a510 65 72 74 28 20 34 33 3d 3d 77 68 65 72 65 43 6f  ert( 43==whereCo
2a520 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20  st(20) );.      
2a530 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77    pNew->rRun = w
2a540 68 65 72 65 43 6f 73 74 41 64 64 28 72 4c 6f 67  hereCostAdd(rLog
2a550 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29  Size,pNew->nOut)
2a560 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2a570 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
2a580 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20  AUTO_INDEX;.    
2a590 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2a5a0 20 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72   = mExtra | pTer
2a5b0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
2a5c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
2a5d0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2a5e0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2a5f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2a600 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2a610 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
2a620 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c  INDEX */..  /* L
2a630 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
2a640 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ices.  */.  for(
2a650 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
2a660 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62  && pProbe; pProb
2a670 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c  e=pProbe->pNext,
2a680 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20   iSortIdx++){.  
2a690 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50    if( pProbe->pP
2a6a0 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20  artIdxWhere!=0. 
2a6b0 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61      && !whereUsa
2a6c0 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
2a6d0 70 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c  pNew->iTab, pWC,
2a6e0 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
2a6f0 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20  xWhere) ){.     
2a700 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50   continue;  /* P
2a710 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61  artial index ina
2a720 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
2a730 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  his query */.   
2a740 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62   }.    pNew->u.b
2a750 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20  tree.nEq = 0;.  
2a760 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2a770 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53   0;.    pNew->iS
2a780 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
2a790 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
2a7a0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
2a7b0 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20  eq = mExtra;.   
2a7c0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
2a7d0 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ize;.    pNew->u
2a7e0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
2a7f0 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20  pProbe;.    b = 
2a800 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
2a810 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64  thOrderBy(pBuild
2a820 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63  er, pProbe, pSrc
2a830 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2a840 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44  /* The ONEPASS_D
2a850 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76  ESIRED flags nev
2a860 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68  er occurs togeth
2a870 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59  er with ORDER BY
2a880 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2a890 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2a8a0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2a8b0 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
2a8c0 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69  || b==0 );.    i
2a8d0 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c  f( pProbe->tnum<
2a8e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
2a8f0 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
2a900 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ey index */.    
2a910 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2a920 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20  = WHERE_IPK;..  
2a930 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c      /* Full tabl
2a940 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  e scan */.      
2a950 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
2a960 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
2a970 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  0;.      /* TUNI
2a980 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c  NG: Cost of full
2a990 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 33   table scan is 3
2a9a0 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a  *(N + log2(N))..
2a9b0 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65        **  +  The
2a9c0 20 65 78 74 72 61 20 33 20 66 61 63 74 6f 72 20   extra 3 factor 
2a9d0 69 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20  is to encourage 
2a9e0 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78  the use of index
2a9f0 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20  ed lookups.     
2aa00 20 2a 2a 20 20 20 20 20 6f 76 65 72 20 66 75 6c   **     over ful
2aa10 6c 20 73 63 61 6e 73 2e 20 20 41 20 73 6d 61 6c  l scans.  A smal
2aa20 6c 65 72 20 63 6f 6e 73 74 61 6e 74 20 32 20 69  ler constant 2 i
2aa30 73 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72  s used for cover
2aa40 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ing.      **    
2aa50 20 69 6e 64 65 78 20 73 63 61 6e 73 20 73 6f 20   index scans so 
2aa60 74 68 61 74 20 61 20 63 6f 76 65 72 69 6e 67 20  that a covering 
2aa70 69 6e 64 65 78 20 73 63 61 6e 20 77 69 6c 6c 20  index scan will 
2aa80 62 65 20 66 61 76 6f 72 65 64 20 6f 76 65 72 0a  be favored over.
2aa90 20 20 20 20 20 20 2a 2a 20 20 20 20 20 61 20 74        **     a t
2aaa0 61 62 6c 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  able scan. */.  
2aab0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2aac0 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 53   whereCostAdd(rS
2aad0 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b 20  ize,rLogSize) + 
2aae0 31 36 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  16;.      rc = w
2aaf0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
2ab00 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
2ab10 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
2ab20 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
2ab30 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
2ab40 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
2ab50 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64   & ~columnsInInd
2ab60 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  ex(pProbe);.    
2ab70 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2ab80 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52  = (m==0) ? (WHER
2ab90 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
2aba0 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52  _INDEXED) : WHER
2abb0 45 5f 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20 20  E_INDEXED;..    
2abc0 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76    /* Full scan v
2abd0 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ia index */.    
2abe0 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c    if( b.       |
2abf0 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20  | ( m==0.       
2ac00 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e    && pProbe->bUn
2ac10 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20  ordered==0.     
2ac20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
2ac30 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2ac40 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2ac50 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)==0.         
2ac60 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
2ac70 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20  Config.bUseCis. 
2ac80 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d          && Optim
2ac90 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
2aca0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
2acb0 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49  b, SQLITE_CoverI
2acc0 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20  dxScan).        
2acd0 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20    ).      ){.   
2ace0 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
2acf0 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
2ad00 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  dx : 0;.        
2ad10 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  if( m==0 ){.    
2ad20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
2ad30 20 43 6f 73 74 20 6f 66 20 61 20 63 6f 76 65 72   Cost of a cover
2ad40 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69  ing index scan i
2ad50 73 20 32 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29  s 2*(N + log2(N)
2ad60 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  )..          ** 
2ad70 20 2b 20 20 54 68 65 20 65 78 74 72 61 20 32 20   +  The extra 2 
2ad80 66 61 63 74 6f 72 20 69 73 20 74 6f 20 65 6e 63  factor is to enc
2ad90 6f 75 72 61 67 65 20 74 68 65 20 75 73 65 20 6f  ourage the use o
2ada0 66 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75 70  f indexed lookup
2adb0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  s.          **  
2adc0 20 20 20 6f 76 65 72 20 69 6e 64 65 78 20 73 63     over index sc
2add0 61 6e 73 2e 20 20 41 20 74 61 62 6c 65 20 73 63  ans.  A table sc
2ade0 61 6e 20 75 73 65 73 20 61 20 66 61 63 74 6f 72  an uses a factor
2adf0 20 6f 66 20 33 20 73 6f 20 74 68 61 74 0a 20 20   of 3 so that.  
2ae00 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69          **     i
2ae10 6e 64 65 78 20 73 63 61 6e 73 20 61 72 65 20 66  ndex scans are f
2ae20 61 76 6f 72 65 64 20 6f 76 65 72 20 74 61 62 6c  avored over tabl
2ae30 65 20 73 63 61 6e 73 2e 0a 20 20 20 20 20 20 20  e scans..       
2ae40 20 20 20 2a 2a 20 20 2b 20 20 49 66 20 74 68 69     **  +  If thi
2ae50 73 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  s covering index
2ae60 20 6d 69 67 68 74 20 61 6c 73 6f 20 68 65 6c 70   might also help
2ae70 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
2ae80 45 52 20 42 59 0a 20 20 20 20 20 20 20 20 20 20  ER BY.          
2ae90 2a 2a 20 20 20 20 20 63 6c 61 75 73 65 2c 20 74  **     clause, t
2aea0 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20  hen the cost is 
2aeb0 66 75 64 67 65 64 20 64 6f 77 6e 20 73 6c 69 67  fudged down slig
2aec0 68 74 6c 79 20 73 6f 20 74 68 61 74 20 74 68 69  htly so that thi
2aed0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  s.          **  
2aee0 20 20 20 69 6e 64 65 78 20 69 73 20 66 61 76 6f     index is favo
2aef0 72 65 64 20 61 62 6f 76 65 20 6f 74 68 65 72 20  red above other 
2af00 69 6e 64 69 63 65 73 20 74 68 61 74 20 68 61 76  indices that hav
2af10 65 20 6e 6f 20 68 6f 70 65 20 6f 66 0a 20 20 20  e no hope of.   
2af20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 68 65         **     he
2af30 6c 70 69 6e 67 20 77 69 74 68 20 74 68 65 20 4f  lping with the O
2af40 52 44 45 52 20 42 59 2e 20 2a 2f 0a 20 20 20 20  RDER BY. */.    
2af50 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
2af60 20 3d 20 31 30 20 2b 20 77 68 65 72 65 43 6f 73   = 10 + whereCos
2af70 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53  tAdd(rSize,rLogS
2af80 69 7a 65 29 20 2d 20 62 3b 0a 20 20 20 20 20 20  ize) - b;.      
2af90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2afa0 20 20 20 61 73 73 65 72 74 28 20 62 21 3d 30 20     assert( b!=0 
2afb0 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ); .          /*
2afc0 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
2afd0 20 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f 6e 2d   scanning a non-
2afe0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 69  covering index i
2aff0 73 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e 29 0a  s (N+1)*log2(N).
2b000 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68 69            ** whi
2b010 63 68 20 77 65 20 77 69 6c 6c 20 73 69 6d 70 6c  ch we will simpl
2b020 69 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a 6c 6f  ify to just N*lo
2b030 67 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20 20 20  g2(N) */.       
2b040 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2b050 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a 65  rSize + rLogSize
2b060 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b070 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2b080 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2b090 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
2b0a0 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
2b0b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2b0c0 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
2b0d0 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
2b0e0 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c  (pBuilder, pSrc,
2b0f0 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66   pProbe, 0);.#if
2b100 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2b110 45 4e 41 42 4c 45 5f 53 54 41 54 34 29 20 7c 7c  ENABLE_STAT4) ||
2b120 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2b130 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 0a 20 20  ENABLE_STAT3).  
2b140 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72    sqlite3Stat4Pr
2b150 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72  obeFree(pBuilder
2b160 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75  ->pRec);.    pBu
2b170 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
2b180 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64   = 0;.    pBuild
2b190 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65  er->pRec = 0;.#e
2b1a0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
2b1b0 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44  there was an IND
2b1c0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
2b1d0 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f  then only that o
2b1e0 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ne index is.    
2b1f0 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a  ** considered. *
2b200 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  /.    if( pSrc->
2b210 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a  pIndex ) break;.
2b220 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2b230 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
2b240 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2b250 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ABLE./*.** Add a
2b260 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
2b270 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ects for a table
2b280 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65   of the join ide
2b290 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42  ntified by.** pB
2b2a0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
2b2b0 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  ab.  That table 
2b2c0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2b2d0 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61   be a virtual ta
2b2e0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
2b2f0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  nt whereLoopAddV
2b300 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c  irtual(.  WhereL
2b310 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
2b320 6c 64 65 72 20 20 20 2f 2a 20 57 48 45 52 45 20  lder   /* WHERE 
2b330 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
2b340 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  on */.){.  Where
2b350 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
2b360 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
2b370 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78   analysis contex
2b380 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
2b390 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
2b3a0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
2b3b0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
2b3c0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2b3d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2b3e0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2b3f0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
2b400 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b  List_item *pSrc;
2b410 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
2b420 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
2b430 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20  arch */.  Table 
2b440 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
2b450 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *db;.  sqlite3_
2b460 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
2b470 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73  Info;.  struct s
2b480 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
2b490 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
2b4a0 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
2b4b0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
2b4c0 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
2b4d0 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
2b4e0 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pTerm;.  int i,
2b4f0 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c   j;.  int iTerm,
2b500 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   mxTerm;.  int n
2b510 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e  Constraint;.  in
2b520 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20  t seenIn = 0;   
2b530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2b540 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72  ue if an IN oper
2b550 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a  ator is seen */.
2b560 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20    int seenVar = 
2b570 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2b580 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d  * True if a non-
2b590 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61  constant constra
2b5a0 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  int is seen */. 
2b5b0 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20   int iPhase;    
2b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b5d0 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e   0: const w/o IN
2b5e0 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e  , 1: const, 2: n
2b5f0 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a  o IN,  2: IN */.
2b600 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
2b610 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
2b620 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e  LITE_OK;..  pWIn
2b630 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
2b640 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20  WInfo;.  pParse 
2b650 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
2b660 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
2b670 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75  >db;.  pWC = pBu
2b680 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e  ilder->pWC;.  pN
2b690 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
2b6a0 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70  New;.  pSrc = &p
2b6b0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
2b6c0 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a  >a[pNew->iTab];.
2b6d0 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70    pTab = pSrc->p
2b6e0 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49  Tab;.  assert( I
2b6f0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
2b700 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61  ;.  pIdxInfo = a
2b710 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
2b720 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
2b730 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  rc, pBuilder->pO
2b740 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70  rderBy);.  if( p
2b750 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  IdxInfo==0 ) ret
2b760 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2b770 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  ;.  pNew->prereq
2b780 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53   = 0;.  pNew->rS
2b790 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etup = 0;.  pNew
2b7a0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
2b7b0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a  E_VIRTUALTABLE;.
2b7c0 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2b7d0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   0;.  pNew->u.vt
2b7e0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
2b7f0 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78  .  pUsage = pIdx
2b800 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
2b810 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74  tUsage;.  nConst
2b820 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f  raint = pIdxInfo
2b830 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
2b840 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
2b850 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e  size(db, pNew, n
2b860 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20  Constraint) ){. 
2b870 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2b880 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  (db, pIdxInfo);.
2b890 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b8a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
2b8b0 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50  for(iPhase=0; iP
2b8c0 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b  hase<=3; iPhase+
2b8d0 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65  +){.    if( !see
2b8e0 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26 31  nIn && (iPhase&1
2b8f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50  )!=0 ){.      iP
2b900 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  hase++;.      if
2b910 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72 65  ( iPhase>3 ) bre
2b920 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
2b930 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69 50  ( !seenVar && iP
2b940 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a  hase>1 ) break;.
2b950 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
2b960 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
2b970 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
2b980 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
2b990 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66  onstraint;.    f
2b9a0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
2b9b0 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
2b9c0 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
2b9d0 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64  ){.      j = pId
2b9e0 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
2b9f0 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  et;.      pTerm 
2ba00 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
2ba10 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68 61      switch( iPha
2ba20 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  se ){.        ca
2ba30 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73  se 0:    /* Cons
2ba40 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e  tants without IN
2ba50 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
2ba60 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2ba70 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  >usable = 0;.   
2ba80 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
2ba90 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2baa0 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
2bab0 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d          seenIn =
2bac0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
2bad0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
2bae0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
2baf0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2bb00 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a     seenVar = 1;.
2bb10 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
2bb20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2bb30 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d  rator & WO_IN)==
2bb40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2bb50 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
2bb60 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
2bb70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
2bb80 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
2bb90 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   1:    /* Consta
2bba0 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72  nts with IN oper
2bbb0 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20  ators */.       
2bbc0 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 49     assert( seenI
2bbd0 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n );.          p
2bbe0 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
2bbf0 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
2bc00 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20  Right==0);.     
2bc10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2bc20 20 20 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f      case 2:    /
2bc30 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68  * Variables with
2bc40 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  out IN */.      
2bc50 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
2bc60 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Var );.         
2bc70 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
2bc80 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  e = (pTerm->eOpe
2bc90 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d  rator & WO_IN)==
2bca0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
2bcb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61  ak;.        defa
2bcc0 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62  ult:   /* Variab
2bcd0 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20  les with IN */. 
2bce0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2bcf0 20 73 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e   seenVar && seen
2bd00 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  In );.          
2bd10 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
2bd20 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2bd30 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2bd40 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
2bd50 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
2bd60 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64  f(pUsage[0])*pId
2bd70 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
2bd80 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  nt);.    if( pId
2bd90 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2bda0 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
2bdb0 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
2bdc0 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49  >idxStr);.    pI
2bdd0 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d  dxInfo->idxStr =
2bde0 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
2bdf0 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
2be00 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
2be10 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
2be20 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
2be30 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
2be40 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
2be50 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
2be60 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
2be70 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20  L / (double)2;. 
2be80 20 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74     rc = vtabBest
2be90 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 54  Index(pParse, pT
2bea0 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  ab, pIdxInfo);. 
2beb0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2bec0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61   whereLoopAddVta
2bed0 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78  b_exit;.    pIdx
2bee0 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
2bef0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
2bf00 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
2bf10 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
2bf20 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  t;.    pNew->pre
2bf30 72 65 71 20 3d 20 30 3b 0a 20 20 20 20 6d 78 54  req = 0;.    mxT
2bf40 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  erm = -1;.    as
2bf50 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c  sert( pNew->nLSl
2bf60 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ot>=nConstraint 
2bf70 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
2bf80 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
2bf90 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d  ++) pNew->aLTerm
2bfa0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  [i] = 0;.    pNe
2bfb0 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
2bfc0 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  sk = 0;.    for(
2bfd0 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
2bfe0 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
2bff0 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  s++){.      if( 
2c000 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b  (iTerm = pUsage[
2c010 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31  i].argvIndex - 1
2c020 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
2c030 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
2c040 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
2c050 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43     if( iTerm>=nC
2c060 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20  onstraint.      
2c070 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20     || j<0.      
2c080 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54     || j>=pWC->nT
2c090 65 72 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  erm.         || 
2c0a0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65  pNew->aLTerm[iTe
2c0b0 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 29  rm]!=0.        )
2c0c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2c0d0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2c0e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c0f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2c100 20 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78 28   "%s.xBestIndex(
2c110 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20  ) malfunction", 
2c120 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
2c130 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65          goto whe
2c140 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78  reLoopAddVtab_ex
2c150 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  it;.        }.  
2c160 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c170 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69  iTerm==nConstrai
2c180 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  nt-1 );.        
2c190 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29  testcase( j==0 )
2c1a0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2c1b0 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72  se( j==pWC->nTer
2c1c0 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  m-1 );.        p
2c1d0 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
2c1e0 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ];.        pNew-
2c1f0 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72 6d  >prereq |= pTerm
2c200 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
2c210 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
2c220 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f  Term<pNew->nLSlo
2c230 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  t );.        pNe
2c240 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
2c250 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
2c260 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65    if( iTerm>mxTe
2c270 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54  rm ) mxTerm = iT
2c280 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 74 65 73  erm;.        tes
2c290 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35  tcase( iTerm==15
2c2a0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
2c2b0 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20  case( iTerm==16 
2c2c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
2c2d0 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67  Term<16 && pUsag
2c2e0 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77  e[i].omit ) pNew
2c2f0 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
2c300 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20  k |= 1<<iTerm;. 
2c310 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
2c320 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2c330 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
2c340 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67 65        if( pUsage
2c350 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20  [i].omit==0 ){. 
2c360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2c370 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
2c380 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  use an IN constr
2c390 61 69 6e 74 20 69 66 20 74 68 65 20 76 69 72 74  aint if the virt
2c3a0 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ual table.      
2c3b0 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68        ** says th
2c3c0 61 74 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  at the equivalen
2c3d0 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20  t EQ constraint 
2c3e0 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79  cannot be safely
2c3f0 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20   omitted..      
2c400 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64        ** If we d
2c410 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  o attempt to use
2c420 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69   such a constrai
2c430 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69  nt, some rows mi
2c440 67 68 74 20 62 65 0a 20 20 20 20 20 20 20 20 20  ght be.         
2c450 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69     ** repeated i
2c460 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f  n the output. */
2c470 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
2c480 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
2c490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76            /* A v
2c4a0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61  irtual table tha
2c4b0 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  t is constrained
2c4c0 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65   by an IN clause
2c4d0 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20   may not.       
2c4e0 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68     ** consume th
2c4f0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2c500 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74 68  e because (1) th
2c510 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65  e order of IN te
2c520 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rms.          **
2c530 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
2c540 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74  ily related to t
2c550 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70  he order of outp
2c560 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20  ut terms and.   
2c570 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75         ** (2) Mu
2c580 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66  ltiple outputs f
2c590 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20  rom a single IN 
2c5a0 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d  value will not m
2c5b0 65 72 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a  erge.          *
2c5c0 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a  * together.  */.
2c5d0 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49 6e            pIdxIn
2c5e0 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
2c5f0 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  med = 0;.       
2c600 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2c610 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6e  .    if( i>=nCon
2c620 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20  straint ){.     
2c630 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
2c640 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20  mxTerm+1;.      
2c650 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c  assert( pNew->nL
2c660 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c  Term<=pNew->nLSl
2c670 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ot );.      pNew
2c680 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20  ->u.vtab.idxNum 
2c690 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e  = pIdxInfo->idxN
2c6a0 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  um;.      pNew->
2c6b0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
2c6c0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  = pIdxInfo->need
2c6d0 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20  ToFreeIdxStr;.  
2c6e0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65      pIdxInfo->ne
2c6f0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
2c700 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
2c710 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20  u.vtab.idxStr = 
2c720 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
2c730 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
2c740 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d  vtab.isOrdered =
2c750 20 28 75 38 29 28 28 70 49 64 78 49 6e 66 6f 2d   (u8)((pIdxInfo-
2c760 3e 6e 4f 72 64 65 72 42 79 21 3d 30 29 0a 20 20  >nOrderBy!=0).  
2c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c790 20 20 20 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e     && pIdxInfo->
2c7a0 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29  orderByConsumed)
2c7b0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53  ;.      pNew->rS
2c7c0 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  etup = 0;.      
2c7d0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77 68 65  pNew->rRun = whe
2c7e0 72 65 43 6f 73 74 46 72 6f 6d 44 6f 75 62 6c 65  reCostFromDouble
2c7f0 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
2c800 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 20 20 20  atedCost);.     
2c810 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 76 65 72   /* TUNING: Ever
2c820 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  y virtual table 
2c830 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 32 35  query returns 25
2c840 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 70   rows */.      p
2c850 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 36 3b 20  New->nOut = 46; 
2c860 20 61 73 73 65 72 74 28 20 34 36 3d 3d 77 68 65   assert( 46==whe
2c870 72 65 43 6f 73 74 28 32 35 29 20 29 3b 0a 20 20  reCost(25) );.  
2c880 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73      whereLoopIns
2c890 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2c8a0 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ew);.      if( p
2c8b0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2c8c0 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
2c8d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
2c8e0 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
2c8f0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
2c900 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
2c910 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2c920 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65    }.  }  ..where
2c930 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74  LoopAddVtab_exit
2c940 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  :.  if( pIdxInfo
2c950 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2c960 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
2c970 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  e(pIdxInfo->idxS
2c980 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  tr);.  sqlite3Db
2c990 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66  Free(db, pIdxInf
2c9a0 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  o);.  return rc;
2c9b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2c9c0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2c9d0 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
2c9e0 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  Add WhereLoop en
2c9f0 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20  tries to handle 
2ca00 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20  OR terms.  This 
2ca10 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72  works for either
2ca20 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69  .** btrees or vi
2ca30 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f  rtual tables..*/
2ca40 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2ca50 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65 72 65  eLoopAddOr(Where
2ca60 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
2ca70 69 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d  ilder, Bitmask m
2ca80 45 78 74 72 61 29 7b 0a 20 20 57 68 65 72 65 49  Extra){.  WhereI
2ca90 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
2caa0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
2cab0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2cac0 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  WC;.  WhereLoop 
2cad0 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65  *pNew;.  WhereTe
2cae0 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45  rm *pTerm, *pWCE
2caf0 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  nd;.  int rc = S
2cb00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2cb10 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61  iCur;.  WhereCla
2cb20 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68  use tempWC;.  Wh
2cb30 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73  ereLoopBuilder s
2cb40 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72  SubBuild;.  Wher
2cb50 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75  eOrSet sSum, sCu
2cb60 72 2c 20 73 50 72 65 76 3b 0a 20 20 73 74 72 75  r, sPrev;.  stru
2cb70 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2cb80 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43  *pItem;.  .  pWC
2cb90 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
2cba0 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
2cbb0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2cbc0 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20 72 65  RE_AND_ONLY ) re
2cbd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2cbe0 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e    pWCEnd = pWC->
2cbf0 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
2cc00 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
2cc10 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65  r->pNew;.  memse
2cc20 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65  t(&sSum, 0, size
2cc30 6f 66 28 73 53 75 6d 29 29 3b 0a 0a 20 20 66 6f  of(sSum));..  fo
2cc40 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
2cc50 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20  pTerm<pWCEnd && 
2cc60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70  rc==SQLITE_OK; p
2cc70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
2cc80 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2cc90 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20  or & WO_OR)!=0. 
2cca0 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75      && (pTerm->u
2ccb0 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61  .pOrInfo->indexa
2ccc0 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ble & pNew->mask
2ccd0 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b  Self)!=0 .    ){
2cce0 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75  .      WhereClau
2ccf0 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  se * const pOrWC
2cd00 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
2cd10 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
2cd20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73  WhereTerm * cons
2cd30 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f  t pOrWCEnd = &pO
2cd40 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54  rWC->a[pOrWC->nT
2cd50 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72  erm];.      Wher
2cd60 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a  eTerm *pOrTerm;.
2cd70 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d        int once =
2cd80 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   1;.      int i,
2cd90 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 70   j;.    .      p
2cda0 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
2cdb0 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
2cdc0 77 2d 3e 69 54 61 62 3b 0a 20 20 20 20 20 20 69  w->iTab;.      i
2cdd0 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  Cur = pItem->iCu
2cde0 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 53 75 62  rsor;.      sSub
2cdf0 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65  Build = *pBuilde
2ce00 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69  r;.      sSubBui
2ce10 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  ld.pOrderBy = 0;
2ce20 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
2ce30 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b  .pOrSet = &sCur;
2ce40 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54  ..      for(pOrT
2ce50 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f  erm=pOrWC->a; pO
2ce60 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20  rTerm<pOrWCEnd; 
2ce70 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
2ce80 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
2ce90 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2cea0 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
2ceb0 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
2cec0 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e  pWC = &pOrTerm->
2ced0 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a  u.pAndInfo->wc;.
2cee0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2cef0 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
2cf00 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20  ursor==iCur ){. 
2cf10 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2cf20 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
2cf30 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
2cf40 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20  tempWC.pOuter = 
2cf50 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pWC;.          t
2cf60 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e  empWC.op = TK_AN
2cf70 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  D;.          tem
2cf80 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20  pWC.nTerm = 1;. 
2cf90 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2cfa0 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20  a = pOrTerm;.   
2cfb0 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
2cfc0 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a  .pWC = &tempWC;.
2cfd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2cfe0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2cff0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2d000 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b       sCur.n = 0;
2d010 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d020 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2d030 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  E.        if( Is
2d040 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
2d050 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
2d060 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2d070 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62  AddVirtual(&sSub
2d080 42 75 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Build);.        
2d090 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 43 75    for(i=0; i<sCu
2d0a0 72 2e 6e 3b 20 69 2b 2b 29 20 73 43 75 72 2e 61  r.n; i++) sCur.a
2d0b0 5b 69 5d 2e 70 72 65 72 65 71 20 7c 3d 20 6d 45  [i].prereq |= mE
2d0c0 78 74 72 61 3b 0a 20 20 20 20 20 20 20 20 7d 65  xtra;.        }e
2d0d0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
2d0e0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
2d0f0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2d100 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64  Btree(&sSubBuild
2d110 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20  , mExtra);.     
2d120 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2d130 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2d140 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20  OK || sCur.n==0 
2d150 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
2d160 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  Cur.n==0 ){.    
2d170 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
2d180 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2d190 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
2d1a0 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
2d1b0 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
2d1c0 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29  ve(&sSum, &sCur)
2d1d0 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65  ;.          once
2d1e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
2d1f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
2d200 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65  hereOrMove(&sPre
2d210 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20  v, &sSum);.     
2d220 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b       sSum.n = 0;
2d230 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
2d240 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69  =0; i<sPrev.n; i
2d250 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2d260 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72   for(j=0; j<sCur
2d270 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; j++){.      
2d280 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 49          whereOrI
2d290 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72  nsert(&sSum, sPr
2d2a0 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c  ev.a[i].prereq |
2d2b0 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65   sCur.a[j].prere
2d2c0 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q,.             
2d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
2d2e0 68 65 72 65 43 6f 73 74 41 64 64 28 73 50 72 65  hereCostAdd(sPre
2d2f0 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75  v.a[i].rRun, sCu
2d300 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20  r.a[j].rRun),.  
2d310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d320 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 43            whereC
2d330 6f 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  ostAdd(sPrev.a[i
2d340 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a  ].nOut, sCur.a[j
2d350 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20  ].nOut));.      
2d360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d370 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2d380 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
2d390 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
2d3a0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
2d3b0 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
2d3c0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2d3d0 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   = WHERE_MULTI_O
2d3e0 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  R;.      pNew->r
2d3f0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
2d400 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
2d410 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  = 0;.      memse
2d420 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73  t(&pNew->u, 0, s
2d430 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b  izeof(pNew->u));
2d440 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2d450 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d460 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b   i<sSum.n; i++){
2d470 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
2d480 4e 47 3a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20  NG: Multiple by 
2d490 33 2e 35 20 66 6f 72 20 74 68 65 20 73 65 63 6f  3.5 for the seco
2d4a0 6e 64 61 72 79 20 74 61 62 6c 65 20 6c 6f 6f 6b  ndary table look
2d4b0 75 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  up */.        pN
2d4c0 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e  ew->rRun = sSum.
2d4d0 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 38 3b 0a  a[i].rRun + 18;.
2d4e0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
2d4f0 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e  ut = sSum.a[i].n
2d500 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  Out;.        pNe
2d510 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d  w->prereq = sSum
2d520 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20  .a[i].prereq;.  
2d530 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2d540 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
2d550 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
2d560 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2d570 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2d580 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
2d590 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
2d5a0 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f  r all tables .*/
2d5b0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2d5c0 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72  eLoopAddAll(Wher
2d5d0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2d5e0 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
2d5f0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
2d600 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
2d610 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
2d620 61 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b  a = 0;.  Bitmask
2d630 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69   mPrior = 0;.  i
2d640 6e 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69  nt iTab;.  SrcLi
2d650 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
2d660 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
2d670 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2d680 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2d690 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2d6a0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
2d6b0 62 3b 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73  b;.  int nTabLis
2d6c0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  t = pWInfo->nLev
2d6d0 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  el;.  int rc = S
2d6e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70  QLITE_OK;.  u8 p
2d6f0 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30  riorJoinType = 0
2d700 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
2d710 4e 65 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  New;..  /* Loop 
2d720 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20  over the tables 
2d730 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f  in the join, fro
2d740 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20  m left to right 
2d750 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  */.  pNew = pBui
2d760 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68  lder->pNew;.  wh
2d770 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77  ereLoopInit(pNew
2d780 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c  );.  for(iTab=0,
2d790 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d   pItem=pTabList-
2d7a0 3e 61 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69 73  >a; iTab<nTabLis
2d7b0 74 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d  t; iTab++, pItem
2d7c0 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  ++){.    pNew->i
2d7d0 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
2d7e0 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  pNew->maskSelf =
2d7f0 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
2d800 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65  ->sMaskSet, pIte
2d810 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2d820 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f   if( ((pItem->jo
2d830 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e  intype|priorJoin
2d840 54 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54  Type) & (JT_LEFT
2d850 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29  |JT_CROSS))!=0 )
2d860 7b 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d  {.      mExtra =
2d870 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20   mPrior;.    }. 
2d880 20 20 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65     priorJoinType
2d890 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79   = pItem->jointy
2d8a0 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69  pe;.    if( IsVi
2d8b0 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
2d8c0 62 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  b) ){.      rc =
2d8d0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
2d8e0 74 75 61 6c 28 70 42 75 69 6c 64 65 72 29 3b 0a  tual(pBuilder);.
2d8f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d900 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2d910 64 64 42 74 72 65 65 28 70 42 75 69 6c 64 65 72  ddBtree(pBuilder
2d920 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  , mExtra);.    }
2d930 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2d940 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d950 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2d960 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 45  dOr(pBuilder, mE
2d970 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
2d980 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d   mPrior |= pNew-
2d990 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
2d9a0 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
2d9b0 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
2d9c0 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f  k;.  }.  whereLo
2d9d0 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77  opClear(db, pNew
2d9e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2d9f0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65  }../*.** Examine
2da00 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77 69   a WherePath (wi
2da10 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20  th the addition 
2da20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68 65  of the extra Whe
2da30 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74  reLoop of the 5t
2da40 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29  h.** parameters)
2da50 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75   to see if it ou
2da60 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68  tputs rows in th
2da70 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44 45  e requested ORDE
2da80 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55  R BY.** (or GROU
2da90 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72 65  P BY) without re
2daa0 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72 61  quiring a separa
2dab0 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f  te sort operatio
2dac0 6e 2e 20 20 52 65 74 75 72 6e 3a 0a 2a 2a 20 0a  n.  Return:.** .
2dad0 2a 2a 20 20 20 20 30 3a 20 20 4f 52 44 45 52 20  **    0:  ORDER 
2dae0 42 59 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66  BY is not satisf
2daf0 69 65 64 2e 20 20 53 6f 72 74 69 6e 67 20 72 65  ied.  Sorting re
2db00 71 75 69 72 65 64 0a 2a 2a 20 20 20 20 31 3a 20  quired.**    1: 
2db10 20 4f 52 44 45 52 20 42 59 20 69 73 20 73 61 74   ORDER BY is sat
2db20 69 73 66 69 65 64 2e 20 20 20 20 20 20 4f 6d 69  isfied.      Omi
2db30 74 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 20 20 2d  t sorting.**   -
2db40 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61 74 20 74  1:  Unknown at t
2db50 68 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 4e  his time.**.** N
2db60 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73  ote that process
2db70 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52  ing for WHERE_GR
2db80 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f  OUPBY and WHERE_
2db90 44 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f  DISTINCTBY is no
2dba0 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20  t as.** strict. 
2dbb0 20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61   With GROUP BY a
2dbc0 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20  nd DISTINCT the 
2dbd0 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74  only requirement
2dbe0 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69   is that.** equi
2dbf0 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65  valent rows appe
2dc00 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ar immediately a
2dc10 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61  djacent to one a
2dc20 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42  nother.  GROUP B
2dc30 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 54  Y.** and DISTINT
2dc40 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
2dc50 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20 69  rows to appear i
2dc60 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  n any particular
2dc70 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a   order as long.*
2dc80 2a 20 61 73 20 65 71 75 69 76 65 6c 65 6e 74 20  * as equivelent 
2dc90 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65 64  rows are grouped
2dca0 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73   together.  Thus
2dcb0 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e   for GROUP BY an
2dcc0 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68  d DISTINCT.** th
2dcd0 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  e pOrderBy terms
2dce0 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20   can be matched 
2dcf0 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57  in any order.  W
2dd00 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68  ith ORDER BY, th
2dd10 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74  e .** pOrderBy t
2dd20 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74  erms must be mat
2dd30 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c  ched in strict l
2dd40 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64  eft-to-right ord
2dd50 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2dd60 74 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  t wherePathSatis
2dd70 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57  fiesOrderBy(.  W
2dd80 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2dd90 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52  ,    /* The WHER
2dda0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
2ddb0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2ddc0 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ,   /* ORDER BY 
2ddd0 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44  or GROUP BY or D
2dde0 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74  ISTINCT clause t
2ddf0 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65  o check */.  Whe
2de00 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20  rePath *pPath,  
2de10 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50     /* The WhereP
2de20 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ath to check */.
2de30 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
2de40 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74  ,       /* Might
2de50 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47   contain WHERE_G
2de60 52 4f 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f  ROUPBY or WHERE_
2de70 44 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20  DISTINCTBY */.  
2de80 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20  u16 nLoop,      
2de90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2dea0 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50  of entries in pP
2deb0 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a  ath->aLoop[] */.
2dec0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61    WhereLoop *pLa
2ded0 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74  st,     /* Add t
2dee0 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  his WhereLoop to
2def0 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74   the end of pPat
2df00 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
2df10 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73  Bitmask *pRevMas
2df20 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61  k     /* OUT: Ma
2df30 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73  sk of WhereLoops
2df40 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72   to run in rever
2df50 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20  se order */.){. 
2df60 20 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20   u8 revSet;     
2df70 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2df80 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a  f rev is known *
2df90 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20  /.  u8 rev;     
2dfa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
2dfb0 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65  posite sort orde
2dfc0 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78  r */.  u8 revIdx
2dfd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2dfe0 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72  Index sort order
2dff0 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72   */.  u8 isOrder
2e000 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41  Distinct;   /* A
2e010 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f  ll prior WhereLo
2e020 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69  ops are order-di
2e030 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64  stinct */.  u8 d
2e040 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20  istinctColumns; 
2e050 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2e060 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45   loop has UNIQUE
2e070 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   NOT NULL column
2e080 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63  s */.  u8 isMatc
2e090 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h;           /* 
2e0a0 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20  iColumn matches 
2e0b0 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  a term of the OR
2e0c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2e0d0 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20  .  u16 nColumn; 
2e0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2e0f0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
2e100 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36   pIndex */.  u16
2e110 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
2e120 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72     /* Number ter
2e130 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
2e140 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
2e150 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
2e160 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2e170 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50   WhereLoop in pP
2e180 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73  ath being proces
2e190 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  sed */.  int i, 
2e1a0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
2e1b0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
2e1c0 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
2e1d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2e1e0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
2e1f0 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  current WhereLoo
2e200 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  p */.  int iColu
2e210 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
2e220 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  A column number 
2e230 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75  within table iCu
2e240 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  r */.  WhereLoop
2e250 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20   *pLoop = 0; /* 
2e260 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  Current WhereLoo
2e270 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  p being processe
2e280 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  d. */.  WhereTer
2e290 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a  m *pTerm;     /*
2e2a0 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
2e2b0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2e2c0 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  se */.  Expr *pO
2e2d0 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  BExpr;        /*
2e2e0 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
2e2f0 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59  rom the ORDER BY
2e300 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c   clause */.  Col
2e310 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
2e320 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75     /* COLLATE fu
2e330 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f  nction from an O
2e340 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
2e350 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  erm */.  Index *
2e360 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f  pIndex;        /
2e370 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f  * The index asso
2e380 63 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f  ciated with pLoo
2e390 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  p */.  sqlite3 *
2e3a0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
2e3b0 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
2e3c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2e3d0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
2e3e0 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d  Sat = 0;    /* M
2e3f0 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ask of ORDER BY 
2e400 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
2e410 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d  so far */.  Bitm
2e420 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20  ask obDone;     
2e430 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
2e440 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
2e450 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64  */.  Bitmask ord
2e460 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20  erDistinctMask; 
2e470 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
2e480 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f  well-ordered loo
2e490 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ps */.  Bitmask 
2e4a0 72 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  ready;          
2e4b0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69      /* Mask of i
2e4c0 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20  nner loops */.. 
2e4d0 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20   /*.  ** We say 
2e4e0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  the WhereLoop is
2e4f0 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74   "one-row" if it
2e500 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f   generates no mo
2e510 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a  re than one.  **
2e520 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20   row of output. 
2e530 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20   A WhereLoop is 
2e540 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f  one-row if all o
2e550 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2e560 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20  are true:.  **  
2e570 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f  (a) All index co
2e580 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68  lumns match with
2e590 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
2e5a0 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20  ..  **  (b) The 
2e5b0 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a  index is unique.
2e5c0 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f    ** Any WhereLo
2e5d0 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45  op with an WHERE
2e5e0 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74  _COLUMN_EQ const
2e5f0 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77  raint on the row
2e600 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20  id is one-row.. 
2e610 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f   ** Every one-ro
2e620 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c  w WhereLoop will
2e630 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f   have the WHERE_
2e640 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69  ONEROW bit set i
2e650 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a  n wsFlags..  **.
2e660 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
2e670 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72  WhereLoop is "or
2e680 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66  der-distinct" if
2e690 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75   the set of colu
2e6a0 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mns from.  ** th
2e6b0 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  at WhereLoop tha
2e6c0 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44  t are in the ORD
2e6d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
2e6e0 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
2e6f0 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  very.  ** row of
2e700 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20   the WhereLoop. 
2e710 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57   Every one-row W
2e720 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f  hereLoop is auto
2e730 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f  matically.  ** o
2e740 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20  rder-distinct.  
2e750 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61   A WhereLoop tha
2e760 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73  t has no columns
2e770 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
2e780 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20   clause.  ** is 
2e790 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  not order-distin
2e7a0 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d  ct. To be order-
2e7b0 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20  distinct is not 
2e7c0 71 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61  quite the same a
2e7d0 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49  s being.  ** UNI
2e7e0 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51  QUE since a UNIQ
2e7f0 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64  UE column or ind
2e800 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  ex can have mult
2e810 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a  iple rows that .
2e820 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e    ** are NULL an
2e830 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  d NULL values ar
2e840 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
2e850 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   the purpose of 
2e860 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a  order-distinct..
2e870 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72    ** To be order
2e880 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63  -distinct, the c
2e890 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55  olumns must be U
2e8a0 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55  NIQUE and NOT NU
2e8b0 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  LL..  **.  ** Th
2e8c0 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61  e rowid for a ta
2e8d0 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e  ble is always UN
2e8e0 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
2e8f0 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68  L so whenever th
2e900 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70  e.  ** rowid app
2e910 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45  ears in the ORDE
2e920 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
2e930 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
2e940 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a  hereLoop is.  **
2e950 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f   automatically o
2e960 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
2e970 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
2e980 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 0a 20  OrderBy!=0 );.. 
2e990 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69 74 79 20   /* Sortability 
2e9a0 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  of virtual table
2e9b0 73 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  s is determined 
2e9c0 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  by the xBestInde
2e9d0 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a 20 6f 66  x method.  ** of
2e9e0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
2e9f0 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 69  le itself */.  i
2ea00 66 28 20 70 4c 61 73 74 2d 3e 77 73 46 6c 61 67  f( pLast->wsFlag
2ea10 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
2ea20 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 74 65  LTABLE ){.    te
2ea30 73 74 63 61 73 65 28 20 6e 4c 6f 6f 70 3e 30 20  stcase( nLoop>0 
2ea40 29 3b 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e  );  /* True when
2ea50 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 61 72 65   outer loops are
2ea60 20 6f 6e 65 2d 72 6f 77 20 61 6e 64 20 6d 61 74   one-row and mat
2ea70 63 68 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ch .            
2ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2ea90 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 74 65 72   no ORDER BY ter
2eaa0 6d 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ms */.    return
2eab0 20 70 4c 61 73 74 2d 3e 75 2e 76 74 61 62 2e 69   pLast->u.vtab.i
2eac0 73 4f 72 64 65 72 65 64 3b 0a 20 20 7d 0a 20 20  sOrdered;.  }.  
2ead0 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74  if( nLoop && Opt
2eae0 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
2eaf0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64  d(db, SQLITE_Ord
2eb00 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72  erByIdxJoin) ) r
2eb10 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64  eturn 0;..  nOrd
2eb20 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
2eb30 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61  >nExpr;.  testca
2eb40 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d  se( nOrderBy==BM
2eb50 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72  S-1 );.  if( nOr
2eb60 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65  derBy>BMS-1 ) re
2eb70 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e  turn 0;  /* Cann
2eb80 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72  ot optimize over
2eb90 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42  ly large ORDER B
2eba0 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44  Ys */.  isOrderD
2ebb0 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f  istinct = 1;.  o
2ebc0 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28  bDone = MASKBIT(
2ebd0 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f  nOrderBy)-1;.  o
2ebe0 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
2ebf0 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20   = 0;.  ready = 
2ec00 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  0;.  for(iLoop=0
2ec10 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ; isOrderDistinc
2ec20 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e  t && obSat<obDon
2ec30 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f  e && iLoop<=nLoo
2ec40 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
2ec50 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72   if( iLoop>0 ) r
2ec60 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  eady |= pLoop->m
2ec70 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f  askSelf;.    pLo
2ec80 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  op = iLoop<nLoop
2ec90 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   ? pPath->aLoop[
2eca0 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a  iLoop] : pLast;.
2ecb0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
2ecc0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2ecd0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2ece0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 43 75 72  )==0 );.    iCur
2ecf0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2ed00 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54  ist->a[pLoop->iT
2ed10 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  ab].iCursor;..  
2ed20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
2ed30 79 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  y ORDER BY term 
2ed40 58 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75  X that is a colu
2ed50 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
2ed60 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  of.    ** the cu
2ed70 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77  rrent loop for w
2ed80 68 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65  hich there is te
2ed90 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a  rm in the WHERE.
2eda0 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
2edb0 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e   the form X IS N
2edc0 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20  ULL or X=? that 
2edd0 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
2ede0 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70  uter.    ** loop
2edf0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
2ee00 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
2ee10 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  y; i++){.      i
2ee20 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
2ee30 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
2ee40 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20  ;.      pOBExpr 
2ee50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
2ee60 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
2ee70 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2ee80 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2ee90 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
2eea0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2eeb0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2eec0 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
2eed0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
2eee0 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
2eef0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43  &pWInfo->sWC, iC
2ef00 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  ur, pOBExpr->iCo
2ef10 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
2ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65               ~re
2ef30 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  ady, WO_EQ|WO_IS
2ef40 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 20 20  NULL, 0);.      
2ef50 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63  if( pTerm==0 ) c
2ef60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
2ef70 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
2ef80 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 26  ator&WO_EQ)!=0 &
2ef90 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  & pOBExpr->iColu
2efa0 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn>=0 ){.       
2efb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c   const char *z1,
2efc0 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43   *z2;.        pC
2efd0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2efe0 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
2eff0 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  >pParse, pOrderB
2f000 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2f010 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
2f020 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
2f030 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
2f040 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e      z1 = pColl->
2f050 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70  zName;.        p
2f060 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2f070 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
2f080 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  ->pParse, pTerm-
2f090 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >pExpr);.       
2f0a0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
2f0b0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
2f0c0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20  oll;.        z2 
2f0d0 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  = pColl->zName;.
2f0e0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2f0f0 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
2f100 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  2)!=0 ) continue
2f110 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f120 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
2f130 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (i);.    }..    
2f140 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
2f150 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
2f160 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OW)==0 ){.      
2f170 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2f180 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29  gs & WHERE_IPK )
2f190 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
2f1a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43   = 0;.        nC
2f1b0 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 20  olumn = 0;.     
2f1c0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64   }else if( (pInd
2f1d0 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
2f1e0 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c  ree.pIndex)==0 |
2f1f0 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  | pIndex->bUnord
2f200 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
2f210 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
2f220 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
2f230 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
2f240 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >nColumn;.      
2f250 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2f260 74 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  t = pIndex->onEr
2f270 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20  ror!=OE_None;.  
2f280 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2f290 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
2f2a0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
2f2b0 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77  index and deal w
2f2c0 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20  ith the ones.   
2f2d0 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e     ** that are n
2f2e0 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  ot constrained b
2f2f0 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20  y == or IN..    
2f300 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d    */.      rev =
2f310 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20   revSet = 0;.   
2f320 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d     distinctColum
2f330 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  ns = 0;.      fo
2f340 72 28 6a 3d 30 3b 20 6a 3c 3d 6e 43 6f 6c 75 6d  r(j=0; j<=nColum
2f350 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
2f360 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20   u8 bOnce;   /* 
2f370 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20  True to run the 
2f380 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68 20  ORDER BY search 
2f390 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20  loop */..       
2f3a0 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d   /* Skip over ==
2f3b0 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72   and IS NULL ter
2f3c0 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ms */.        if
2f3d0 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ( j<pLoop->u.btr
2f3e0 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20  ee.nEq.         
2f3f0 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e  && ((i = pLoop->
2f400 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
2f410 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57  ator) & (WO_EQ|W
2f420 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20  O_ISNULL))!=0.  
2f430 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2f440 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53     if( i & WO_IS
2f450 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
2f460 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
2f470 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b  OrderDistinct );
2f480 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
2f490 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
2f4a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f4b0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2f4c0 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;  .        }.. 
2f4d0 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68         /* Get th
2f4e0 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
2f4f0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43  in the table (iC
2f500 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20  olumn) and sort 
2f510 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  order.        **
2f520 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68   (revIdx) for th
2f530 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e j-th column of
2f540 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
2f550 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2f560 66 28 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  f( j<nColumn ){.
2f570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72            /* Nor
2f580 6d 61 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  mal index column
2f590 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  s */.          i
2f5a0 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
2f5b0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
2f5c0 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d          revIdx =
2f5d0 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
2f5e0 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  der[j];.        
2f5f0 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70    if( iColumn==p
2f600 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69  Index->pTable->i
2f610 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d  PKey ) iColumn =
2f620 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
2f630 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2f640 20 54 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   The ROWID colum
2f650 6e 20 61 74 20 74 68 65 20 65 6e 64 20 2a 2f 0a  n at the end */.
2f660 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2f670 28 20 6a 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  ( j==nColumn );.
2f680 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
2f690 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2f6a0 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20    revIdx = 0;.  
2f6b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2f6c0 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61   /* An unconstra
2f6d0 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ined column that
2f6e0 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d   might be NULL m
2f6f0 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20  eans that this. 
2f700 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c         ** WhereL
2f710 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d  oop is not well-
2f720 6f 72 64 65 72 65 64 20 0a 20 20 20 20 20 20 20  ordered .       
2f730 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2f740 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a  isOrderDistinct.
2f750 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c           && iCol
2f760 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20  umn>=0.         
2f770 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62  && j>=pLoop->u.b
2f780 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20  tree.nEq.       
2f790 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61    && pIndex->pTa
2f7a0 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
2f7b0 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20  n].notNull==0.  
2f7c0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2f7d0 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2f7e0 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
2f7f0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  }..        /* Fi
2f800 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  nd the ORDER BY 
2f810 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73  term that corres
2f820 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74  ponds to the j-t
2f830 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  h column.       
2f840 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78   ** of the index
2f850 20 61 6e 64 20 61 6e 64 20 6d 61 72 6b 20 74 68   and and mark th
2f860 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  at ORDER BY term
2f870 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f   off .        */
2f880 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d  .        bOnce =
2f890 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61   1;.        isMa
2f8a0 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
2f8b0 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20   for(i=0; bOnce 
2f8c0 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  && i<nOrderBy; i
2f8d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
2f8e0 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
2f8f0 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
2f900 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45  ;.          pOBE
2f910 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
2f920 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
2f930 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
2f940 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  r);.          te
2f950 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
2f960 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
2f970 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
2f980 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
2f990 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
2f9a0 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20  TINCTBY );.     
2f9b0 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
2f9c0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52  lags & (WHERE_GR
2f9d0 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54  OUPBY|WHERE_DIST
2f9e0 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f  INCTBY))==0 ) bO
2f9f0 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
2fa00 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2fa10 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
2fa20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2fa30 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
2fa40 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20  >iTable!=iCur ) 
2fa50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2fa60 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
2fa70 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  >iColumn!=iColum
2fa80 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
2fa90 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
2faa0 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
2fab0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2fac0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2fad0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
2fae0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
2faf0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2fb00 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2fb10 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
2fb20 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
2fb30 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
2fb40 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
2fb50 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43  ame, pIndex->azC
2fb60 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e  oll[j])!=0 ) con
2fb70 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2fb80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d   }.          isM
2fb90 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  atch = 1;.      
2fba0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2fbb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2fbc0 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20   isMatch ){.    
2fbd0 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
2fbe0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
2fbf0 20 20 20 74 65 73 74 63 61 73 65 28 20 64 69 73     testcase( dis
2fc00 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20  tinctColumns==0 
2fc10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  );.            d
2fc20 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d  istinctColumns =
2fc30 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
2fc40 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
2fc50 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
2fc60 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57           if( (pW
2fc70 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2fc80 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
2fc90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2fca0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
2fcb0 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20   the sort order 
2fcc0 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e  is compatible in
2fcd0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
2fce0 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20  use..           
2fcf0 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69   ** Sort order i
2fd00 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72  s irrelevant for
2fd10 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
2fd20 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
2fd30 20 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b     if( revSet ){
2fd40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2fd50 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78  f( (rev ^ revIdx
2fd60 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  )!=pOrderBy->a[i
2fd70 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65  ].sortOrder ) re
2fd80 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
2fd90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fda0 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72           rev = r
2fdb0 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79  evIdx ^ pOrderBy
2fdc0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2fdd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2fde0 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d  if( rev ) *pRevM
2fdf0 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  ask |= MASKBIT(i
2fe00 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Loop);.         
2fe10 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b       revSet = 1;
2fe20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2fe30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fe40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fe50 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20      /* No match 
2fe60 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
2fe70 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a     if( j==0 || j
2fe80 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  <nColumn ){.    
2fe90 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2fea0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
2feb0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
2fec0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
2fed0 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
2fee0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
2fef0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
2ff00 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c        } /* end L
2ff10 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
2ff20 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ex columns */.  
2ff30 20 20 20 20 69 66 28 20 64 69 73 74 69 6e 63 74      if( distinct
2ff40 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20  Columns ){.     
2ff50 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
2ff60 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20  rderDistinct==0 
2ff70 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64  );.        isOrd
2ff80 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a  erDistinct = 1;.
2ff90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a        }.    } /*
2ffa0 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d   end-if not one-
2ffb0 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d  row */..    /* M
2ffc0 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65  ark off any othe
2ffd0 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  r ORDER BY terms
2ffe0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
2fff0 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28  pLoop */.    if(
30000 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
30010 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44   ){.      orderD
30020 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70  istinctMask |= p
30030 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
30040 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
30050 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
30060 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
30070 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41  ;.        if( MA
30080 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
30090 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
300a0 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42       p = pOrderB
300b0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
300c0 20 20 20 20 20 20 20 69 66 28 20 28 65 78 70 72         if( (expr
300d0 54 61 62 6c 65 55 73 61 67 65 28 26 70 57 49 6e  TableUsage(&pWIn
300e0 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 29  fo->sMaskSet, p)
300f0 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  &~orderDistinctM
30100 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
30110 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
30120 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20  SKBIT(i);.      
30130 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30140 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65  }.  } /* End the
30150 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57   loop over all W
30160 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f  hereLoops from o
30170 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74  uter-most down t
30180 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a  o inner-most */.
30190 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44    if( obSat==obD
301a0 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  one ) return 1;.
301b0 20 20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69    if( !isOrderDi
301c0 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
301d0 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0;.  return -1;.
301e0 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
301f0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20  RACE_ENABLED./* 
30200 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73  For debugging us
30210 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69  e only: */.stati
30220 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68  c const char *wh
30230 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72  erePathName(Wher
30240 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e  ePath *pPath, in
30250 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f  t nLoop, WhereLo
30260 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74  op *pLast){.  st
30270 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b  atic char zName[
30280 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  65];.  int i;.  
30290 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70  for(i=0; i<nLoop
302a0 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d  ; i++){ zName[i]
302b0 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   = pPath->aLoop[
302c0 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28  i]->cId; }.  if(
302d0 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69   pLast ) zName[i
302e0 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64  ++] = pLast->cId
302f0 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30  ;.  zName[i] = 0
30300 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
30310 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
30320 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73  ** Given the lis
30330 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f  t of WhereLoop o
30340 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f  bjects at pWInfo
30350 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72  ->pLoops, this r
30360 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70  outine.** attemp
30370 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c  ts to find the l
30380 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
30390 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68  that visits each
303a0 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e   WhereLoop.** on
303b0 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69  ce.  This path i
303c0 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e  s then loaded in
303d0 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61  to the pWInfo->a
303e0 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73  [].pWLoop fields
303f0 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74  ..**.** Assume t
30400 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  hat the total nu
30410 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
30420 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65  ows that will ne
30430 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a  ed to be sorted.
30440 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45  ** will be nRowE
30450 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f  st (in the 10*lo
30460 67 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  g2 representatio
30470 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20  n).  Or, ignore 
30480 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73  sorting.** costs
30490 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a   if nRowEst==0..
304a0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
304b0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
304c0 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  s or SQLITE_NOME
304d0 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  M of a memory al
304e0 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f  location.** erro
304f0 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  r occurs..*/.sta
30500 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74  tic int wherePat
30510 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66  hSolver(WhereInf
30520 6f 20 2a 70 57 49 6e 66 6f 2c 20 57 68 65 72 65  o *pWInfo, Where
30530 43 6f 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20  Cost nRowEst){. 
30540 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20   int mxChoice;  
30550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
30560 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
30570 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74  simultaneous pat
30580 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20  hs tracked */.  
30590 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20  int nLoop;      
305a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
305b0 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
305c0 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61  the join */.  Pa
305d0 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
305e0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
305f0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
30600 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
30610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30620 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
30630 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  tion */.  int iL
30640 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
30650 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
30660 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72  ter over the ter
30670 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ms of the join *
30680 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20  /.  int ii, jj; 
30690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
306a0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
306b0 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 43  /.  WhereCost rC
306c0 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
306d0 20 2f 2a 20 43 6f 73 74 20 6f 66 20 61 20 70 61   /* Cost of a pa
306e0 74 68 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  th */.  WhereCos
306f0 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20  t mxCost = 0;   
30700 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
30710 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66  cost of a set of
30720 20 70 61 74 68 73 20 2a 2f 0a 20 20 57 68 65 72   paths */.  Wher
30730 65 43 6f 73 74 20 72 53 6f 72 74 43 6f 73 74 3b  eCost rSortCost;
30740 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
30750 20 74 6f 20 64 6f 20 61 20 73 6f 72 74 20 2a 2f   to do a sort */
30760 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f  .  int nTo, nFro
30770 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
30780 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
30790 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d  entries in aTo[]
307a0 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a   and aFrom[] */.
307b0 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72    WherePath *aFr
307c0 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
307d0 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61  ll nFrom paths a
307e0 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  t the previous l
307f0 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
30800 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20  ath *aTo;       
30810 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62      /* The nTo b
30820 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65  est paths at the
30830 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a   current level *
30840 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
30850 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
30860 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
30870 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61  From[] that we a
30880 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
30890 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54  .  WherePath *pT
308a0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
308b0 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54  An element of aT
308c0 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  o[] that we are 
308d0 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
308e0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f  WhereLoop *pWLoo
308f0 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  p;        /* One
30900 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
30910 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57  p objects */.  W
30920 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20  hereLoop **pX;  
30930 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
30940 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20   to divy up the 
30950 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f  pSpace memory */
30960 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b  .  char *pSpace;
30970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30980 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  Temporary memory
30990 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f   used by this ro
309a0 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 70 50 61 72  utine */..  pPar
309b0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
309c0 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
309d0 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20  se->db;.  nLoop 
309e0 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
309f0 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46  ;.  /* TUNING: F
30a00 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65  or simple querie
30a10 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74  s, only the best
30a20 20 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64   path is tracked
30a30 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79  ..  ** For 2-way
30a40 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65   joins, the 5 be
30a50 73 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c  st paths are fol
30a60 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  lowed..  ** For 
30a70 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f  joins of 3 or mo
30a80 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b  re tables, track
30a90 20 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74   the 10 best pat
30aa0 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65  hs */.  mxChoice
30ab0 20 3d 20 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20   = (nLoop==1) ? 
30ac0 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20  1 : (nLoop==2 ? 
30ad0 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72  5 : 10);.  asser
30ae0 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f  t( nLoop<=pWInfo
30af0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
30b00 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45   );.  WHERETRACE
30b10 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62  (0x002, ("---- b
30b20 65 67 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 29  egin solver\n"))
30b30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
30b40 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
30b50 73 70 61 63 65 20 66 6f 72 20 61 54 6f 20 61 6e  space for aTo an
30b60 64 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69 20  d aFrom */.  ii 
30b70 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50  = (sizeof(WhereP
30b80 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72  ath)+sizeof(Wher
30b90 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d  eLoop*)*nLoop)*m
30ba0 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53 70  xChoice*2;.  pSp
30bb0 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ace = sqlite3DbM
30bc0 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 69 69 29  allocRaw(db, ii)
30bd0 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d  ;.  if( pSpace==
30be0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
30bf0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d  E_NOMEM;.  aTo =
30c00 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53 70   (WherePath*)pSp
30c10 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61  ace;.  aFrom = a
30c20 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d  To+mxChoice;.  m
30c30 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20  emset(aFrom, 0, 
30c40 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29  sizeof(aFrom[0])
30c50 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65  );.  pX = (Where
30c60 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78  Loop**)(aFrom+mx
30c70 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69  Choice);.  for(i
30c80 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46  i=mxChoice*2, pF
30c90 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69  rom=aTo; ii>0; i
30ca0 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58  i--, pFrom++, pX
30cb0 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20   += nLoop){.    
30cc0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70  pFrom->aLoop = p
30cd0 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  X;.  }..  /* See
30ce0 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74  d the search wit
30cf0 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  h a single Where
30d00 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Path containing 
30d10 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e  zero WhereLoops.
30d20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e  .  **.  ** TUNIN
30d30 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68  G: Do not let th
30d40 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  e number of iter
30d50 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20  ations go above 
30d60 32 35 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74  25.  If the cost
30d70 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69  .  ** of computi
30d80 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  ng an automatic 
30d90 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69  index is not pai
30da0 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68  d back within th
30db0 65 20 66 69 72 73 74 20 32 35 0a 20 20 2a 2a 20  e first 25.  ** 
30dc0 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rows, then do no
30dd0 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61  t use the automa
30de0 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  tic index. */.  
30df0 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20  aFrom[0].nRow = 
30e00 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65  MIN(pParse->nQue
30e10 72 79 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73  ryLoop, 46);  as
30e20 73 65 72 74 28 20 34 36 3d 3d 77 68 65 72 65 43  sert( 46==whereC
30e30 6f 73 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72  ost(25) );.  nFr
30e40 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50 72  om = 1;..  /* Pr
30e50 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 73  ecompute the cos
30e60 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65  t of sorting the
30e70 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 65   final result se
30e80 74 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  t, if the caller
30e90 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  .  ** to sqlite3
30ea0 57 68 65 72 65 42 65 67 69 6e 28 29 20 77 61 73  WhereBegin() was
30eb0 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
30ec0 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 72 53   sorting */.  rS
30ed0 6f 72 74 43 6f 73 74 20 3d 20 30 3b 0a 20 20 69  ortCost = 0;.  i
30ee0 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
30ef0 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73  rBy==0 || nRowEs
30f00 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 46 72 6f  t==0 ){.    aFro
30f10 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 56 61  m[0].isOrderedVa
30f20 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  lid = 1;.  }else
30f30 7b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  {.    /* TUNING:
30f40 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20   Estimated cost 
30f50 6f 66 20 73 6f 72 74 69 6e 67 20 69 73 20 4e 2a  of sorting is N*
30f60 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20  log2(N) where N 
30f70 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75  is the.    ** nu
30f80 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
30f90 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 72 53 6f 72  ows. */.    rSor
30fa0 74 43 6f 73 74 20 3d 20 6e 52 6f 77 45 73 74 20  tCost = nRowEst 
30fb0 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73 74  + estLog(nRowEst
30fc0 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  );.    WHERETRAC
30fd0 45 28 30 78 30 30 32 2c 28 22 2d 2d 2d 2d 20 73  E(0x002,("---- s
30fe0 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 5c 6e 22  ort cost=%-3d\n"
30ff0 2c 20 72 53 6f 72 74 43 6f 73 74 29 29 3b 0a 20  , rSortCost));. 
31000 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
31010 20 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f   successively lo
31020 6e 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20  nger WherePaths 
31030 75 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f  using the previo
31040 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20  us generation.  
31050 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73  ** of WherePaths
31060 20 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f   as the basis fo
31070 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65  r the next.  Kee
31080 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d  p track of the m
31090 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73  xChoice.  ** bes
310a0 74 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20  t paths at each 
310b0 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
310c0 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f  for(iLoop=0; iLo
310d0 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  op<nLoop; iLoop+
310e0 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b  +){.    nTo = 0;
310f0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70  .    for(ii=0, p
31100 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e  From=aFrom; ii<n
31110 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f  From; ii++, pFro
31120 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  m++){.      for(
31130 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70  pWLoop=pWInfo->p
31140 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70  Loops; pWLoop; p
31150 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e  WLoop=pWLoop->pN
31160 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20  extLoop){.      
31170 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65    Bitmask maskNe
31180 77 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  w;.        Bitma
31190 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a  sk revMask = 0;.
311a0 20 20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64          u8 isOrd
311b0 65 72 65 64 56 61 6c 69 64 20 3d 20 70 46 72 6f  eredValid = pFro
311c0 6d 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  m->isOrderedVali
311d0 64 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69 73  d;.        u8 is
311e0 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d  Ordered = pFrom-
311f0 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20  >isOrdered;.    
31200 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
31210 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d  >prereq & ~pFrom
31220 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29  ->maskLoop)!=0 )
31230 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
31240 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e     if( (pWLoop->
31250 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d  maskSelf & pFrom
31260 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29  ->maskLoop)!=0 )
31270 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
31280 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
31290 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61  int, pWLoop is a
312a0 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
312b0 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20   the next loop. 
312c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70  .        ** Comp
312d0 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a  ute its cost */.
312e0 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
312f0 77 68 65 72 65 43 6f 73 74 41 64 64 28 70 57 4c  whereCostAdd(pWL
31300 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f  oop->rSetup,pWLo
31310 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d  op->rRun + pFrom
31320 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  ->nRow);.       
31330 20 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43 6f   rCost = whereCo
31340 73 74 41 64 64 28 72 43 6f 73 74 2c 20 70 46 72  stAdd(rCost, pFr
31350 6f 6d 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20  om->rCost);.    
31360 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46      maskNew = pF
31370 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
31380 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
31390 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  ;.        if( !i
313a0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 29 7b  sOrderedValid ){
313b0 0a 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63  .          switc
313c0 68 28 20 77 68 65 72 65 50 61 74 68 53 61 74 69  h( wherePathSati
313d0 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
313e0 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
313f0 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
31400 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46  fo->pOrderBy, pF
31410 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74  rom, pWInfo->wct
31420 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  rlFlags,.       
31430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31440 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26  iLoop, pWLoop, &
31450 72 65 76 4d 61 73 6b 29 20 29 7b 0a 20 20 20 20  revMask) ){.    
31460 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20          case 1: 
31470 20 2f 2a 20 59 65 73 2e 20 20 70 46 72 6f 6d 2b   /* Yes.  pFrom+
31480 70 57 4c 6f 6f 70 20 64 6f 65 73 20 73 61 74 69  pWLoop does sati
31490 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
314a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
314b0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
314c0 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ed = 1;.        
314d0 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
314e0 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
314f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
31500 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
31510 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70 46 72 6f  0:  /* No.  pFro
31520 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c 20 72 65  m+pWLoop will re
31530 71 75 69 72 65 20 61 20 73 65 70 61 72 61 74 65  quire a separate
31540 20 73 6f 72 74 20 2a 2f 0a 20 20 20 20 20 20 20   sort */.       
31550 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
31560 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
31570 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c      isOrderedVal
31580 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
31590 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68        rCost = wh
315a0 65 72 65 43 6f 73 74 41 64 64 28 72 43 6f 73 74  ereCostAdd(rCost
315b0 2c 20 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20 20  , rSortCost);.  
315c0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
315d0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  k;.            d
315e0 65 66 61 75 6c 74 3a 20 2f 2a 20 43 61 6e 6e 6f  efault: /* Canno
315f0 74 20 74 65 6c 6c 20 79 65 74 2e 20 20 54 72 79  t tell yet.  Try
31600 20 61 67 61 69 6e 20 6f 6e 20 74 68 65 20 6e 65   again on the ne
31610 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a  xt iteration */.
31620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
31630 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
31640 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
31650 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73            revMas
31660 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
31670 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  op;.        }.  
31680 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
31690 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20  o see if pWLoop 
316a0 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20  should be added 
316b0 74 6f 20 74 68 65 20 6d 78 43 68 6f 69 63 65 20  to the mxChoice 
316c0 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20  best so far */. 
316d0 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c         for(jj=0,
316e0 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f   pTo=aTo; jj<nTo
316f0 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
31700 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
31710 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73  o->maskLoop==mas
31720 6b 4e 65 77 20 26 26 20 70 54 6f 2d 3e 69 73 4f  kNew && pTo->isO
31730 72 64 65 72 65 64 56 61 6c 69 64 3d 3d 69 73 4f  rderedValid==isO
31740 72 64 65 72 65 64 56 61 6c 69 64 20 29 7b 0a 20  rderedValid ){. 
31750 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
31760 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29  ase( jj==nTo-1 )
31770 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
31780 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
31790 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
317a0 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29     if( jj>=nTo )
317b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
317c0 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 26 26  nTo>=mxChoice &&
317d0 20 72 43 6f 73 74 3e 3d 6d 78 43 6f 73 74 20 29   rCost>=mxCost )
317e0 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
317f0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
31800 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
31810 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
31820 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
31830 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
31840 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73  rintf("Skip   %s
31850 20 63 6f 73 74 3d 25 33 64 20 6f 72 64 65 72 3d   cost=%3d order=
31860 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
31870 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
31880 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
31890 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
318a0 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ost,.           
318b0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
318c0 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72  Valid ? (isOrder
318d0 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
318e0 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
318f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
31900 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
31910 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
31920 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
31930 61 20 6e 65 77 20 50 61 74 68 20 74 6f 20 74 68  a new Path to th
31940 65 20 61 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20  e aTo[] set */. 
31950 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f           if( nTo
31960 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20  <mxChoice ){.   
31970 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
31980 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
31990 20 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20   the aTo set by 
319a0 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  one */.         
319b0 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20     jj = nTo++;. 
319c0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
319d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
319e0 65 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73  ew path replaces
319f0 20 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74   the prior worst
31a00 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62   to keep count b
31a10 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f  elow mxChoice */
31a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
31a30 28 6a 6a 3d 6e 54 6f 2d 31 3b 20 61 54 6f 5b 6a  (jj=nTo-1; aTo[j
31a40 6a 5d 2e 72 43 6f 73 74 3c 6d 78 43 6f 73 74 3b  j].rCost<mxCost;
31a50 20 6a 6a 2d 2d 29 7b 20 61 73 73 65 72 74 28 6a   jj--){ assert(j
31a60 6a 3e 30 29 3b 20 7d 0a 20 20 20 20 20 20 20 20  j>0); }.        
31a70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54    }.          pT
31a80 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69  o = &aTo[jj];.#i
31a90 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
31aa0 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20  ENABLED.        
31ab0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
31ac0 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
31ad0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
31ae0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e  e3DebugPrintf("N
31af0 65 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  ew    %s cost=%-
31b00 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
31b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
31b30 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
31b40 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20  op), rCost,.    
31b50 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
31b60 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73  deredValid ? (is
31b70 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
31b80 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
31b90 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
31ba0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
31bb0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
31bc0 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20 29  ->rCost<=rCost )
31bd0 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
31be0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
31bf0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
31c00 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
31c10 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
31c20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
31c30 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
31c40 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20           "Skip  
31c50 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72   %s cost=%-3d or
31c60 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
31c70 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
31c80 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
31c90 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
31ca0 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20  rCost,.         
31cb0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
31cc0 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64  edValid ? (isOrd
31cd0 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
31ce0 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
31cf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
31d00 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76  ebugPrintf("   v
31d10 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f  s %s cost=%-3d o
31d20 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
31d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
31d40 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
31d50 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
31d60 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20 20 20 20 20  o->rCost,.      
31d70 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d              pTo-
31d80 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  >isOrderedValid 
31d90 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
31da0 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
31db0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
31dc0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
31dd0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
31de0 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43  ( pTo->rCost==rC
31df0 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ost );.         
31e00 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
31e10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31e20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
31e30 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31  ->rCost==rCost+1
31e40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   );.          /*
31e50 20 41 20 6e 65 77 20 61 6e 64 20 62 65 74 74 65   A new and bette
31e60 72 20 73 63 6f 72 65 20 66 6f 72 20 61 20 70 72  r score for a pr
31e70 65 76 69 6f 75 73 6c 79 20 63 72 65 61 74 65 64  eviously created
31e80 20 65 71 75 69 76 61 6c 65 6e 74 20 70 61 74 68   equivalent path
31e90 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45   */.#ifdef WHERE
31ea0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
31eb0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
31ec0 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
31ed0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
31ee0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
31ef0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
31f00 20 20 20 20 20 22 55 70 64 61 74 65 20 25 73 20       "Update %s 
31f10 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d  cost=%-3d order=
31f20 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
31f30 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
31f40 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
31f50 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
31f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31f70 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
31f80 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27  ? (isOrdered ? '
31f90 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
31fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
31fb0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
31fc0 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d  ("  was %s cost=
31fd0 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  %-3d order=%c\n"
31fe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31ff0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
32000 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
32010 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20  , pTo->rCost,.  
32020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
32030 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
32040 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65  d ? (pTo->isOrde
32050 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
32060 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
32070 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
32080 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
32090 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e   pWLoop is a win
320a0 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20  ner.  Add it to 
320b0 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20  the set of best 
320c0 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
320d0 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20    pTo->maskLoop 
320e0 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
320f0 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
32100 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54  Self;.        pT
32110 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76  o->revLoop = rev
32120 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  Mask;.        pT
32130 6f 2d 3e 6e 52 6f 77 20 3d 20 70 46 72 6f 6d 2d  o->nRow = pFrom-
32140 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e  >nRow + pWLoop->
32150 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54  nOut;.        pT
32160 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74  o->rCost = rCost
32170 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69  ;.        pTo->i
32180 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20  sOrderedValid = 
32190 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a  isOrderedValid;.
321a0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
321b0 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72  rdered = isOrder
321c0 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ed;.        memc
321d0 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70  py(pTo->aLoop, p
321e0 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a  From->aLoop, siz
321f0 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
32200 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
32210 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  pTo->aLoop[iLoop
32220 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  ] = pWLoop;.    
32230 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43      if( nTo>=mxC
32240 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20  hoice ){.       
32250 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b     mxCost = aTo[
32260 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20  0].rCost;.      
32270 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54      for(jj=1, pT
32280 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78  o=&aTo[1]; jj<mx
32290 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54  Choice; jj++, pT
322a0 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
322b0 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
322c0 3e 6d 78 43 6f 73 74 20 29 20 6d 78 43 6f 73 74  >mxCost ) mxCost
322d0 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20   = pTo->rCost;. 
322e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
322f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
32300 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45   }..#ifdef WHERE
32310 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
32320 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
32330 72 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20 20  reTrace>=2 ){.  
32340 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
32350 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74  Printf("---- aft
32360 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d  er round %d ----
32370 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20  \n", iLoop);.   
32380 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f     for(ii=0, pTo
32390 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69  =aTo; ii<nTo; ii
323a0 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
323b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
323c0 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74  Printf(" %s cost
323d0 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20  =%-3d nrow=%-3d 
323e0 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
323f0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
32400 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
32410 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
32420 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
32430 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
32440 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70  rderedValid ? (p
32450 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20  To->isOrdered ? 
32460 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
32470 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
32480 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
32490 69 64 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64  id && pTo->isOrd
324a0 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
324b0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
324c0 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c  intf(" rev=0x%ll
324d0 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f  x\n", pTo->revLo
324e0 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  op);.        }el
324f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
32500 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
32510 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ("\n");.        
32520 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
32530 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53  #endif..    /* S
32540 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66  wap the roles of
32550 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66   aFrom and aTo f
32560 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65  or the next gene
32570 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46  ration */.    pF
32580 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61  rom = aTo;.    a
32590 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20  To = aFrom;.    
325a0 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20  aFrom = pFrom;. 
325b0 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a     nFrom = nTo;.
325c0 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d    }..  if( nFrom
325d0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
325e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
325f0 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c  e, "no query sol
32600 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c  ution");.    sql
32610 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
32620 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75  Space);.    retu
32630 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
32640 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e  .  }.  .  /* Fin
32650 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
32660 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77  t path.  pFrom w
32670 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e  ill be left poin
32680 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74  ting to that pat
32690 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61  h */.  pFrom = a
326a0 46 72 6f 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  From;.  assert( 
326b0 6e 46 72 6f 6d 3d 3d 31 20 29 3b 0a 23 69 66 20  nFrom==1 );.#if 
326c0 30 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  0 /* The followi
326d0 6e 67 20 69 73 20 6e 65 65 64 65 64 20 69 66 20  ng is needed if 
326e0 6e 46 72 6f 6d 20 69 73 20 65 76 65 72 20 6d 6f  nFrom is ever mo
326f0 72 65 20 74 68 61 6e 20 31 20 2a 2f 0a 20 20 66  re than 1 */.  f
32700 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f  or(ii=1; ii<nFro
32710 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  m; ii++){.    if
32720 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61  ( pFrom->rCost>a
32730 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29  From[ii].rCost )
32740 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b   pFrom = &aFrom[
32750 69 69 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ii];.  }.#endif.
32760 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
32770 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20  ->nLevel==nLoop 
32780 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  );.  /* Load the
32790 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
327a0 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f  h into pWInfo */
327b0 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
327c0 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
327d0 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  op++){.    Where
327e0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20  Level *pLevel = 
327f0 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f  pWInfo->a + iLoo
32800 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  p;.    pLevel->p
32810 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d  WLoop = pWLoop =
32820 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c   pFrom->aLoop[iL
32830 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  oop];.    pLevel
32840 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70  ->iFrom = pWLoop
32850 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76  ->iTab;.    pLev
32860 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57  el->iTabCur = pW
32870 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
32880 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
32890 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20  .iCursor;.  }.  
328a0 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
328b0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
328c0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d  WANT_DISTINCT)!=
328d0 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  0.   && (pWInfo-
328e0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
328f0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d  ERE_DISTINCTBY)=
32900 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d  =0.   && pWInfo-
32910 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52  >eDistinct==WHER
32920 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a  E_DISTINCT_NOOP.
32930 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20     && nRowEst.  
32940 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e  ){.    Bitmask n
32950 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20  otUsed;.    int 
32960 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  rc = wherePathSa
32970 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
32980 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70  WInfo, pWInfo->p
32990 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d  ResultSet, pFrom
329a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
329b0 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43     WHERE_DISTINC
329c0 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  TBY, nLoop-1, pF
329d0 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
329e0 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  -1], &notUsed);.
329f0 20 20 20 20 69 66 28 20 72 63 3d 3d 31 20 29 20      if( rc==1 ) 
32a00 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
32a10 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
32a20 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 7d 0a  CT_ORDERED;.  }.
32a30 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f    if( pFrom->isO
32a40 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 69 66  rdered ){.    if
32a50 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
32a60 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
32a70 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20  TINCTBY ){.     
32a80 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
32a90 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
32aa0 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
32ab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57   }else{.      pW
32ac0 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31  Info->bOBSat = 1
32ad0 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
32ae0 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d  revMask = pFrom-
32af0 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a  >revLoop;.    }.
32b00 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52    }.  pWInfo->nR
32b10 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e  owOut = pFrom->n
32b20 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  Row;..  /* Free 
32b30 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  temporary memory
32b40 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63   and return succ
32b50 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ess */.  sqlite3
32b60 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
32b70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
32b80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
32b90 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73   Most queries us
32ba0 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
32bb0 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20  table (they are 
32bc0 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68  not joins) and h
32bd0 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d  ave.** simple ==
32be0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61   constraints aga
32bf0 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65  inst indexed fie
32c00 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lds.  This routi
32c10 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  ne attempts.** t
32c20 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d  o plan those sim
32c30 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20  ple cases using 
32c40 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f  much less ceremo
32c50 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67  ny than the.** g
32c60 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
32c70 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e  uery planner, an
32c80 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20  d thereby yield 
32c90 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70  faster sqlite3_p
32ca0 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65  repare().** time
32cb0 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  s for the common
32cc0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   case..**.** Ret
32cd0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20  urn non-zero on 
32ce0 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73  success, if this
32cf0 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61   query can be ha
32d00 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  ndled by this.**
32d10 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79   no-frills query
32d20 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72   planner.  Retur
32d30 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71  n zero if this q
32d40 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a  uery needs the .
32d50 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
32d60 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
32d70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32d80 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68  whereShortCut(Wh
32d90 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
32da0 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65  pBuilder){.  Whe
32db0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a  reInfo *pWInfo;.
32dc0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
32dd0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
32de0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
32df0 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
32e00 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  Term;.  WhereLoo
32e10 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20  p *pLoop;.  int 
32e20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  iCur;.  int j;. 
32e30 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
32e40 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a  Index *pIdx;.  .
32e50 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
32e60 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  der->pWInfo;.  i
32e70 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
32e80 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
32e90 52 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75  RCE_TABLE ) retu
32ea0 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
32eb0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
32ec0 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70  ->nSrc>=1 );.  p
32ed0 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
32ee0 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54  TabList->a;.  pT
32ef0 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
32f00 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ;.  if( IsVirtua
32f10 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
32f20 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d   0;.  if( pItem-
32f30 3e 7a 49 6e 64 65 78 20 29 20 72 65 74 75 72 6e  >zIndex ) return
32f40 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74   0;.  iCur = pIt
32f50 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70  em->iCursor;.  p
32f60 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
32f70 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75  C;.  pLoop = pBu
32f80 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
32f90 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
32fa0 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  0;.  pTerm = fin
32fb0 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
32fc0 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30   -1, 0, WO_EQ, 0
32fd0 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  );.  if( pTerm )
32fe0 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  {.    pLoop->wsF
32ff0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
33000 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b  UMN_EQ|WHERE_IPK
33010 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20  |WHERE_ONEROW;. 
33020 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
33030 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
33040 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
33050 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75   1;.    pLoop->u
33060 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a  .btree.nEq = 1;.
33070 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
33080 6f 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c  ost of a rowid l
33090 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20  ookup is 10 */. 
330a0 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
330b0 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 77 68 65   33;  /* 33==whe
330c0 72 65 43 6f 73 74 28 31 30 29 20 2a 2f 0a 20 20  reCost(10) */.  
330d0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70  }else{.    for(p
330e0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
330f0 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
33100 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
33110 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
33120 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 7c 7c 20 70  or==OE_None || p
33130 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
33140 72 65 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  re!=0 ) continue
33150 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
33160 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
33170 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
33180 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
33190 28 70 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78  (pWC, iCur, pIdx
331a0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30  ->aiColumn[j], 0
331b0 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a  , WO_EQ, pIdx);.
331c0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
331d0 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
331e0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 52        whereLoopR
331f0 65 73 69 7a 65 28 70 57 49 6e 66 6f 2d 3e 70 50  esize(pWInfo->pP
33200 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c  arse->db, pLoop,
33210 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f   j);.        pLo
33220 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20  op->aLTerm[j] = 
33230 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
33240 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78       if( j!=pIdx
33250 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->nColumn ) cont
33260 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  inue;.      pLoo
33270 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
33280 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
33290 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f  RE_ONEROW|WHERE_
332a0 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69  INDEXED;.      i
332b0 66 28 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73  f( (pItem->colUs
332c0 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49  ed & ~columnsInI
332d0 6e 64 65 78 28 70 49 64 78 29 29 3d 3d 30 20 29  ndex(pIdx))==0 )
332e0 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
332f0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
33300 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20  E_IDX_ONLY;.    
33310 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d    }.      pLoop-
33320 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20  >nLTerm = j;.   
33330 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
33340 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20  e.nEq = j;.     
33350 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
33360 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
33370 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
33380 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65  Cost of a unique
33390 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73   index lookup is
333a0 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f   15 */.      pLo
333b0 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20  op->rRun = 39;  
333c0 2f 2a 20 33 39 3d 3d 77 68 65 72 65 43 6f 73 74  /* 39==whereCost
333d0 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72  (15) */.      br
333e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
333f0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
33400 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70  ags ){.    pLoop
33410 2d 3e 6e 4f 75 74 20 3d 20 28 57 68 65 72 65 43  ->nOut = (WhereC
33420 6f 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66  ost)1;.    pWInf
33430 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d  o->a[0].pWLoop =
33440 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f   pLoop;.    pLoo
33450 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65  p->maskSelf = ge
33460 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
33470 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  MaskSet, iCur);.
33480 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
33490 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b  .iTabCur = iCur;
334a0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  .    pWInfo->nRo
334b0 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  wOut = 1;.    if
334c0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
334d0 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42  By ) pWInfo->bOB
334e0 53 61 74 20 3d 20 20 31 3b 0a 20 20 20 20 69 66  Sat =  1;.    if
334f0 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
33500 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
33510 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
33520 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
33530 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
33540 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
33550 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
33560 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f  TE_DEBUG.    pLo
33570 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23  op->cId = '0';.#
33580 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
33590 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
335a0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
335b0 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e  erate the beginn
335c0 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ing of the loop 
335d0 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63  used for WHERE c
335e0 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
335f0 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
33600 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74  value is a point
33610 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20  er to an opaque 
33620 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63  structure that c
33630 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72  ontains.** infor
33640 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
33650 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
33660 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65  oop.  Later, the
33670 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
33680 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  .** should invok
33690 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
336a0 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74  d() with the ret
336b0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
336c0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  s function.** in
336d0 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
336e0 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  te the WHERE cla
336f0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
33700 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
33710 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72  r occurs, this r
33720 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
33730 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62  ULL..**.** The b
33740 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20  asic idea is to 
33750 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  do a nested loop
33760 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65  , one loop for e
33770 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  ach table in.** 
33780 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
33790 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49  of a select.  (I
337a0 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
337b0 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
337c0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61  the.** same as a
337d0 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c   SELECT with onl
337e0 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
337f0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
33800 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78  use.)  For.** ex
33810 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51  ample, if the SQ
33820 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  L is this:.**.**
33830 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
33840 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20  FROM t1, t2, t3 
33850 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a  WHERE ...;.**.**
33860 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67   Then the code g
33870 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63  enerated is conc
33880 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68  eptually like th
33890 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
338a0 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
338b0 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20  row1 in t1 do   
338c0 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
338d0 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
338e0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
338f0 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d  n t2 do      |--
33900 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
33910 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20  Begin().**      
33920 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33      foreach row3
33930 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a   in t3 do   /.**
33940 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a              ....
33950 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20  **          end 
33960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33970 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
33980 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
33990 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
339a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d               |--
339b0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
339c0 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e  End().**      en
339d0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
339e0 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a            /.**.*
339f0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
33a00 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20  loops might not 
33a10 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65  be nested in the
33a20 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
33a30 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69  they.** appear i
33a40 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
33a50 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74  e if a different
33a60 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72   order is better
33a70 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a   able to make.**
33a80 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e   use of indices.
33a90 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
33aa0 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65   when the IN ope
33ab0 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e  rator appears in
33ac0 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
33ad0 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72  ause, it might r
33ae0 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f  esult in additio
33af0 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73  nal nested loops
33b00 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67   for.** scanning
33b10 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c   through all val
33b20 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ues on the right
33b30 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
33b40 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  e IN..**.** Ther
33b50 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73  e are Btree curs
33b60 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
33b70 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20  ith each table. 
33b80 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a   t1 uses cursor.
33b90 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69  ** number pTabLi
33ba0 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
33bb0 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63  .  t2 uses the c
33bc0 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e  ursor pTabList->
33bd0 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a  a[1].iCursor..**
33be0 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
33bf0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
33c00 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f  erates code to o
33c10 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63  pen those VDBE c
33c20 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71  ursors.** and sq
33c30 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
33c40 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
33c50 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d  de to close them
33c60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ..**.** The code
33c70 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65   that sqlite3Whe
33c80 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61  reBegin() genera
33c90 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63  tes leaves the c
33ca0 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20  ursors named.** 
33cb0 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e  in pTabList poin
33cc0 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70  ting at their ap
33cd0 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65  propriate entrie
33ce0 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f  s.  The [...] co
33cf0 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50  de.** can use OP
33d00 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52  _Column and OP_R
33d10 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20  owid opcodes on 
33d20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f  these cursors to
33d30 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61   extract.** data
33d40 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75   from the variou
33d50 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20  s tables of the 
33d60 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  loop..**.** If t
33d70 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
33d80 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f  is empty, the fo
33d90 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74  reach loops must
33da0 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72   each scan their
33db0 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65  .** entire table
33dc0 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65  s.  Thus a three
33dd0 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20  -way join is an 
33de0 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e  O(N^3) operation
33df0 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65  .  But if.** the
33e00 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64   tables have ind
33e10 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61  ices and there a
33e20 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
33e30 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
33e40 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68  t.** refer to th
33e50 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63  ose indices, a c
33e60 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63  omplete table sc
33e70 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65  an can be avoide
33e80 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64  d and the.** cod
33e90 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20  e will run much 
33ea0 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66  faster.  Most of
33eb0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69   the work of thi
33ec0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65  s routine is che
33ed0 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20  cking.** to see 
33ee0 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64  if there are ind
33ef0 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65  ices that can be
33f00 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
33f10 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  p the loop..**.*
33f20 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * Terms of the W
33f30 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20  HERE clause are 
33f40 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d  also used to lim
33f50 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63  it which rows ac
33f60 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69  tually.** make i
33f70 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69  t to the "..." i
33f80 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
33f90 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72  the loop.  After
33fa0 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c   each "foreach",
33fb0 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65  .** terms of the
33fc0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
33fd0 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d  at use only term
33fe0 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61  s in that loop a
33ff0 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70  nd outer.** loop
34000 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  s are evaluated 
34010 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a  and if false a j
34020 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75  ump is made arou
34030 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  nd all subsequen
34040 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  t.** inner loops
34050 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20   (or around the 
34060 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73  "..." if the tes
34070 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
34080 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f  the inner-.** mo
34090 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f  st loop).**.** O
340a0 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a  UTER JOINS.**.**
340b0 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f   An outer join o
340c0 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20  f tables t1 and 
340d0 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c  t2 is conceptall
340e0 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f  y coded as follo
340f0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72  ws:.**.**    for
34100 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
34110 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20  do.**      flag 
34120 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  = 0.**      fore
34130 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
34140 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72  o.**        star
34150 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e  t:.**          .
34160 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ...**          f
34170 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20  lag = 1.**      
34180 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66  end.**      if f
34190 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20  lag==0 then.**  
341a0 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72        move the r
341b0 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20  ow2 cursor to a 
341c0 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20  null row.**     
341d0 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a     goto start.**
341e0 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65        fi.**    e
341f0 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42  nd.**.** ORDER B
34200 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53  Y CLAUSE PROCESS
34210 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72  ING.**.** pOrder
34220 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
34230 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
34240 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47  clause (or the G
34250 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a  ROUP BY clause.*
34260 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47  * if the WHERE_G
34270 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73  ROUPBY flag is s
34280 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73  et in wctrlFlags
34290 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  ) of a SELECT st
342a0 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68  atement.** if th
342b0 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
342c0 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
342d0 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69  R BY clause or i
342e0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
342f0 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  * is called from
34300 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
34310 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
34320 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73  then pOrderBy is
34330 20 4e 55 4c 4c 2e 0a 2a 2f 0a 57 68 65 72 65 49   NULL..*/.WhereI
34340 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72  nfo *sqlite3Wher
34350 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20  eBegin(.  Parse 
34360 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
34370 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
34380 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
34390 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
343a0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a   /* FROM clause:
343b0 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74   A list of all t
343c0 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e  ables to be scan
343d0 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ned */.  Expr *p
343e0 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
343f0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
34400 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
34410 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
34420 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   An ORDER BY cla
34430 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
34440 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73    ExprList *pRes
34450 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73 75 6c  ultSet, /* Resul
34460 74 20 73 65 74 20 6f 66 20 74 68 65 20 71 75 65  t set of the que
34470 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ry */.  u16 wctr
34480 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a  lFlags,       /*
34490 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   One of the WHER
344a0 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65  E_* flags define
344b0 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  d in sqliteInt.h
344c0 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
344d0 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  r           /* I
344e0 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  f WHERE_ONETABLE
344f0 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e  _ONLY is set, in
34500 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  dex cursor numbe
34510 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  r */.){.  int nB
34520 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  yteWInfo;       
34530 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74       /* Num. byt
34540 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
34550 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
34560 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c  t */.  int nTabL
34570 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
34580 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
34590 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c  lements in pTabL
345a0 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ist */.  WhereIn
345b0 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
345c0 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
345d0 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
345e0 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
345f0 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
34600 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
34610 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
34620 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
34630 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ine */.  Bitmask
34640 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
34650 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74      /* Cursors t
34660 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20  hat are not yet 
34670 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20  positioned */.  
34680 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
34690 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68   sWLB;     /* Th
346a0 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c  e WhereLoop buil
346b0 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  der */.  WhereMa
346c0 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
346d0 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
346e0 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a  ssion mask set *
346f0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
34700 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f  pLevel;        /
34710 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  * A single level
34720 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20   in pWInfo->a[] 
34730 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
34740 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
34750 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
34760 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70  single WhereLoop
34770 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
34780 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
34790 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
347a0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c  counter */.  sql
347b0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
347c0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
347d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
347e0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
347f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34800 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
34810 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  ...  /* Variable
34820 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
34830 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
34840 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26  ->db;.  memset(&
34850 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sWLB, 0, sizeof(
34860 73 57 4c 42 29 29 3b 0a 20 20 73 57 4c 42 2e 70  sWLB));.  sWLB.p
34870 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
34880 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c  By;..  /* Disabl
34890 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f  e the DISTINCT o
348a0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53  ptimization if S
348b0 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
348c0 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a  t is set via.  *
348d0 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
348e0 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  trl(SQLITE_TESTC
348f0 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
34900 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20  S,...) */.  if( 
34910 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
34920 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
34930 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a  DistinctOpt) ){.
34940 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26      wctrlFlags &
34950 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49  = ~WHERE_WANT_DI
34960 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f  STINCT;.  }..  /
34970 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
34980 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
34990 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
349a0 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
349b0 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20  er of.  ** bits 
349c0 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20  in a Bitmask .  
349d0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
349e0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42  TabList->nSrc==B
349f0 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  MS );.  if( pTab
34a00 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29  List->nSrc>BMS )
34a10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
34a20 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
34a30 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73  t most %d tables
34a40 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53   in a join", BMS
34a50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
34a60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
34a70 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c  function normall
34a80 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65  y generates a ne
34a90 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c  sted loop for al
34aa0 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a  l tables in .  *
34ab0 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74  * pTabList.  But
34ac0 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e   if the WHERE_ON
34ad0 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67  ETABLE_ONLY flag
34ae0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65   is set, then we
34af0 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c   should.  ** onl
34b00 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  y generate code 
34b10 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61  for the first ta
34b20 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20  ble in pTabList 
34b30 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a  and assume that.
34b40 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73    ** any cursors
34b50 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
34b60 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c   subsequent tabl
34b70 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c  es are uninitial
34b80 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61  ized..  */.  nTa
34b90 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c  bList = (wctrlFl
34ba0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
34bb0 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a  ABLE_ONLY) ? 1 :
34bc0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b   pTabList->nSrc;
34bd0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
34be0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
34bf0 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  he WhereInfo str
34c00 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
34c10 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a   become the.  **
34c20 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41   return value. A
34c30 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69   single allocati
34c40 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  on is used to st
34c50 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ore the WhereInf
34c60 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74  o.  ** struct, t
34c70 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57  he contents of W
34c80 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68  hereInfo.a[], th
34c90 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
34ca0 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64  ructure.  ** and
34cb0 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65   the WhereMaskSe
34cc0 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e  t structure. Sin
34cd0 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63  ce WhereClause c
34ce0 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74  ontains an 8-byt
34cf0 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79  e.  ** field (ty
34d00 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d  pe Bitmask) it m
34d10 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f  ust be aligned o
34d20 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e  n an 8-byte boun
34d30 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d  dary on.  ** som
34d40 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e  e architectures.
34d50 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44   Hence the ROUND
34d60 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a  8() below..  */.
34d70 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52    nByteWInfo = R
34d80 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65  OUND8(sizeof(Whe
34d90 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73  reInfo)+(nTabLis
34da0 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72  t-1)*sizeof(Wher
34db0 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e  eLevel));.  pWIn
34dc0 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
34dd0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
34de0 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66  teWInfo + sizeof
34df0 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20  (WhereLoop));.  
34e00 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
34e10 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
34e20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
34e30 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66  Info);.    pWInf
34e40 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  o = 0;.    goto 
34e50 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
34e60 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e  .  }.  pWInfo->n
34e70 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74  Level = nTabList
34e80 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
34e90 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
34ea0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20  WInfo->pTabList 
34eb0 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = pTabList;.  pW
34ec0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
34ed0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49   pOrderBy;.  pWI
34ee0 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20  nfo->pResultSet 
34ef0 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20  = pResultSet;.  
34f00 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d  pWInfo->iBreak =
34f10 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
34f20 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e  Label(v);.  pWIn
34f30 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d  fo->wctrlFlags =
34f40 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70   wctrlFlags;.  p
34f50 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
34f60 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
34f70 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70  >nQueryLoop;.  p
34f80 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66  MaskSet = &pWInf
34f90 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73  o->sMaskSet;.  s
34fa0 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49  WLB.pWInfo = pWI
34fb0 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20  nfo;.  sWLB.pWC 
34fc0 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
34fd0 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57    sWLB.pNew = (W
34fe0 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61  hereLoop*)(((cha
34ff0 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65  r*)pWInfo)+nByte
35000 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  WInfo);.  assert
35010 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
35020 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77  GNMENT(sWLB.pNew
35030 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  ) );.  whereLoop
35040 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b  Init(sWLB.pNew);
35050 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
35060 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77  EBUG.  sWLB.pNew
35070 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e  ->cId = '*';.#en
35080 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20  dif..  /* Split 
35090 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
350a0 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73   into separate s
350b0 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68  ubexpressions wh
350c0 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75  ere each.  ** su
350d0 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
350e0 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41  eparated by an A
350f0 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ND operator..  *
35100 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28  /.  initMaskSet(
35110 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65  pMaskSet);.  whe
35120 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57  reClauseInit(&pW
35130 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66  Info->sWC, pWInf
35140 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  o);.  sqlite3Exp
35150 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70  rCodeConstants(p
35160 50 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a  Parse, pWhere);.
35170 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 70 57    whereSplit(&pW
35180 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72  Info->sWC, pWher
35190 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 73 71  e, TK_AND);.  sq
351a0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
351b0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31  chema(pParse, -1
351c0 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  ); /* Insert the
351d0 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72   cookie verifier
351e0 20 47 6f 74 6f 20 2a 2f 0a 20 20 20 20 0a 20 20   Goto */.    .  
351f0 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
35200 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
35210 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  that is constant
35220 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a  .  Evaluate the.
35230 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
35240 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20  and either jump 
35250 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
35260 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  code or fall thr
35270 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  u..  */.  if( pW
35280 68 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73  here && (nTabLis
35290 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45  t==0 || sqlite3E
352a0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
352b0 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b  Join(pWhere)) ){
352c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
352d0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
352e0 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e  pWhere, pWInfo->
352f0 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a  iBreak, SQLITE_J
35300 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
35310 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
35320 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
35330 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75  se: No FROM clau
35340 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54  se.  */.  if( nT
35350 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  abList==0 ){.   
35360 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
35370 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d  pWInfo->bOBSat =
35380 20 31 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72   1;.    if( wctr
35390 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
353a0 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
353b0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
353c0 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
353d0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
353e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
353f0 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
35400 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
35410 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
35420 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
35430 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
35440 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73  assigning bitmas
35450 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d  k values to FROM
35460 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c   clause cursors,
35470 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a   it must be.  **
35480 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69   the case that i
35490 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61  f X is the bitma
354a0 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  sk for the N-th 
354b0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
354c0 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62   then.  ** the b
354d0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46  itmask for all F
354e0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
354f0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
35500 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20  the N-th term.  
35510 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41  ** is (X-1).   A
35520 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
35530 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  m the ON clause 
35540 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  of a LEFT JOIN c
35550 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20  an use.  ** its 
35560 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
35570 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69  able value to fi
35580 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f  nd the bitmask o
35590 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
355a0 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  e.  ** of the jo
355b0 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67  in.  Subtracting
355c0 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69   one from the ri
355d0 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73  ght table bitmas
355e0 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62  k gives a.  ** b
355f0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74  itmask for all t
35600 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
35610 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  t of the join.  
35620 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d  Knowing the bitm
35630 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c  ask.  ** for all
35640 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
35650 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
35660 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  in is important.
35670 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a    Ticket #3015..
35680 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
35690 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65  hat bitmasks are
356a0 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
356b0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
356c0 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70  tables in.  ** p
356d0 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73  TabList, not jus
356e0 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62  t the first nTab
356f0 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54  List tables.  nT
35700 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c  abList is normal
35710 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f  ly.  ** equal to
35720 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
35730 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f  but might be sho
35740 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74  rtened to 1 if t
35750 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e  he.  ** WHERE_ON
35760 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67  ETABLE_ONLY flag
35770 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   is set..  */.  
35780 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
35790 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
357a0 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61  +){.    createMa
357b0 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
357c0 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75  bList->a[ii].iCu
357d0 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rsor);.  }.#ifnd
357e0 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20  ef NDEBUG.  {.  
357f0 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c    Bitmask toTheL
35800 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  eft = 0;.    for
35810 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69  (ii=0; ii<pTabLi
35820 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b  st->nSrc; ii++){
35830 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
35840 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
35850 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
35860 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  [ii].iCursor);. 
35870 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d       assert( (m-
35880 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b  1)==toTheLeft );
35890 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74  .      toTheLeft
358a0 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d   |= m;.    }.  }
358b0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
358c0 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65  alyze all of the
358d0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
358e0 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72    Note that expr
358f0 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a  Analyze() might.
35900 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72    ** add new vir
35910 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20  tual terms onto 
35920 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
35930 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65  HERE clause.  We
35940 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e   do not.  ** wan
35950 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  t to analyze the
35960 73 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  se virtual terms
35970 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79  , so start analy
35980 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  zing at the end.
35990 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f    ** and work fo
359a0 72 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68  rward so that th
359b0 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20  e added virtual 
359c0 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20  terms are never 
359d0 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a  processed..  */.
359e0 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
359f0 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e  (pTabList, &pWIn
35a00 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20  fo->sWC);.  if( 
35a10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
35a20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
35a30 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
35a40 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
35a50 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55  RDER BY (or GROU
35a60 50 20 42 59 29 20 63 6c 61 75 73 65 20 63 6f 6e  P BY) clause con
35a70 74 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65 73  tains references
35a80 20 74 6f 20 67 65 6e 65 72 61 6c 0a 20 20 2a 2a   to general.  **
35a90 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 74 68   expressions, th
35aa0 65 6e 20 77 65 20 77 6f 6e 27 74 20 62 65 20 61  en we won't be a
35ab0 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 69  ble to satisfy i
35ac0 74 20 75 73 69 6e 67 20 69 6e 64 69 63 65 73 2c  t using indices,
35ad0 20 73 6f 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61   so.  ** go ahea
35ae0 64 20 61 6e 64 20 64 69 73 61 62 6c 65 20 69 74  d and disable it
35af0 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
35b00 20 70 4f 72 64 65 72 42 79 20 26 26 20 28 77 63   pOrderBy && (wc
35b10 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
35b20 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21  _WANT_DISTINCT)!
35b30 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69  =0 ){.    for(ii
35b40 3d 30 3b 20 69 69 3c 70 4f 72 64 65 72 42 79 2d  =0; ii<pOrderBy-
35b50 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
35b60 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
35b70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
35b80 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
35b90 42 79 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  By->a[ii].pExpr)
35ba0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
35bb0 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
35bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   ){.        pWIn
35bd0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  fo->pOrderBy = p
35be0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
35bf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
35c00 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70    }else if( pExp
35c10 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
35c20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
35c30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
35c40 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61  ..  if( wctrlFla
35c50 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
35c60 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
35c70 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65  if( isDistinctRe
35c80 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20  dundant(pParse, 
35c90 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
35ca0 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53  o->sWC, pResultS
35cb0 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  et) ){.      /* 
35cc0 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72  The DISTINCT mar
35cd0 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73  king is pointles
35ce0 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a  s.  Ignore it. *
35cf0 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
35d00 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
35d10 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
35d20 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
35d30 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
35d40 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20        /* Try to 
35d50 4f 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73  ORDER BY the res
35d60 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20  ult set to make 
35d70 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73  distinct process
35d80 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20  ing easier */.  
35d90 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72      pWInfo->wctr
35da0 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  lFlags |= WHERE_
35db0 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20  DISTINCTBY;.    
35dc0 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
35dd0 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  By = pResultSet;
35de0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
35df0 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57   Construct the W
35e00 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
35e10 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45   */.  WHERETRACE
35e20 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70  (0xffff,("*** Op
35e30 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a  timizer Start **
35e40 2a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 6e 54  *\n"));.  if( nT
35e50 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68 65  abList!=1 || whe
35e60 72 65 53 68 6f 72 74 43 75 74 28 26 73 57 4c 42  reShortCut(&sWLB
35e70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
35e80 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c   whereLoopAddAll
35e90 28 26 73 57 4c 42 29 3b 0a 20 20 20 20 69 66 28  (&sWLB);.    if(
35ea0 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65   rc ) goto where
35eb0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 20  BeginError;.  . 
35ec0 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c     /* Display al
35ed0 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  l of the WhereLo
35ee0 6f 70 20 6f 62 6a 65 63 74 73 20 69 66 20 77 68  op objects if wh
35ef0 65 72 65 74 72 61 63 65 20 69 73 20 65 6e 61 62  eretrace is enab
35f00 6c 65 64 20 2a 2f 0a 23 69 66 64 65 66 20 57 48  led */.#ifdef WH
35f10 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
35f20 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
35f30 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20  WhereTrace ){.  
35f40 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
35f50 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
35f60 20 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72       static char
35f70 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32   zLabel[] = "012
35f80 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69  3456789abcdefghi
35f90 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78  jklmnopqrstuvwyx
35fa0 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  z".             
35fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35fc0 20 20 20 20 20 20 20 20 20 20 22 41 42 43 44 45            "ABCDE
35fd0 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
35fe0 56 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f  VWYXZ";.      fo
35ff0 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  r(p=pWInfo->pLoo
36000 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d  ps, i=0; p; p=p-
36010 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29  >pNextLoop, i++)
36020 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64  {.        p->cId
36030 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65   = zLabel[i%size
36040 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20  of(zLabel)];.   
36050 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
36060 69 6e 74 28 70 2c 20 70 54 61 62 4c 69 73 74 29  int(p, pTabList)
36070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36080 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68  #endif.  .    wh
36090 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57  erePathSolver(pW
360a0 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66  Info, 0);.    if
360b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
360c0 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
360d0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69  eginError;.    i
360e0 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
360f0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68  rBy ){.       wh
36100 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57  erePathSolver(pW
36110 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52  Info, pWInfo->nR
36120 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20  owOut+1);.      
36130 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
36140 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
36150 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
36160 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
36170 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
36180 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20  0 && (db->flags 
36190 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65  & SQLITE_Reverse
361a0 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20  Order)!=0 ){.   
361b0 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
361c0 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d 31  k = (Bitmask)(-1
361d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
361e0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56  rse->nErr || NEV
361f0 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ER(db->mallocFai
36200 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  led) ){.    goto
36210 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
36220 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45  ;.  }.#ifdef WHE
36230 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
36240 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
36250 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 69  reTrace ){.    i
36260 6e 74 20 69 69 3b 0a 20 20 20 20 73 71 6c 69 74  nt ii;.    sqlit
36270 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d  e3DebugPrintf("-
36280 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f  --- Solution nRo
36290 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e  w=%d", pWInfo->n
362a0 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69 66 28  RowOut);.    if(
362b0 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20   pWInfo->bOBSat 
362c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
362d0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52  DebugPrintf(" OR
362e0 44 45 52 42 59 3d 30 78 25 6c 6c 78 22 2c 20 70  DERBY=0x%llx", p
362f0 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b  WInfo->revMask);
36300 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
36310 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  h( pWInfo->eDist
36320 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61  inct ){.      ca
36330 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
36340 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20  T_UNIQUE: {.    
36350 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
36360 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
36370 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20  CT=unique");.   
36380 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
36390 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57    }.      case W
363a0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
363b0 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
363c0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
363d0 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
363e0 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
363f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
36400 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
36410 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
36420 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
36430 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
36440 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
36450 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20  unordered");.   
36460 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
36470 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
36480 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
36490 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28  ("\n");.    for(
364a0 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d  ii=0; ii<pWInfo-
364b0 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a  >nLevel; ii++){.
364c0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
364d0 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69  rint(pWInfo->a[i
364e0 69 5d 2e 70 57 4c 6f 6f 70 2c 20 70 54 61 62 4c  i].pWLoop, pTabL
364f0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
36500 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65  #endif.  /* Atte
36510 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c  mpt to omit tabl
36520 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e  es from the join
36530 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66   that do not eff
36540 65 63 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a  ect the result *
36550 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  /.  if( pWInfo->
36560 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20  nLevel>=2.   && 
36570 70 52 65 73 75 6c 74 53 65 74 21 3d 30 0a 20 20  pResultSet!=0.  
36580 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
36590 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
365a0 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29  TE_OmitNoopJoin)
365b0 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  .  ){.    Bitmas
365c0 6b 20 74 61 62 55 73 65 64 20 3d 20 65 78 70 72  k tabUsed = expr
365d0 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
365e0 4d 61 73 6b 53 65 74 2c 20 70 52 65 73 75 6c 74  MaskSet, pResult
365f0 53 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  Set);.    if( pO
36600 72 64 65 72 42 79 20 29 20 74 61 62 55 73 65 64  rderBy ) tabUsed
36610 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
36620 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
36630 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
36640 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e  while( pWInfo->n
36650 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20  Level>=2 ){.    
36660 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
36670 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20  rm, *pEnd;.     
36680 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d   pLoop = pWInfo-
36690 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  >a[pWInfo->nLeve
366a0 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20  l-1].pWLoop;.   
366b0 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
366c0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f  pTabList->a[pLoo
366d0 70 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e 74 79 70  p->iTab].jointyp
366e0 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20  e & JT_LEFT)==0 
366f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
36700 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
36710 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
36720 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20  INCT)==0.       
36730 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
36740 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
36750 57 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  W)==0.      ){. 
36760 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
36770 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
36780 28 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70  (tabUsed & pLoop
36790 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29  ->maskSelf)!=0 )
367a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 45   break;.      pE
367b0 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61  nd = sWLB.pWC->a
367c0 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65   + sWLB.pWC->nTe
367d0 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54  rm;.      for(pT
367e0 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b  erm=sWLB.pWC->a;
367f0 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65   pTerm<pEnd; pTe
36800 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
36810 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
36820 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
36830 73 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20 20 20  skSelf)!=0.     
36840 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50      && !ExprHasP
36850 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
36860 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
36870 6e 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  n).        ){.  
36880 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
36890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
368a0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
368b0 3c 70 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20  <pEnd ) break;. 
368c0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
368d0 30 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f  0xffff, ("-> dro
368e0 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73  p loop %c not us
368f0 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49  ed\n", pLoop->cI
36900 64 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  d));.      pWInf
36910 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20  o->nLevel--;.   
36920 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20     nTabList--;. 
36930 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45     }.  }.  WHERE
36940 54 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a  TRACE(0xffff,("*
36950 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e  ** Optimizer Fin
36960 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  ished ***\n"));.
36970 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
36980 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20  ->nQueryLoop += 
36990 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b  pWInfo->nRowOut;
369a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
369b0 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54  ller is an UPDAT
369c0 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
369d0 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65  ement that is re
369e0 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f  questing.  ** to
369f0 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20   use a one-pass 
36a00 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72  algorithm, deter
36a10 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20  mine if this is 
36a20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a  appropriate..  *
36a30 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61  * The one-pass a
36a40 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f  lgorithm only wo
36a50 72 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45  rks if the WHERE
36a60 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
36a70 6e 74 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  nts.  ** the sta
36a80 74 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65  tement to update
36a90 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20   a single row.. 
36aa0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77   */.  assert( (w
36ab0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
36ac0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
36ad0 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d  D)==0 || pWInfo-
36ae0 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20  >nLevel==1 );.  
36af0 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
36b00 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
36b10 44 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20  DESIRED)!=0 .   
36b20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d  && (pWInfo->a[0]
36b30 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
36b40 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
36b50 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66  !=0 ){.    pWInf
36b60 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31  o->okOnePass = 1
36b70 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
36b80 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  0].pWLoop->wsFla
36b90 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58  gs &= ~WHERE_IDX
36ba0 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _ONLY;.  }..  /*
36bb0 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73   Open all tables
36bc0 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
36bd0 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73   and any indices
36be0 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20   selected for.  
36bf0 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f  ** searching tho
36c00 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
36c10 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
36c20 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28  itmask)0;.  for(
36c30 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  ii=0, pLevel=pWI
36c40 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c  nfo->a; ii<nTabL
36c50 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65  ist; ii++, pLeve
36c60 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  l++){.    Table 
36c70 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61  *pTab;     /* Ta
36c80 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
36c90 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20     int iDb;     
36ca0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
36cb0 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
36cc0 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  ing table/index 
36cd0 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  */.    struct Sr
36ce0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
36cf0 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49  Item;..    pTabI
36d00 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
36d10 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
36d20 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54  ];.    pTab = pT
36d30 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
36d40 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
36d50 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
36d60 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
36d70 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
36d80 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20  vel->pWLoop;.   
36d90 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
36da0 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
36db0 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d  ral)!=0 || pTab-
36dc0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
36dd0 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
36de0 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66  */.    }else.#if
36df0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
36e00 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
36e10 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
36e20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
36e30 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
36e40 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
36e50 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e  ar *pVTab = (con
36e60 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
36e70 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
36e80 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  Tab);.      int 
36e90 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
36ea0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
36eb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36ec0 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69  4(v, OP_VOpen, i
36ed0 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62  Cur, 0, 0, pVTab
36ee0 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
36ef0 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
36f00 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
36f10 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20     /* noop */.  
36f20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
36f30 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
36f40 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
36f50 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
36f60 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
36f70 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54  ags & WHERE_OMIT
36f80 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20  _OPEN_CLOSE)==0 
36f90 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  ){.      int op 
36fa0 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  = pWInfo->okOneP
36fb0 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69  ass ? OP_OpenWri
36fc0 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64  te : OP_OpenRead
36fd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
36fe0 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
36ff0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
37000 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f  or, iDb, pTab, o
37010 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  p);.      testca
37020 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  se( !pWInfo->okO
37030 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e  nePass && pTab->
37040 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  nCol==BMS-1 );. 
37050 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21       testcase( !
37060 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
37070 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  s && pTab->nCol=
37080 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66  =BMS );.      if
37090 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  ( !pWInfo->okOne
370a0 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43  Pass && pTab->nC
370b0 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20 20  ol<BMS ){.      
370c0 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54    Bitmask b = pT
370d0 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  abItem->colUsed;
370e0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
370f0 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   0;.        for(
37100 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b  ; b; b=b>>1, n++
37110 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ){}.        sqli
37120 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
37130 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
37140 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20  rrentAddr(v)-1, 
37150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37160 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
37170 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e  ITE_INT_TO_PTR(n
37180 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20  ), P4_INT32);.  
37190 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c        assert( n<
371a0 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  =pTab->nCol );. 
371b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
371c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
371d0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
371e0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
371f0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
37200 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
37210 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
37220 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
37230 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  ){.      Index *
37240 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  pIx = pLoop->u.b
37250 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
37260 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
37270 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
37280 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
37290 49 78 29 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49  Ix);.      /* FI
372a0 58 4d 45 3a 20 20 41 73 20 61 6e 20 6f 70 74 69  XME:  As an opti
372b0 6d 69 7a 61 74 69 6f 6e 20 75 73 65 20 70 54 61  mization use pTa
372c0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 69  bItem->iCursor i
372d0 66 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  f WHERE_IDX_ONLY
372e0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 49   */.      int iI
372f0 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  ndexCur = pLevel
37300 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 64 78  ->iIdxCur = iIdx
37310 43 75 72 20 3f 20 69 49 64 78 43 75 72 20 3a 20  Cur ? iIdxCur : 
37320 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
37330 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
37340 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
37350 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
37360 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65     assert( iInde
37370 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  xCur>=0 );.     
37380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37390 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p4(v, OP_OpenRea
373a0 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49  d, iIndexCur, pI
373b0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20  x->tnum, iDb,.  
373c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
373d0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
373e0 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P4_KEYINFO_HA
373f0 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64  NDOFF);.      Vd
37400 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
37410 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29  s", pIx->zName))
37420 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
37430 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
37440 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
37450 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26  ;.    notReady &
37460 3d 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  = ~getMask(&pWIn
37470 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 54  fo->sMaskSet, pT
37480 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
37490 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
374a0 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  iTop = sqlite3Vd
374b0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
374c0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
374d0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
374e0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
374f0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
37500 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  the code to do t
37510 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68  he search.  Each
37520 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
37530 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20  e for.  ** loop 
37540 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20  below generates 
37550 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
37560 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  e nested loop of
37570 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f   the VM.  ** pro
37580 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  gram..  */.  not
37590 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
375a0 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  k)0;.  for(ii=0;
375b0 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
375c0 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20  ++){.    pLevel 
375d0 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  = &pWInfo->a[ii]
375e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
375f0 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
37600 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70  INDEX.    if( (p
37610 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77  Level->pWLoop->w
37620 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
37630 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b  UTO_INDEX)!=0 ){
37640 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74  .      construct
37650 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70  AutomaticIndex(p
37660 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e  Parse, &pWInfo->
37670 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20  sWC,.           
37680 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e       &pTabList->
37690 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
376a0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76  , notReady, pLev
376b0 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  el);.      if( d
376c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
376d0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
376e0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65  nError;.    }.#e
376f0 6e 64 69 66 0a 20 20 20 20 65 78 70 6c 61 69 6e  ndif.    explain
37700 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c 20  OneScan(pParse, 
37710 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c  pTabList, pLevel
37720 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  , ii, pLevel->iF
37730 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 29  rom, wctrlFlags)
37740 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  ;.    pLevel->ad
37750 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  drBody = sqlite3
37760 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
37770 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79  v);.    notReady
37780 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74   = codeOneLoopSt
37790 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20  art(pWInfo, ii, 
377a0 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70  notReady);.    p
377b0 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
377c0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43   = pLevel->addrC
377d0 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ont;.  }..  /* D
377e0 6f 6e 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  one. */.  return
377f0 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a   pWInfo;..  /* J
37800 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c  ump here if mall
37810 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72  oc fails */.wher
37820 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69  eBeginError:.  i
37830 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20  f( pWInfo ){.   
37840 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
37850 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61  oop = pWInfo->sa
37860 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
37870 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65     whereInfoFree
37880 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
37890 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
378a0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
378b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
378c0 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20  HERE loop.  See 
378d0 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20  comments on .** 
378e0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
378f0 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  n() for addition
37900 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
37910 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
37920 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66  hereEnd(WhereInf
37930 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61  o *pWInfo){.  Pa
37940 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
37950 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
37960 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
37970 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
37980 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  ;.  WhereLevel *
37990 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c  pLevel;.  WhereL
379a0 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72  oop *pLoop;.  Sr
379b0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
379c0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
379d0 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st;.  sqlite3 *d
379e0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
379f0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c  .  /* Generate l
37a00 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  oop termination 
37a10 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  code..  */.  sql
37a20 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
37a30 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
37a40 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  r(i=pWInfo->nLev
37a50 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  el-1; i>=0; i--)
37a60 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  {.    pLevel = &
37a70 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
37a80 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
37a90 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71  ->pWLoop;.    sq
37aa0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
37ab0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
37ac0 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20  >addrCont);.    
37ad0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d  if( pLevel->op!=
37ae0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
37af0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37b00 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  p2(v, pLevel->op
37b10 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
37b20 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20  evel->p2);.     
37b30 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
37b40 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geP5(v, pLevel->
37b50 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  p5);.    }.    i
37b60 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
37b70 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
37b80 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  E && pLevel->u.i
37b90 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20  n.nIn>0 ){.     
37ba0 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
37bb0 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  pIn;.      int j
37bc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
37bd0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
37be0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e  v, pLevel->addrN
37bf0 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  xt);.      for(j
37c00 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  =pLevel->u.in.nI
37c10 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e  n, pIn=&pLevel->
37c20 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31  u.in.aInLoop[j-1
37c30 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e  ]; j>0; j--, pIn
37c40 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  --){.        sql
37c50 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
37c60 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
37c70 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73  op+1);.        s
37c80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
37c90 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  (v, pIn->eEndLoo
37ca0 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20  pOp, pIn->iCur, 
37cb0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b  pIn->addrInTop);
37cc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37cd0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
37ce0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31  pIn->addrInTop-1
37cf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
37d00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
37d10 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
37d20 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a  aInLoop);.    }.
37d30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
37d40 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
37d50 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
37d60 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
37d70 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
37d80 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
37d90 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
37da0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
37db0 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c  OP_IfPos, pLevel
37dc0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
37dd0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
37de0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
37df0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
37e00 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
37e10 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
37e20 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
37e30 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
37e40 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
37e50 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
37e60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
37e70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37e80 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
37e90 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
37ea0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
37eb0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  }.      if( pLoo
37ec0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
37ed0 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
37ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37ef0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
37f00 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69  llRow, pLevel->i
37f10 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d  IdxCur);.      }
37f20 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
37f30 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e  l->op==OP_Return
37f40 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
37f50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
37f60 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65   OP_Gosub, pLeve
37f70 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61  l->p1, pLevel->a
37f80 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
37f90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
37fa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37fb0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
37fc0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
37fd0 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
37fe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
37ff0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
38000 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
38010 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69   The "break" poi
38020 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74  nt is here, just
38030 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
38040 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e   the outer loop.
38050 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20  .  ** Set it..  
38060 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
38070 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
38080 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
38090 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
380a0 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20   of the cursors 
380b0 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64  that were opened
380c0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
380d0 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  Begin..  */.  as
380e0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  sert( pWInfo->nL
380f0 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e  evel<=pTabList->
38100 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d  nSrc );.  for(i=
38110 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
38120 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e  ->a; i<pWInfo->n
38130 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76  Level; i++, pLev
38140 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78  el++){.    Index
38150 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20   *pIdx = 0;.    
38160 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
38170 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20  tem *pTabItem = 
38180 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
38190 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
381a0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
381b0 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
381c0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
381d0 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  =0 );.    pLoop 
381e0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
381f0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
38200 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
38210 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20  phemeral)==0.   
38220 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65    &&