/ Hex Artifact Content
Login

Artifact 9be69c42a02376c46d44907b38edd70f8a2cea7a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 4b 2c 58  e WHERETRACE(K,X
0430: 29 20 20 69 66 28 73 71 6c 69 74 65 33 57 68 65  )  if(sqlite3Whe
0440: 72 65 54 72 61 63 65 26 28 4b 29 29 20 73 71 6c  reTrace&(K)) sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0460: 58 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  X.# define WHERE
0470: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 31 0a  TRACE_ENABLED 1.
0480: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 57  #else.# define W
0490: 48 45 52 45 54 52 41 43 45 28 4b 2c 58 29 0a 23  HERETRACE(K,X).#
04a0: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
04b0: 64 20 72 65 66 65 72 65 6e 63 65 73 0a 2a 2f 0a  d references.*/.
04c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
04d0: 68 65 72 65 43 6c 61 75 73 65 20 57 68 65 72 65  hereClause Where
04e0: 43 6c 61 75 73 65 3b 0a 74 79 70 65 64 65 66 20  Clause;.typedef 
04f0: 73 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b  struct WhereMask
0500: 53 65 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74  Set WhereMaskSet
0510: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
0520: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 57 68 65   WhereOrInfo Whe
0530: 72 65 4f 72 49 6e 66 6f 3b 0a 74 79 70 65 64 65  reOrInfo;.typede
0540: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 41 6e  f struct WhereAn
0550: 64 49 6e 66 6f 20 57 68 65 72 65 41 6e 64 49 6e  dInfo WhereAndIn
0560: 66 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  fo;.typedef stru
0570: 63 74 20 57 68 65 72 65 4c 65 76 65 6c 20 57 68  ct WhereLevel Wh
0580: 65 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65  ereLevel;.typede
0590: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f  f struct WhereLo
05a0: 6f 70 20 57 68 65 72 65 4c 6f 6f 70 3b 0a 74 79  op WhereLoop;.ty
05b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
05c0: 72 65 50 61 74 68 20 57 68 65 72 65 50 61 74 68  rePath WherePath
05d0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
05e0: 20 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65   WhereTerm Where
05f0: 54 65 72 6d 3b 0a 74 79 70 65 64 65 66 20 73 74  Term;.typedef st
0600: 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75  ruct WhereLoopBu
0610: 69 6c 64 65 72 20 57 68 65 72 65 4c 6f 6f 70 42  ilder WhereLoopB
0620: 75 69 6c 64 65 72 3b 0a 74 79 70 65 64 65 66 20  uilder;.typedef 
0630: 73 74 72 75 63 74 20 57 68 65 72 65 53 63 61 6e  struct WhereScan
0640: 20 57 68 65 72 65 53 63 61 6e 3b 0a 74 79 70 65   WhereScan;.type
0650: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0660: 4f 72 43 6f 73 74 20 57 68 65 72 65 4f 72 43 6f  OrCost WhereOrCo
0670: 73 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  st;.typedef stru
0680: 63 74 20 57 68 65 72 65 4f 72 53 65 74 20 57 68  ct WhereOrSet Wh
0690: 65 72 65 4f 72 53 65 74 3b 0a 0a 2f 2a 0a 2a 2a  ereOrSet;../*.**
06a0: 20 43 6f 73 74 20 58 20 69 73 20 74 72 61 63 6b   Cost X is track
06b0: 65 64 20 61 73 20 31 30 2a 6c 6f 67 32 28 58 29  ed as 10*log2(X)
06c0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 31 36 2d   stored in a 16-
06d0: 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20 54 68  bit integer.  Th
06e0: 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 63 6f 73  e.** maximum cos
06f0: 74 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20 74  t for ordinary t
0700: 61 62 6c 65 73 20 69 73 20 36 34 2a 28 32 2a 2a  ables is 64*(2**
0710: 36 33 29 20 77 68 69 63 68 20 62 65 63 6f 6d 65  63) which become
0720: 73 20 36 39 30 30 2e 0a 2a 2a 20 28 56 69 72 74  s 6900..** (Virt
0730: 75 61 6c 20 74 61 62 6c 65 73 20 63 61 6e 20 72  ual tables can r
0740: 65 74 75 72 6e 20 61 20 6c 61 72 67 65 72 20 63  eturn a larger c
0750: 6f 73 74 2c 20 62 75 74 20 6c 65 74 27 73 20 61  ost, but let's a
0760: 73 73 75 6d 65 20 74 68 65 79 20 64 6f 20 6e 6f  ssume they do no
0770: 74 2e 29 0a 2a 2a 20 53 6f 20 61 6c 6c 20 63 6f  t.).** So all co
0780: 73 74 73 20 63 61 6e 20 62 65 20 73 74 6f 72 65  sts can be store
0790: 64 20 69 6e 20 61 20 31 36 2d 62 69 74 20 75 6e  d in a 16-bit un
07a0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 77  signed integer w
07b0: 69 74 68 6f 75 74 20 72 69 73 6b 0a 2a 2a 20 6f  ithout risk.** o
07c0: 66 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2a 0a 2a  f overflow..**.*
07d0: 2a 20 43 6f 73 74 73 20 61 72 65 20 65 73 74 69  * Costs are esti
07e0: 6d 61 74 65 73 2c 20 73 6f 20 6e 6f 20 65 66 66  mates, so no eff
07f0: 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  ort is made to c
0800: 6f 6d 70 75 74 65 20 31 30 2a 6c 6f 67 32 28 58  ompute 10*log2(X
0810: 29 20 65 78 61 63 74 6c 79 2e 0a 2a 2a 20 49 6e  ) exactly..** In
0820: 73 74 65 61 64 2c 20 61 20 63 6c 6f 73 65 20 65  stead, a close e
0830: 73 74 69 6d 61 74 65 20 69 73 20 75 73 65 64 2e  stimate is used.
0840: 20 20 41 6e 79 20 76 61 6c 75 65 20 6f 66 20 58    Any value of X
0850: 3c 3d 31 20 69 73 20 73 74 6f 72 65 64 20 61 73  <=1 is stored as
0860: 20 30 2e 0a 2a 2a 20 58 3d 32 20 69 73 20 31 30   0..** X=2 is 10
0870: 2e 20 20 58 3d 33 20 69 73 20 31 36 2e 20 20 58  .  X=3 is 16.  X
0880: 3d 31 30 30 30 20 69 73 20 39 39 2e 20 65 74 63  =1000 is 99. etc
0890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 6f 6f 6c  ..**.** The tool
08a0: 2f 77 68 65 72 65 63 6f 73 74 74 65 73 74 2e 63  /wherecosttest.c
08b0: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 69 6d 70   source file imp
08c0: 6c 65 6d 65 6e 74 73 20 61 20 63 6f 6d 6d 61 6e  lements a comman
08d0: 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d 0a 2a  d-line program.*
08e0: 2a 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 76  * that will conv
08f0: 65 72 74 20 57 68 65 72 65 43 6f 73 74 73 20 74  ert WhereCosts t
0900: 6f 20 69 6e 74 65 67 65 72 73 2c 20 63 6f 6e 76  o integers, conv
0910: 65 72 74 20 69 6e 74 65 67 65 72 73 20 74 6f 20  ert integers to 
0920: 57 68 65 72 65 43 6f 73 74 73 0a 2a 2a 20 61 6e  WhereCosts.** an
0930: 64 20 64 6f 20 61 64 64 69 74 69 6f 6e 20 61 6e  d do addition an
0940: 64 20 6d 75 6c 74 69 70 6c 69 63 61 74 69 6f 6e  d multiplication
0950: 20 6f 6e 20 57 68 65 72 65 43 6f 73 74 20 76 61   on WhereCost va
0960: 6c 75 65 73 2e 20 20 54 68 65 20 77 68 65 72 65  lues.  The where
0970: 63 6f 73 74 74 65 73 74 0a 2a 2a 20 63 6f 6d 6d  costtest.** comm
0980: 61 6e 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d  and-line program
0990: 20 69 73 20 61 20 75 73 65 66 75 6c 20 75 74 69   is a useful uti
09a0: 6c 69 74 79 20 74 6f 20 68 61 76 65 20 61 72 6f  lity to have aro
09b0: 75 6e 64 20 77 68 65 6e 20 77 6f 72 6b 69 6e 67  und when working
09c0: 20 77 69 74 68 0a 2a 2a 20 74 68 69 73 20 6d 6f   with.** this mo
09d0: 64 75 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  dule..*/.typedef
09e0: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
09f0: 69 6e 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a  int WhereCost;..
0a00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63  /*.** This objec
0a10: 74 20 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72  t contains infor
0a20: 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
0a30: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 73 69 6e   implement a sin
0a40: 67 6c 65 20 6e 65 73 74 65 64 0a 2a 2a 20 6c 6f  gle nested.** lo
0a50: 6f 70 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75  op in WHERE clau
0a60: 73 65 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 74 72 61  se..**.** Contra
0a70: 73 74 20 74 68 69 73 20 6f 62 6a 65 63 74 20 77  st this object w
0a80: 69 74 68 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20  ith WhereLoop.  
0a90: 54 68 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63  This object desc
0aa0: 72 69 62 65 73 20 74 68 65 0a 2a 2a 20 69 6d 70  ribes the.** imp
0ab0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ac0: 68 65 20 6c 6f 6f 70 2e 20 20 57 68 65 72 65 4c  he loop.  WhereL
0ad0: 6f 6f 70 20 64 65 73 63 72 69 62 65 73 20 74 68  oop describes th
0ae0: 65 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 20  e algorithm..** 
0af0: 54 68 69 73 20 6f 62 6a 65 63 74 20 63 6f 6e 74  This object cont
0b00: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
0b10: 6f 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  o the WhereLoop 
0b20: 61 6c 67 6f 72 69 74 68 6d 20 61 73 20 6f 6e 65  algorithm as one
0b30: 20 6f 66 0a 2a 2a 20 69 74 73 20 65 6c 65 6d 65   of.** its eleme
0b40: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 57  nts..**.** The W
0b50: 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  hereInfo object 
0b60: 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c  contains a singl
0b70: 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
0b80: 69 73 20 6f 62 6a 65 63 74 20 66 6f 72 0a 2a 2a  is object for.**
0b90: 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68   each term in th
0ba0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 28 77  e FROM clause (w
0bb0: 68 69 63 68 20 69 73 20 74 6f 20 73 61 79 2c 20  hich is to say, 
0bc0: 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a  for each of the.
0bd0: 2a 2a 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  ** nested loops 
0be0: 61 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29 2e  as implemented).
0bf0: 20 20 54 68 65 20 6f 72 64 65 72 20 6f 66 20 57    The order of W
0c00: 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74  hereLevel object
0c10: 73 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20  s determines.** 
0c20: 74 68 65 20 6c 6f 6f 70 20 6e 65 73 74 65 64 20  the loop nested 
0c30: 6f 72 64 65 72 2c 20 77 69 74 68 20 57 68 65 72  order, with Wher
0c40: 65 49 6e 66 6f 2e 61 5b 30 5d 20 62 65 69 6e 67  eInfo.a[0] being
0c50: 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20   the outer loop 
0c60: 61 6e 64 0a 2a 2a 20 57 68 65 72 65 49 6e 66 6f  and.** WhereInfo
0c70: 2e 61 5b 57 68 65 72 65 49 6e 66 6f 2e 6e 4c 65  .a[WhereInfo.nLe
0c80: 76 65 6c 2d 31 5d 20 62 65 69 6e 67 20 74 68 65  vel-1] being the
0c90: 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 0a 2a 2f 0a   inner loop..*/.
0ca0: 73 74 72 75 63 74 20 57 68 65 72 65 4c 65 76 65  struct WhereLeve
0cb0: 6c 20 7b 0a 20 20 69 6e 74 20 69 4c 65 66 74 4a  l {.  int iLeftJ
0cc0: 6f 69 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  oin;        /* M
0cd0: 65 6d 6f 72 79 20 63 65 6c 6c 20 75 73 65 64 20  emory cell used 
0ce0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 45 46  to implement LEF
0cf0: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 2a 2f 0a  T OUTER JOIN */.
0d00: 20 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20    int iTabCur;  
0d10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
0d20: 44 42 45 20 63 75 72 73 6f 72 20 75 73 65 64 20  DBE cursor used 
0d30: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 74 61  to access the ta
0d40: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ble */.  int iId
0d50: 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f  xCur;          /
0d60: 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
0d70: 72 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  r used to access
0d80: 20 70 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 61   pIdx */.  int a
0d90: 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
0da0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
0db0: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
0dc0: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
0dd0: 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20  addrNxt;        
0de0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
0df0: 6f 20 73 74 61 72 74 20 74 68 65 20 6e 65 78 74  o start the next
0e00: 20 49 4e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20   IN combination 
0e10: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
0e20: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t;         /* Ju
0e30: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
0e40: 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
0e50: 74 20 6c 6f 6f 70 20 63 79 63 6c 65 20 2a 2f 0a  t loop cycle */.
0e60: 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b    int addrFirst;
0e70: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
0e80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20   instruction of 
0e90: 69 6e 74 65 72 69 6f 72 20 6f 66 20 74 68 65 20  interior of the 
0ea0: 6c 6f 6f 70 20 2a 2f 0a 20 20 75 38 20 69 46 72  loop */.  u8 iFr
0eb0: 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  om;             
0ec0: 2f 2a 20 57 68 69 63 68 20 65 6e 74 72 79 20 69  /* Which entry i
0ed0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
0ee0: 65 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 70 35  e */.  u8 op, p5
0ef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0f00: 4f 70 63 6f 64 65 20 61 6e 64 20 50 35 20 6f 66  Opcode and P5 of
0f10: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 68 61 74   the opcode that
0f20: 20 65 6e 64 73 20 74 68 65 20 6c 6f 6f 70 20 2a   ends the loop *
0f30: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 70 32 3b 20  /.  int p1, p2; 
0f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
0f50: 72 61 6e 64 73 20 6f 66 20 74 68 65 20 6f 70 63  rands of the opc
0f60: 6f 64 65 20 75 73 65 64 20 74 6f 20 65 6e 64 73  ode used to ends
0f70: 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75   the loop */.  u
0f80: 6e 69 6f 6e 20 7b 20 20 20 20 20 20 20 20 20 20  nion {          
0f90: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
0fa0: 69 6f 6e 20 74 68 61 74 20 64 65 70 65 6e 64 73  ion that depends
0fb0: 20 6f 6e 20 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c   on pWLoop->wsFl
0fc0: 61 67 73 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ags */.    struc
0fd0: 74 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49  t {.      int nI
0fe0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
0ff0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1000: 72 69 65 73 20 69 6e 20 61 49 6e 4c 6f 6f 70 5b  ries in aInLoop[
1010: 5d 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  ] */.      struc
1020: 74 20 49 6e 4c 6f 6f 70 20 7b 0a 20 20 20 20 20  t InLoop {.     
1030: 20 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20     int iCur;    
1040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1050: 20 56 44 42 45 20 63 75 72 73 6f 72 20 75 73 65   VDBE cursor use
1060: 64 20 62 79 20 74 68 69 73 20 49 4e 20 6f 70 65  d by this IN ope
1070: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
1080: 20 69 6e 74 20 61 64 64 72 49 6e 54 6f 70 3b 20   int addrInTop; 
1090: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
10a0: 66 20 74 68 65 20 49 4e 20 6c 6f 6f 70 20 2a 2f  f the IN loop */
10b0: 0a 20 20 20 20 20 20 20 20 75 38 20 65 45 6e 64  .        u8 eEnd
10c0: 4c 6f 6f 70 4f 70 3b 20 20 20 20 20 20 20 20 20  LoopOp;         
10d0: 2f 2a 20 49 4e 20 4c 6f 6f 70 20 74 65 72 6d 69  /* IN Loop termi
10e0: 6e 61 74 6f 72 2e 20 4f 50 5f 4e 65 78 74 20 6f  nator. OP_Next o
10f0: 72 20 4f 50 5f 50 72 65 76 20 2a 2f 0a 20 20 20  r OP_Prev */.   
1100: 20 20 20 7d 20 2a 61 49 6e 4c 6f 6f 70 3b 20 20     } *aInLoop;  
1110: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
1120: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61  rmation about ea
1130: 63 68 20 6e 65 73 74 65 64 20 49 4e 20 6f 70 65  ch nested IN ope
1140: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 20 69  rator */.    } i
1150: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1160: 20 20 20 2f 2a 20 55 73 65 64 20 77 68 65 6e 20     /* Used when 
1170: 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26  pWLoop->wsFlags&
1180: 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 2a 2f  WHERE_IN_ABLE */
1190: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76  .    Index *pCov
11a0: 69 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  idx;       /* Po
11b0: 73 73 69 62 6c 65 20 63 6f 76 65 72 69 6e 67 20  ssible covering 
11c0: 69 6e 64 65 78 20 66 6f 72 20 57 48 45 52 45 5f  index for WHERE_
11d0: 4d 55 4c 54 49 5f 4f 52 20 2a 2f 0a 20 20 7d 20  MULTI_OR */.  } 
11e0: 75 3b 0a 20 20 73 74 72 75 63 74 20 57 68 65 72  u;.  struct Wher
11f0: 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20  eLoop *pWLoop;  
1200: 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 65 64 20  /* The selected 
1210: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1220: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61   */.};../*.** Ea
1230: 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ch instance of t
1240: 68 69 73 20 6f 62 6a 65 63 74 20 72 65 70 72 65  his object repre
1250: 73 65 6e 74 73 20 61 6e 20 61 6c 67 6f 72 69 74  sents an algorit
1260: 68 6d 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e  hm for evaluatin
1270: 67 20 6f 6e 65 0a 2a 2a 20 74 65 72 6d 20 6f 66  g one.** term of
1280: 20 61 20 6a 6f 69 6e 2e 20 20 45 76 65 72 79 20   a join.  Every 
1290: 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
12a0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 68 61 76   clause will hav
12b0: 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e  e at least.** on
12c0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
12d0: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
12e0: 20 28 75 6e 6c 65 73 73 20 49 4e 44 45 58 45 44   (unless INDEXED
12f0: 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a   BY constraints.
1300: 2a 2a 20 70 72 65 76 65 6e 74 20 61 20 71 75 65  ** prevent a que
1310: 72 79 20 73 6f 6c 75 74 69 6f 6e 20 2d 20 77 68  ry solution - wh
1320: 69 63 68 20 69 73 20 61 6e 20 65 72 72 6f 72 29  ich is an error)
1330: 20 61 6e 64 20 6d 61 6e 79 20 74 65 72 6d 73 20   and many terms 
1340: 6f 66 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  of the.** FROM c
1350: 6c 61 75 73 65 20 77 69 6c 6c 20 68 61 76 65 20  lause will have 
1360: 6d 75 6c 74 69 70 6c 65 20 57 68 65 72 65 4c 6f  multiple WhereLo
1370: 6f 70 20 6f 62 6a 65 63 74 73 2c 20 65 61 63 68  op objects, each
1380: 20 64 65 73 63 72 69 62 69 6e 67 20 61 0a 2a 2a   describing a.**
1390: 20 70 6f 74 65 6e 74 69 61 6c 20 77 61 79 20 6f   potential way o
13a0: 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  f implementing t
13b0: 68 61 74 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  hat FROM-clause 
13c0: 74 65 72 6d 2c 20 74 6f 67 65 74 68 65 72 20 77  term, together w
13d0: 69 74 68 0a 2a 2a 20 64 65 70 65 6e 64 65 6e 63  ith.** dependenc
13e0: 69 65 73 20 61 6e 64 20 63 6f 73 74 20 65 73 74  ies and cost est
13f0: 69 6d 61 74 65 73 20 66 6f 72 20 75 73 69 6e 67  imates for using
1400: 20 74 68 65 20 63 68 6f 73 65 6e 20 61 6c 67 6f   the chosen algo
1410: 72 69 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20 51 75 65  rithm..**.** Que
1420: 72 79 20 70 6c 61 6e 6e 69 6e 67 20 63 6f 6e 73  ry planning cons
1430: 69 73 74 73 20 6f 66 20 62 75 69 6c 64 69 6e 67  ists of building
1440: 20 75 70 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e   up a collection
1450: 20 6f 66 20 74 68 65 73 65 20 57 68 65 72 65 4c   of these WhereL
1460: 6f 6f 70 0a 2a 2a 20 6f 62 6a 65 63 74 73 2c 20  oop.** objects, 
1470: 74 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 61  then computing a
1480: 20 70 61 72 74 69 63 75 6c 61 72 20 73 65 71 75   particular sequ
1490: 65 6e 63 65 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ence of WhereLoo
14a0: 70 20 6f 62 6a 65 63 74 73 2c 20 77 69 74 68 0a  p objects, with.
14b0: 2a 2a 20 6f 6e 65 20 57 68 65 72 65 4c 6f 6f 70  ** one WhereLoop
14c0: 20 6f 62 6a 65 63 74 20 70 65 72 20 46 52 4f 4d   object per FROM
14d0: 20 63 6c 61 75 73 65 20 74 65 72 6d 2c 20 74 68   clause term, th
14e0: 61 74 20 73 61 74 69 73 66 79 20 61 6c 6c 20 64  at satisfy all d
14f0: 65 70 65 6e 64 65 6e 63 69 65 73 0a 2a 2a 20 61  ependencies.** a
1500: 6e 64 20 74 68 61 74 20 6d 69 6e 69 6d 69 7a 65  nd that minimize
1510: 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 63 6f 73   the overall cos
1520: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  t..*/.struct Whe
1530: 72 65 4c 6f 6f 70 20 7b 0a 20 20 42 69 74 6d 61  reLoop {.  Bitma
1540: 73 6b 20 70 72 65 72 65 71 3b 20 20 20 20 20 20  sk prereq;      
1550: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 6f   /* Bitmask of o
1560: 74 68 65 72 20 6c 6f 6f 70 73 20 74 68 61 74 20  ther loops that 
1570: 6d 75 73 74 20 72 75 6e 20 66 69 72 73 74 20 2a  must run first *
1580: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  /.  Bitmask mask
1590: 53 65 6c 66 3b 20 20 20 20 20 2f 2a 20 42 69 74  Self;     /* Bit
15a0: 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e 67  mask identifying
15b0: 20 74 61 62 6c 65 20 69 54 61 62 20 2a 2f 0a 23   table iTab */.#
15c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
15d0: 55 47 0a 20 20 63 68 61 72 20 63 49 64 3b 20 20  UG.  char cId;  
15e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
15f0: 6d 62 6f 6c 69 63 20 49 44 20 6f 66 20 74 68 69  mbolic ID of thi
1600: 73 20 6c 6f 6f 70 20 66 6f 72 20 64 65 62 75 67  s loop for debug
1610: 67 69 6e 67 20 75 73 65 20 2a 2f 0a 23 65 6e 64  ging use */.#end
1620: 69 66 0a 20 20 75 38 20 69 54 61 62 3b 20 20 20  if.  u8 iTab;   
1630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1640: 73 69 74 69 6f 6e 20 69 6e 20 46 52 4f 4d 20 63  sition in FROM c
1650: 6c 61 75 73 65 20 6f 66 20 74 61 62 6c 65 20 66  lause of table f
1660: 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  or this loop */.
1670: 20 20 75 38 20 69 53 6f 72 74 49 64 78 3b 20 20    u8 iSortIdx;  
1680: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 69          /* Sorti
1690: 6e 67 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 2e  ng index number.
16a0: 20 20 30 3d 3d 4e 6f 6e 65 20 2a 2f 0a 20 20 57    0==None */.  W
16b0: 68 65 72 65 43 6f 73 74 20 72 53 65 74 75 70 3b  hereCost rSetup;
16c0: 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65       /* One-time
16d0: 20 73 65 74 75 70 20 63 6f 73 74 20 28 65 78 3a   setup cost (ex:
16e0: 20 63 72 65 61 74 65 20 74 72 61 6e 73 69 65 6e   create transien
16f0: 74 20 69 6e 64 65 78 29 20 2a 2f 0a 20 20 57 68  t index) */.  Wh
1700: 65 72 65 43 6f 73 74 20 72 52 75 6e 3b 20 20 20  ereCost rRun;   
1710: 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 72      /* Cost of r
1720: 75 6e 6e 69 6e 67 20 65 61 63 68 20 6c 6f 6f 70  unning each loop
1730: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
1740: 6e 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 45  nOut;       /* E
1750: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
1760: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a  of output rows *
1770: 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  /.  union {.    
1780: 73 74 72 75 63 74 20 7b 20 20 20 20 20 20 20 20  struct {        
1790: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d         /* Inform
17a0: 61 74 69 6f 6e 20 66 6f 72 20 69 6e 74 65 72 6e  ation for intern
17b0: 61 6c 20 62 74 72 65 65 20 74 61 62 6c 65 73 20  al btree tables 
17c0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71  */.      int nEq
17d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 71 75  /* Number of equ
17f0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1800: 73 20 2a 2f 0a 20 20 20 20 20 20 49 6e 64 65 78  s */.      Index
1810: 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
1820: 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 2c    /* Index used,
1830: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   or NULL */.    
1840: 7d 20 62 74 72 65 65 3b 0a 20 20 20 20 73 74 72  } btree;.    str
1850: 75 63 74 20 7b 20 20 20 20 20 20 20 20 20 20 20  uct {           
1860: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
1870: 6f 6e 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74  on for virtual t
1880: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  ables */.      i
1890: 6e 74 20 69 64 78 4e 75 6d 3b 20 20 20 20 20 20  nt idxNum;      
18a0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e        /* Index n
18b0: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 75  umber */.      u
18c0: 38 20 6e 65 65 64 46 72 65 65 3b 20 20 20 20 20  8 needFree;     
18d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
18e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 69 64   sqlite3_free(id
18f0: 78 53 74 72 29 20 69 73 20 6e 65 65 64 65 64 20  xStr) is needed 
1900: 2a 2f 0a 20 20 20 20 20 20 75 38 20 69 73 4f 72  */.      u8 isOr
1910: 64 65 72 65 64 3b 20 20 20 20 20 20 20 20 20 20  dered;          
1920: 2f 2a 20 54 72 75 65 20 69 66 20 73 61 74 69 73  /* True if satis
1930: 66 69 65 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  fies ORDER BY */
1940: 0a 20 20 20 20 20 20 75 31 36 20 6f 6d 69 74 4d  .      u16 omitM
1950: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ask;          /*
1960: 20 54 65 72 6d 73 20 74 68 61 74 20 6d 61 79 20   Terms that may 
1970: 62 65 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  be omitted */.  
1980: 20 20 20 20 63 68 61 72 20 2a 69 64 78 53 74 72      char *idxStr
1990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
19a0: 64 65 78 20 69 64 65 6e 74 69 66 69 65 72 20 73  dex identifier s
19b0: 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 20 76  tring */.    } v
19c0: 74 61 62 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  tab;.  } u;.  u3
19d0: 32 20 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  2 wsFlags;      
19e0: 20 20 20 20 2f 2a 20 57 48 45 52 45 5f 2a 20 66      /* WHERE_* f
19f0: 6c 61 67 73 20 64 65 73 63 72 69 62 69 6e 67 20  lags describing 
1a00: 74 68 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75 31  the plan */.  u1
1a10: 36 20 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20  6 nLTerm;       
1a20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a30: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 4c 54 65   entries in aLTe
1a40: 72 6d 5b 5d 20 2a 2f 0a 20 20 2f 2a 2a 2a 2a 20  rm[] */.  /**** 
1a50: 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 29 20  whereLoopXfer() 
1a60: 63 6f 70 69 65 73 20 66 69 65 6c 64 73 20 61 62  copies fields ab
1a70: 6f 76 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ove ************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 20 64  ***********/.# d
1a90: 65 66 69 6e 65 20 57 48 45 52 45 5f 4c 4f 4f 50  efine WHERE_LOOP
1aa0: 5f 58 46 45 52 5f 53 5a 20 6f 66 66 73 65 74 6f  _XFER_SZ offseto
1ab0: 66 28 57 68 65 72 65 4c 6f 6f 70 2c 6e 4c 53 6c  f(WhereLoop,nLSl
1ac0: 6f 74 29 0a 20 20 75 31 36 20 6e 4c 53 6c 6f 74  ot).  u16 nLSlot
1ad0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1ae0: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 61  umber of slots a
1af0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4c 54  llocated for aLT
1b00: 65 72 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  erm[] */.  Where
1b10: 54 65 72 6d 20 2a 2a 61 4c 54 65 72 6d 3b 20 20  Term **aLTerm;  
1b20: 20 2f 2a 20 57 68 65 72 65 54 65 72 6d 73 20 75   /* WhereTerms u
1b30: 73 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  sed */.  WhereLo
1b40: 6f 70 20 2a 70 4e 65 78 74 4c 6f 6f 70 3b 20 2f  op *pNextLoop; /
1b50: 2a 20 4e 65 78 74 20 57 68 65 72 65 4c 6f 6f 70  * Next WhereLoop
1b60: 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 57   object in the W
1b70: 68 65 72 65 43 6c 61 75 73 65 20 2a 2f 0a 20 20  hereClause */.  
1b80: 57 68 65 72 65 54 65 72 6d 20 2a 61 4c 54 65 72  WhereTerm *aLTer
1b90: 6d 53 70 61 63 65 5b 34 5d 3b 20 20 2f 2a 20 49  mSpace[4];  /* I
1ba0: 6e 69 74 69 61 6c 20 61 4c 54 65 72 6d 5b 5d 20  nitial aLTerm[] 
1bb0: 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  space */.};../* 
1bc0: 54 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64  This object hold
1bd0: 73 20 74 68 65 20 70 72 65 72 65 71 75 69 73 69  s the prerequisi
1be0: 74 65 73 20 61 6e 64 20 74 68 65 20 63 6f 73 74  tes and the cost
1bf0: 20 6f 66 20 72 75 6e 6e 69 6e 67 20 61 0a 2a 2a   of running a.**
1c00: 20 73 75 62 71 75 65 72 79 20 6f 6e 20 6f 6e 65   subquery on one
1c10: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 4f   operand of an O
1c20: 52 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 74 68  R operator in th
1c30: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
1c40: 2a 2a 20 53 65 65 20 57 68 65 72 65 4f 72 53 65  ** See WhereOrSe
1c50: 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  t for additional
1c60: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 2a 2f   information .*/
1c70: 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 43  .struct WhereOrC
1c80: 6f 73 74 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20  ost {.  Bitmask 
1c90: 70 72 65 72 65 71 3b 20 20 20 20 20 2f 2a 20 50  prereq;     /* P
1ca0: 72 65 72 65 71 75 69 73 69 74 65 73 20 2a 2f 0a  rerequisites */.
1cb0: 20 20 57 68 65 72 65 43 6f 73 74 20 72 52 75 6e    WhereCost rRun
1cc0: 3b 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66  ;     /* Cost of
1cd0: 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 73 75   running this su
1ce0: 62 71 75 65 72 79 20 2a 2f 0a 20 20 57 68 65 72  bquery */.  Wher
1cf0: 65 43 6f 73 74 20 6e 4f 75 74 3b 20 20 20 20 20  eCost nOut;     
1d00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
1d10: 70 75 74 73 20 66 6f 72 20 74 68 69 73 20 73 75  puts for this su
1d20: 62 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bquery */.};../*
1d30: 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74 20   The WhereOrSet 
1d40: 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20 61 20 73  object holds a s
1d50: 65 74 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57  et of possible W
1d60: 68 65 72 65 4f 72 43 6f 73 74 73 20 74 68 61 74  hereOrCosts that
1d70: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  .** correspond t
1d80: 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 28 73  o the subquery(s
1d90: 29 20 6f 66 20 4f 52 2d 63 6c 61 75 73 65 20 70  ) of OR-clause p
1da0: 72 6f 63 65 73 73 69 6e 67 2e 20 20 4f 6e 6c 79  rocessing.  Only
1db0: 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 4e 5f 4f   the.** best N_O
1dc0: 52 5f 43 4f 53 54 20 65 6c 65 6d 65 6e 74 73 20  R_COST elements 
1dd0: 61 72 65 20 72 65 74 61 69 6e 65 64 2e 0a 2a 2f  are retained..*/
1de0: 0a 23 64 65 66 69 6e 65 20 4e 5f 4f 52 5f 43 4f  .#define N_OR_CO
1df0: 53 54 20 33 0a 73 74 72 75 63 74 20 57 68 65 72  ST 3.struct Wher
1e00: 65 4f 72 53 65 74 20 7b 0a 20 20 75 31 36 20 6e  eOrSet {.  u16 n
1e10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e30: 20 6f 66 20 76 61 6c 69 64 20 61 5b 5d 20 65 6e   of valid a[] en
1e40: 74 72 69 65 73 20 2a 2f 0a 20 20 57 68 65 72 65  tries */.  Where
1e50: 4f 72 43 6f 73 74 20 61 5b 4e 5f 4f 52 5f 43 4f  OrCost a[N_OR_CO
1e60: 53 54 5d 3b 20 20 20 2f 2a 20 53 65 74 20 6f 66  ST];   /* Set of
1e70: 20 62 65 73 74 20 63 6f 73 74 73 20 2a 2f 0a 7d   best costs */.}
1e80: 3b 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  ;.../* Forward d
1e90: 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6d 65  eclaration of me
1ea0: 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  thods */.static 
1eb0: 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  int whereLoopRes
1ec0: 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c 20 57 68  ize(sqlite3*, Wh
1ed0: 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74 29 3b 0a  ereLoop*, int);.
1ee0: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  ./*.** Each inst
1ef0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
1f00: 65 63 74 20 68 6f 6c 64 73 20 61 20 73 65 71 75  ect holds a sequ
1f10: 65 6e 63 65 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ence of WhereLoo
1f20: 70 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 74 68 61  p objects.** tha
1f30: 74 20 69 6d 70 6c 65 6d 65 6e 74 20 73 6f 6d 65  t implement some
1f40: 20 6f 72 20 61 6c 6c 20 6f 66 20 61 20 71 75 65   or all of a que
1f50: 72 79 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ry plan..**.** T
1f60: 68 69 6e 6b 20 6f 66 20 65 61 63 68 20 57 68 65  hink of each Whe
1f70: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 61 73  reLoop object as
1f80: 20 61 20 6e 6f 64 65 20 69 6e 20 61 20 67 72 61   a node in a gra
1f90: 70 68 20 77 69 74 68 20 61 72 63 73 0a 2a 2a 20  ph with arcs.** 
1fa0: 73 68 6f 77 69 6e 67 20 64 65 70 65 6e 64 65 6e  showing dependen
1fb0: 63 65 73 20 61 6e 64 20 63 6f 73 74 73 20 66 6f  ces and costs fo
1fc0: 72 20 74 72 61 76 65 6c 6c 69 6e 67 20 62 65 74  r travelling bet
1fd0: 77 65 65 6e 20 6e 6f 64 65 73 2e 20 20 28 54 68  ween nodes.  (Th
1fe0: 61 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 20 63  at is.** not a c
1ff0: 6f 6d 70 6c 65 74 65 6c 79 20 61 63 63 75 72 61  ompletely accura
2000: 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62  te description b
2010: 65 63 61 75 73 65 20 57 68 65 72 65 4c 6f 6f 70  ecause WhereLoop
2020: 20 63 6f 73 74 73 20 61 72 65 20 61 0a 2a 2a 20   costs are a.** 
2030: 76 65 63 74 6f 72 2c 20 6e 6f 74 20 61 20 73 63  vector, not a sc
2040: 61 6c 61 72 2c 20 61 6e 64 20 62 65 63 61 75 73  alar, and becaus
2050: 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20 61 72  e dependences ar
2060: 65 20 6d 61 6e 79 2d 74 6f 2d 6f 6e 65 2c 20 6e  e many-to-one, n
2070: 6f 74 0a 2a 2a 20 6f 6e 65 2d 74 6f 2d 6f 6e 65  ot.** one-to-one
2080: 20 61 73 20 61 72 65 20 67 72 61 70 68 20 6e 6f   as are graph no
2090: 64 65 73 2e 20 20 42 75 74 20 69 74 20 69 73 20  des.  But it is 
20a0: 61 20 75 73 65 66 75 6c 20 76 69 73 75 61 6c 69  a useful visuali
20b0: 7a 61 74 69 6f 6e 20 61 69 64 2e 29 0a 2a 2a 20  zation aid.).** 
20c0: 54 68 65 6e 20 61 20 57 68 65 72 65 50 61 74 68  Then a WherePath
20d0: 20 6f 62 6a 65 63 74 20 69 73 20 61 20 70 61 74   object is a pat
20e0: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 67 72  h through the gr
20f0: 61 70 68 20 74 68 61 74 20 76 69 73 69 74 73 20  aph that visits 
2100: 73 6f 6d 65 0a 2a 2a 20 6f 72 20 61 6c 6c 20 6f  some.** or all o
2110: 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
2120: 6f 62 6a 65 63 74 73 20 6f 6e 63 65 2e 0a 2a 2a  objects once..**
2130: 0a 2a 2a 20 54 68 65 20 22 73 6f 6c 76 65 72 22  .** The "solver"
2140: 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69   works by creati
2150: 6e 67 20 74 68 65 20 4e 20 62 65 73 74 20 57 68  ng the N best Wh
2160: 65 72 65 50 61 74 68 20 6f 62 6a 65 63 74 73 20  erePath objects 
2170: 6f 66 20 6c 65 6e 67 74 68 0a 2a 2a 20 31 2e 20  of length.** 1. 
2180: 20 54 68 65 6e 20 75 73 69 6e 67 20 74 68 6f 73   Then using thos
2190: 65 20 61 73 20 61 20 62 61 73 69 73 20 74 6f 20  e as a basis to 
21a0: 63 6f 6d 70 75 74 65 20 74 68 65 20 4e 20 62 65  compute the N be
21b0: 73 74 20 57 68 65 72 65 50 61 74 68 20 6f 62 6a  st WherePath obj
21c0: 65 63 74 73 0a 2a 2a 20 6f 66 20 6c 65 6e 67 74  ects.** of lengt
21d0: 68 20 32 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  h 2.  And so for
21e0: 74 68 20 75 6e 74 69 6c 20 74 68 65 20 6c 65 6e  th until the len
21f0: 67 74 68 20 6f 66 20 57 68 65 72 65 50 61 74 68  gth of WherePath
2200: 73 20 65 71 75 61 6c 73 20 74 68 65 0a 2a 2a 20  s equals the.** 
2210: 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 64 65 73 20  number of nodes 
2220: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2230: 73 65 2e 20 20 54 68 65 20 62 65 73 74 20 28 6c  se.  The best (l
2240: 6f 77 65 73 74 20 63 6f 73 74 29 20 57 68 65 72  owest cost) Wher
2250: 65 50 61 74 68 0a 2a 2a 20 61 74 20 74 68 65 20  ePath.** at the 
2260: 65 6e 64 20 69 73 20 74 68 65 20 63 68 6f 6f 73  end is the choos
2270: 65 6e 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a  en query plan..*
2280: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 50 61  /.struct WherePa
2290: 74 68 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  th {.  Bitmask m
22a0: 61 73 6b 4c 6f 6f 70 3b 20 20 20 20 20 2f 2a 20  askLoop;     /* 
22b0: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 57  Bitmask of all W
22c0: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
22d0: 20 69 6e 20 74 68 69 73 20 70 61 74 68 20 2a 2f   in this path */
22e0: 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4c 6f  .  Bitmask revLo
22f0: 6f 70 3b 20 20 20 20 20 20 2f 2a 20 61 4c 6f 6f  op;      /* aLoo
2300: 70 5b 5d 73 20 74 68 61 74 20 73 68 6f 75 6c 64  p[]s that should
2310: 20 62 65 20 72 65 76 65 72 73 65 64 20 66 6f 72   be reversed for
2320: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 57   ORDER BY */.  W
2330: 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 3b 20 20  hereCost nRow;  
2340: 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65       /* Estimate
2350: 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
2360: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
2370: 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 57 68 65  is path */.  Whe
2380: 72 65 43 6f 73 74 20 72 43 6f 73 74 3b 20 20 20  reCost rCost;   
2390: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 6f 73 74     /* Total cost
23a0: 20 6f 66 20 74 68 69 73 20 70 61 74 68 20 2a 2f   of this path */
23b0: 0a 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 3b  .  u8 isOrdered;
23c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
23d0: 20 69 66 20 74 68 69 73 20 70 61 74 68 20 73 61   if this path sa
23e0: 74 69 73 66 69 65 73 20 4f 52 44 45 52 20 42 59  tisfies ORDER BY
23f0: 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72   */.  u8 isOrder
2400: 65 64 56 61 6c 69 64 3b 20 20 20 20 2f 2a 20 54  edValid;    /* T
2410: 72 75 65 20 69 66 20 74 68 65 20 69 73 4f 72 64  rue if the isOrd
2420: 65 72 65 64 20 66 69 65 6c 64 20 69 73 20 76 61  ered field is va
2430: 6c 69 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  lid */.  WhereLo
2440: 6f 70 20 2a 2a 61 4c 6f 6f 70 3b 20 20 20 20 2f  op **aLoop;    /
2450: 2a 20 41 72 72 61 79 20 6f 66 20 57 68 65 72 65  * Array of Where
2460: 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 6d 70  Loop objects imp
2470: 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 70  lementing this p
2480: 61 74 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ath */.};../*.**
2490: 20 54 68 65 20 71 75 65 72 79 20 67 65 6e 65 72   The query gener
24a0: 61 74 6f 72 20 75 73 65 73 20 61 6e 20 61 72 72  ator uses an arr
24b0: 61 79 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20  ay of instances 
24c0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
24d0: 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69 74 20  e to.** help it 
24e0: 61 6e 61 6c 79 7a 65 20 74 68 65 20 73 75 62 65  analyze the sube
24f0: 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
2500: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
2510: 20 45 61 63 68 20 57 48 45 52 45 0a 2a 2a 20 63   Each WHERE.** c
2520: 6c 61 75 73 65 20 73 75 62 65 78 70 72 65 73 73  lause subexpress
2530: 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
2540: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
2550: 20 62 79 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   by AND operator
2560: 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c 79 2c 20 6f  s,.** usually, o
2570: 72 20 73 6f 6d 65 74 69 6d 65 73 20 73 75 62 65  r sometimes sube
2580: 78 70 72 65 73 73 69 6f 6e 73 20 73 65 70 61 72  xpressions separ
2590: 61 74 65 64 20 62 79 20 4f 52 2e 0a 2a 2a 0a 2a  ated by OR..**.*
25a0: 2a 20 41 6c 6c 20 57 68 65 72 65 54 65 72 6d 73  * All WhereTerms
25b0: 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 69   are collected i
25c0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65  nto a single Whe
25d0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
25e0: 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20 66 6f 6c  re.  .** The fol
25f0: 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69 74 79 20  lowing identity 
2600: 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  holds:.**.**    
2610: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 70 57      WhereTerm.pW
2620: 43 2d 3e 61 5b 57 68 65 72 65 54 65 72 6d 2e 69  C->a[WhereTerm.i
2630: 64 78 5d 20 3d 3d 20 57 68 65 72 65 54 65 72 6d  dx] == WhereTerm
2640: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 74 65  .**.** When a te
2650: 72 6d 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  rm is of the for
2660: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  m:.**.**        
2670: 20 20 20 20 20 20 58 20 3c 6f 70 3e 20 3c 65 78        X <op> <ex
2680: 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  pr>.**.** where 
2690: 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61  X is a column na
26a0: 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  me and <op> is o
26b0: 6e 65 20 6f 66 20 63 65 72 74 61 69 6e 20 6f 70  ne of certain op
26c0: 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74 68 65 6e  erators,.** then
26d0: 20 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43   WhereTerm.leftC
26e0: 75 72 73 6f 72 20 61 6e 64 20 57 68 65 72 65 54  ursor and WhereT
26f0: 65 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  erm.u.leftColumn
2700: 20 72 65 63 6f 72 64 20 74 68 65 0a 2a 2a 20 63   record the.** c
2710: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 61 6e 64  ursor number and
2720: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 66   column number f
2730: 6f 72 20 58 2e 20 20 57 68 65 72 65 54 65 72 6d  or X.  WhereTerm
2740: 2e 65 4f 70 65 72 61 74 6f 72 20 72 65 63 6f 72  .eOperator recor
2750: 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e 20 75  ds.** the <op> u
2760: 73 69 6e 67 20 61 20 62 69 74 6d 61 73 6b 20 65  sing a bitmask e
2770: 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e 65 64 20  ncoding defined 
2780: 62 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f 77 2e  by WO_xxx below.
2790: 20 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f 66 20    The.** use of 
27a0: 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69  a bitmask encodi
27b0: 6e 67 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  ng for the opera
27c0: 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f  tor allows us to
27d0: 20 73 65 61 72 63 68 0a 2a 2a 20 71 75 69 63 6b   search.** quick
27e0: 6c 79 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61  ly for terms tha
27f0: 74 20 6d 61 74 63 68 20 61 6e 79 20 6f 66 20 73  t match any of s
2800: 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74  everal different
2810: 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a   operators..**.*
2820: 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 6d 69  * A WhereTerm mi
2830: 67 68 74 20 61 6c 73 6f 20 62 65 20 74 77 6f 20  ght also be two 
2840: 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73  or more subterms
2850: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
2870: 28 74 31 2e 58 20 3c 6f 70 3e 20 3c 65 78 70 72  (t1.X <op> <expr
2880: 3e 29 20 4f 52 20 28 74 31 2e 59 20 3c 6f 70 3e  >) OR (t1.Y <op>
2890: 20 3c 65 78 70 72 3e 29 20 4f 52 20 2e 2e 2e 2e   <expr>) OR ....
28a0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 73  .**.** In this s
28b0: 65 63 6f 6e 64 20 63 61 73 65 2c 20 77 74 46 6c  econd case, wtFl
28c0: 61 67 20 68 61 73 20 74 68 65 20 54 45 52 4d 5f  ag has the TERM_
28d0: 4f 52 49 4e 46 4f 20 62 69 74 20 73 65 74 20 61  ORINFO bit set a
28e0: 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  nd eOperator==WO
28f0: 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57  _OR.** and the W
2900: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
2910: 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20  fo field points 
2920: 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  to auxiliary inf
2930: 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  ormation that.**
2940: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62   is collected ab
2950: 6f 75 74 20 74 68 65 20 4f 52 20 63 6c 61 75 73  out the OR claus
2960: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 65  e..**.** If a te
2970: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
2980: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20  clause does not 
2990: 6d 61 74 63 68 20 65 69 74 68 65 72 20 6f 66 20  match either of 
29a0: 74 68 65 20 74 77 6f 20 70 72 65 76 69 6f 75 73  the two previous
29b0: 0a 2a 2a 20 63 61 74 65 67 6f 72 69 65 73 2c 20  .** categories, 
29c0: 74 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 3d 3d  then eOperator==
29d0: 30 2e 20 20 54 68 65 20 57 68 65 72 65 54 65 72  0.  The WhereTer
29e0: 6d 2e 70 45 78 70 72 20 66 69 65 6c 64 20 69 73  m.pExpr field is
29f0: 20 73 74 69 6c 6c 20 73 65 74 0a 2a 2a 20 74 6f   still set.** to
2a00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 75   the original su
2a10: 62 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74  bexpression cont
2a20: 65 6e 74 20 61 6e 64 20 77 74 46 6c 61 67 73 20  ent and wtFlags 
2a30: 69 73 20 73 65 74 20 75 70 20 61 70 70 72 6f 70  is set up approp
2a40: 72 69 61 74 65 6c 79 0a 2a 2a 20 62 75 74 20 6e  riately.** but n
2a50: 6f 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 69  o other fields i
2a60: 6e 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 20  n the WhereTerm 
2a70: 6f 62 6a 65 63 74 20 61 72 65 20 6d 65 61 6e 69  object are meani
2a80: 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ngful..**.** Whe
2a90: 6e 20 65 4f 70 65 72 61 74 6f 72 21 3d 30 2c 20  n eOperator!=0, 
2aa0: 70 72 65 72 65 71 52 69 67 68 74 20 61 6e 64 20  prereqRight and 
2ab0: 70 72 65 72 65 71 41 6c 6c 20 72 65 63 6f 72 64  prereqAll record
2ac0: 20 73 65 74 73 20 6f 66 20 63 75 72 73 6f 72 20   sets of cursor 
2ad0: 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62 75 74 20  numbers,.** but 
2ae0: 74 68 65 79 20 64 6f 20 73 6f 20 69 6e 64 69 72  they do so indir
2af0: 65 63 74 6c 79 2e 20 20 41 20 73 69 6e 67 6c 65  ectly.  A single
2b00: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
2b10: 72 75 63 74 75 72 65 20 74 72 61 6e 73 6c 61 74  ructure translat
2b20: 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  es.** cursor num
2b30: 62 65 72 20 69 6e 74 6f 20 62 69 74 73 20 61 6e  ber into bits an
2b40: 64 20 74 68 65 20 74 72 61 6e 73 6c 61 74 65 64  d the translated
2b50: 20 62 69 74 20 69 73 20 73 74 6f 72 65 64 20 69   bit is stored i
2b60: 6e 20 74 68 65 20 70 72 65 72 65 71 0a 2a 2a 20  n the prereq.** 
2b70: 66 69 65 6c 64 73 2e 20 20 54 68 65 20 74 72 61  fields.  The tra
2b80: 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75 73 65 64  nslation is used
2b90: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 78   in order to max
2ba0: 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62 65 72  imize the number
2bb0: 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74 68 61 74   of.** bits that
2bc0: 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 61 20 42   will fit in a B
2bd0: 69 74 6d 61 73 6b 2e 20 20 54 68 65 20 56 44 42  itmask.  The VDB
2be0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
2bf0: 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 73 70 72   might be.** spr
2c00: 65 61 64 20 6f 75 74 20 6f 76 65 72 20 74 68 65  ead out over the
2c10: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
2c20: 74 65 67 65 72 73 2e 20 20 46 6f 72 20 65 78 61  tegers.  For exa
2c30: 6d 70 6c 65 2c 20 74 68 65 20 63 75 72 73 6f 72  mple, the cursor
2c40: 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d 69 67 68  .** numbers migh
2c50: 74 20 62 65 20 33 2c 20 38 2c 20 39 2c 20 31 30  t be 3, 8, 9, 10
2c60: 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c 20 61 6e  , 20, 23, 41, an
2c70: 64 20 34 35 2e 20 20 54 68 65 20 57 68 65 72 65  d 45.  The Where
2c80: 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61 6e 73  MaskSet.** trans
2c90: 6c 61 74 65 73 20 74 68 65 73 65 20 73 70 61 72  lates these spar
2ca0: 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  se cursor number
2cb0: 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69  s into consecuti
2cc0: 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 62  ve integers.** b
2cd0: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 20  eginning with 0 
2ce0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
2cf0: 20 74 68 65 20 62 65 73 74 20 70 6f 73 73 69 62   the best possib
2d00: 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20 61 76  le use of the av
2d10: 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74 73 20  ailable.** bits 
2d20: 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b 2e 20  in the Bitmask. 
2d30: 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78 61 6d   So, in the exam
2d40: 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 63  ple above, the c
2d50: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a 2a 2a  ursor numbers.**
2d60: 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64   would be mapped
2d70: 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73 20 30   into integers 0
2d80: 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2a 0a 2a   through 7..**.*
2d90: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2da0: 74 65 72 6d 73 20 69 6e 20 61 20 6a 6f 69 6e 20  terms in a join 
2db0: 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
2dc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
2dd0: 0a 2a 2a 20 69 6e 20 70 72 65 72 65 71 52 69 67  .** in prereqRig
2de0: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
2df0: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
2e00: 73 20 36 34 20 62 69 74 73 2c 20 68 65 6e 63 65  s 64 bits, hence
2e10: 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6f 6e   SQLite.** is on
2e20: 6c 79 20 61 62 6c 65 20 74 6f 20 70 72 6f 63 65  ly able to proce
2e30: 73 73 20 6a 6f 69 6e 73 20 77 69 74 68 20 36 34  ss joins with 64
2e40: 20 6f 72 20 66 65 77 65 72 20 74 61 62 6c 65 73   or fewer tables
2e50: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
2e60: 65 54 65 72 6d 20 7b 0a 20 20 45 78 70 72 20 2a  eTerm {.  Expr *
2e70: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
2e80: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2e90: 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
2ea0: 6e 20 74 68 61 74 20 69 73 20 74 68 69 73 20 74  n that is this t
2eb0: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  erm */.  int iPa
2ec0: 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
2ed0: 20 2f 2a 20 44 69 73 61 62 6c 65 20 70 57 43 2d   /* Disable pWC-
2ee0: 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77 68 65 6e  >a[iParent] when
2ef0: 20 74 68 69 73 20 74 65 72 6d 20 64 69 73 61 62   this term disab
2f00: 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 66  led */.  int lef
2f10: 74 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  tCursor;        
2f20: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
2f30: 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70  r of X in "X <op
2f40: 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 75  > <expr>" */.  u
2f50: 6e 69 6f 6e 20 7b 0a 20 20 20 20 69 6e 74 20 6c  nion {.    int l
2f60: 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  eftColumn;      
2f70: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
2f80: 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c  ber of X in "X <
2f90: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20  op> <expr>" */. 
2fa0: 20 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a     WhereOrInfo *
2fb0: 70 4f 72 49 6e 66 6f 3b 20 20 20 2f 2a 20 45 78  pOrInfo;   /* Ex
2fc0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
2fd0: 69 66 20 28 65 4f 70 65 72 61 74 6f 72 20 26 20  if (eOperator & 
2fe0: 57 4f 5f 4f 52 29 21 3d 30 20 2a 2f 0a 20 20 20  WO_OR)!=0 */.   
2ff0: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
3000: 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78 74 72  AndInfo; /* Extr
3010: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66  a information if
3020: 20 28 65 4f 70 65 72 61 74 6f 72 26 20 57 4f 5f   (eOperator& WO_
3030: 41 4e 44 29 21 3d 30 20 2a 2f 0a 20 20 7d 20 75  AND)!=0 */.  } u
3040: 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f  ;.  u16 eOperato
3050: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  r;          /* A
3060: 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73   WO_xx value des
3070: 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a  cribing <op> */.
3080: 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20    u8 wtFlags;   
3090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52            /* TER
30a0: 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e  M_xxx bit flags.
30b0: 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20    See below */. 
30c0: 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20   u8 nChild;     
30d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30e0: 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74  er of children t
30f0: 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65  hat must disable
3100: 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c   us */.  WhereCl
3110: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
3120: 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74   /* The clause t
3130: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
3140: 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b   of */.  Bitmask
3150: 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20 20   prereqRight;   
3160: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
3170: 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70 45  ables used by pE
3180: 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20  xpr->pRight */. 
3190: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
31a0: 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  ll;      /* Bitm
31b0: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65  ask of tables re
31c0: 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78 70  ferenced by pExp
31d0: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  r */.};../*.** A
31e0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
31f0: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
3200: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  gs.*/.#define TE
3210: 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78  RM_DYNAMIC    0x
3220: 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  01   /* Need to 
3230: 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  call sqlite3Expr
3240: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
3250: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
3260: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
3270: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
3280: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
3290: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
32a0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
32b0: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
32c0: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
32d0: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
32e0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
32f0: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
3300: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
3310: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49  #define TERM_ORI
3320: 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f  NFO     0x10   /
3330: 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74  * Need to free t
3340: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
3350: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  OrInfo object */
3360: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e  .#define TERM_AN
3370: 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20  DINFO    0x20   
3380: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
3390: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
33a0: 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a  pAndInfo obj */.
33b0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
33c0: 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20 2f  OK      0x40   /
33d0: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
33e0: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
33f0: 6e 67 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  ng */.#if define
3400: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
3410: 53 54 41 54 34 29 20 7c 7c 20 64 65 66 69 6e 65  STAT4) || define
3420: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
3430: 53 54 41 54 33 29 0a 23 20 20 64 65 66 69 6e 65  STAT3).#  define
3440: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20 20 20 30   TERM_VNULL    0
3450: 78 38 30 20 20 20 2f 2a 20 4d 61 6e 75 66 61 63  x80   /* Manufac
3460: 74 75 72 65 64 20 78 3e 4e 55 4c 4c 20 6f 72 20  tured x>NULL or 
3470: 78 3c 3d 4e 55 4c 4c 20 74 65 72 6d 20 2a 2f 0a  x<=NULL term */.
3480: 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
3490: 54 45 52 4d 5f 56 4e 55 4c 4c 20 20 20 20 30 78  TERM_VNULL    0x
34a0: 30 30 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 64  00   /* Disabled
34b0: 20 69 66 20 6e 6f 74 20 75 73 69 6e 67 20 73 74   if not using st
34c0: 61 74 33 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  at3 */.#endif../
34d0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
34e0: 20 6f 66 20 74 68 65 20 57 68 65 72 65 53 63 61   of the WhereSca
34f0: 6e 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65 64  n object is used
3500: 20 61 73 20 61 6e 20 69 74 65 72 61 74 6f 72 20   as an iterator 
3510: 66 6f 72 20 6c 6f 63 61 74 69 6e 67 0a 2a 2a 20  for locating.** 
3520: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
3530: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 61  RE clause that a
3540: 72 65 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65  re useful to the
3550: 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a   query planner..
3560: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 53  */.struct WhereS
3570: 63 61 6e 20 7b 0a 20 20 57 68 65 72 65 43 6c 61  can {.  WhereCla
3580: 75 73 65 20 2a 70 4f 72 69 67 57 43 3b 20 20 20  use *pOrigWC;   
3590: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 2c 20     /* Original, 
35a0: 69 6e 6e 65 72 6d 6f 73 74 20 57 68 65 72 65 43  innermost WhereC
35b0: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
35c0: 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
35d0: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 43 6c        /* WhereCl
35e0: 61 75 73 65 20 63 75 72 72 65 6e 74 6c 79 20 62  ause currently b
35f0: 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  eing scanned */.
3600: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 4e 61 6d    char *zCollNam
3610: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3620: 52 65 71 75 69 72 65 64 20 63 6f 6c 6c 61 74 69  Required collati
3630: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 69 66 20  ng sequence, if 
3640: 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68  not NULL */.  ch
3650: 61 72 20 69 64 78 61 66 66 3b 20 20 20 20 20 20  ar idxaff;      
3660: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
3670: 20 6d 61 74 63 68 20 74 68 69 73 20 61 66 66 69   match this affi
3680: 6e 69 74 79 2c 20 69 66 20 7a 43 6f 6c 6c 4e 61  nity, if zCollNa
3690: 6d 65 21 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 75 6e  me!=NULL */.  un
36a0: 73 69 67 6e 65 64 20 63 68 61 72 20 6e 45 71 75  signed char nEqu
36b0: 69 76 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  iv;      /* Numb
36c0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
36d0: 20 61 45 71 75 69 76 5b 5d 20 2a 2f 0a 20 20 75   aEquiv[] */.  u
36e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 45 71  nsigned char iEq
36f0: 75 69 76 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78  uiv;      /* Nex
3700: 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 6e  t unused slot in
3710: 20 61 45 71 75 69 76 5b 5d 20 2a 2f 0a 20 20 75   aEquiv[] */.  u
3720: 33 32 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  32 opMask;      
3730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63            /* Acc
3740: 65 70 74 61 62 6c 65 20 6f 70 65 72 61 74 6f 72  eptable operator
3750: 73 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20  s */.  int k;   
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3770: 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 63 61 6e    /* Resume scan
3780: 6e 69 6e 67 20 61 74 20 74 68 69 73 2d 3e 70 57  ning at this->pW
3790: 43 2d 3e 61 5b 74 68 69 73 2d 3e 6b 5d 20 2a 2f  C->a[this->k] */
37a0: 0a 20 20 69 6e 74 20 61 45 71 75 69 76 5b 32 32  .  int aEquiv[22
37b0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
37c0: 20 43 75 72 73 6f 72 2c 43 6f 6c 75 6d 6e 20 70   Cursor,Column p
37d0: 61 69 72 73 20 66 6f 72 20 65 71 75 69 76 61 6c  airs for equival
37e0: 65 6e 63 65 20 63 6c 61 73 73 65 73 20 2a 2f 0a  ence classes */.
37f0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
3800: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
3810: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
3820: 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72   holds all infor
3830: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a  mation about a.*
3840: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  * WHERE clause. 
3850: 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20   Mostly this is 
3860: 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20  a container for 
3870: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72  one or more Wher
3880: 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 45 78  eTerms..**.** Ex
3890: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 70 4f 75  planation of pOu
38a0: 74 65 72 3a 20 20 46 6f 72 20 61 20 57 48 45 52  ter:  For a WHER
38b0: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
38c0: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
38d0: 20 20 20 20 20 61 20 41 4e 44 20 28 28 62 20 41       a AND ((b A
38e0: 4e 44 20 63 29 20 4f 52 20 28 64 20 41 4e 44 20  ND c) OR (d AND 
38f0: 65 29 29 20 41 4e 44 20 66 0a 2a 2a 0a 2a 2a 20  e)) AND f.**.** 
3900: 54 68 65 72 65 20 61 72 65 20 73 65 70 61 72 61  There are separa
3910: 74 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  te WhereClause o
3920: 62 6a 65 63 74 73 20 66 6f 72 20 74 68 65 20 77  bjects for the w
3930: 68 6f 6c 65 20 63 6c 61 75 73 65 20 61 6e 64 20  hole clause and 
3940: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 75 62 63 6c  for.** the subcl
3950: 61 75 73 65 73 20 22 28 62 20 41 4e 44 20 63 29  auses "(b AND c)
3960: 22 20 61 6e 64 20 22 28 64 20 41 4e 44 20 65 29  " and "(d AND e)
3970: 22 2e 20 20 54 68 65 20 70 4f 75 74 65 72 20 66  ".  The pOuter f
3980: 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a 2a 20 73  ield of the.** s
3990: 75 62 63 6c 61 75 73 65 73 20 70 6f 69 6e 74 73  ubclauses points
39a0: 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61   to the WhereCla
39b0: 75 73 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  use object for t
39c0: 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65 2e  he whole clause.
39d0: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
39e0: 43 6c 61 75 73 65 20 7b 0a 20 20 57 68 65 72 65  Clause {.  Where
39f0: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
3a00: 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
3a10: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  use processing c
3a20: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
3a30: 65 43 6c 61 75 73 65 20 2a 70 4f 75 74 65 72 3b  eClause *pOuter;
3a40: 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f       /* Outer co
3a50: 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  njunction */.  u
3a60: 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  8 op;           
3a70: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74          /* Split
3a80: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41   operator.  TK_A
3a90: 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20  ND or TK_OR */. 
3aa0: 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20   int nTerm;     
3ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3ac0: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a  ber of terms */.
3ad0: 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20    int nSlot;    
3ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3af0: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
3b00: 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  in a[] */.  Wher
3b10: 65 54 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20  eTerm *a;       
3b20: 20 20 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d       /* Each a[]
3b30: 20 64 65 73 63 72 69 62 65 73 20 61 20 74 65 72   describes a ter
3b40: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
3b50: 6c 75 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66  luase */.#if def
3b60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c  ined(SQLITE_SMAL
3b70: 4c 5f 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65  L_STACK).  Where
3b80: 54 65 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b  Term aStatic[1];
3b90: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73      /* Initial s
3ba0: 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20  tatic space for 
3bb0: 61 5b 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57  a[] */.#else.  W
3bc0: 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69 63  hereTerm aStatic
3bd0: 5b 38 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69  [8];    /* Initi
3be0: 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65 20  al static space 
3bf0: 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69  for a[] */.#endi
3c00: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68  f.};../*.** A Wh
3c10: 65 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70  ereTerm with eOp
3c20: 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61  erator==WO_OR ha
3c30: 73 20 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20  s its u.pOrInfo 
3c40: 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a  pointer set to.*
3c50: 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  * a dynamically 
3c60: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e  allocated instan
3c70: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
3c80: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
3c90: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f 72  /.struct WhereOr
3ca0: 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c  Info {.  WhereCl
3cb0: 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20  ause wc;        
3cc0: 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69    /* Decompositi
3cd0: 6f 6e 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  on into subterms
3ce0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e   */.  Bitmask in
3cf0: 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f  dexable;       /
3d00: 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c  * Bitmask of all
3d10: 20 69 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65   indexable table
3d20: 73 20 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20  s in the clause 
3d30: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57  */.};../*.** A W
3d40: 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f  hereTerm with eO
3d50: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20  perator==WO_AND 
3d60: 68 61 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e  has its u.pAndIn
3d70: 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74  fo pointer set t
3d80: 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c  o.** a dynamical
3d90: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73  ly allocated ins
3da0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
3db0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
3dc0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
3dd0: 65 41 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65  eAndInfo {.  Whe
3de0: 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20  reClause wc;    
3df0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62        /* The sub
3e00: 65 78 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65  expression broke
3e10: 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  n out */.};../*.
3e20: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
3e30: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
3e40: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
3e50: 74 72 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69  track of a mappi
3e60: 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44  ng.** between VD
3e70: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
3e80: 73 20 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68  s and bits of th
3e90: 65 20 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68  e bitmasks in Wh
3ea0: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54  ereTerm..**.** T
3eb0: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  he VDBE cursor n
3ec0: 75 6d 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c  umbers are small
3ed0: 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69   integers contai
3ee0: 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69  ned in .** SrcLi
3ef0: 73 74 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20  st_item.iCursor 
3f00: 61 6e 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20  and Expr.iTable 
3f10: 66 69 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79  fields.  For any
3f20: 20 67 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a   given WHERE .**
3f30: 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72   clause, the cur
3f40: 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68  sor numbers migh
3f50: 74 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  t not begin with
3f60: 20 30 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68   0 and they migh
3f70: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70  t.** contain gap
3f80: 73 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69  s in the numberi
3f90: 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75  ng sequence.  Bu
3fa0: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
3fb0: 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65  e maximum.** use
3fc0: 20 6f 66 20 74 68 65 20 62 69 74 73 20 69 6e 20   of the bits in 
3fd0: 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54  our bitmasks.  T
3fe0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 70 72  his structure pr
3ff0: 6f 76 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67  ovides a mapping
4000: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61  .** from the spa
4010: 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  rse cursor numbe
4020: 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74  rs into consecut
4030: 69 76 65 20 69 6e 74 65 67 65 72 73 20 62 65 67  ive integers beg
4040: 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30  inning.** with 0
4050: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65  ..**.** If Where
4060: 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42  MaskSet.ix[A]==B
4070: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54   it means that T
4080: 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61  he A-th bit of a
4090: 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72   Bitmask.** corr
40a0: 65 73 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72  esponds VDBE cur
40b0: 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54  sor number B.  T
40c0: 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61  he A-th bit of a
40d0: 20 62 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41   bitmask is 1<<A
40e0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
40f0: 70 6c 65 2c 20 69 66 20 74 68 65 20 57 48 45 52  ple, if the WHER
4100: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
4110: 69 6f 6e 20 75 73 65 64 20 74 68 65 73 65 20 56  ion used these V
4120: 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20  DBE.** cursors: 
4130: 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37   4, 5, 8, 29, 57
4140: 2c 20 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20  , 73.  Then the 
4150: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
4160: 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64  ructure.** would
4170: 20 6d 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f   map those curso
4180: 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62  r numbers into b
4190: 69 74 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e  its 0 through 5.
41a0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
41b0: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20   the mapping is 
41c0: 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
41d0: 6f 72 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65  ordered.  In the
41e0: 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76   example.** abov
41f0: 65 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d  e, the mapping m
4200: 69 67 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69  ight go like thi
4210: 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20  s:  4->3, 5->1, 
4220: 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20  8->2, 29->0,.** 
4230: 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f  57->5, 73->4.  O
4240: 72 20 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68  r one of 719 oth
4250: 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  er combinations 
4260: 6d 69 67 68 74 20 62 65 20 75 73 65 64 2e 20 49  might be used. I
4270: 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65  t.** does not re
4280: 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68  ally matter.  Wh
4290: 61 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  at is important 
42a0: 69 73 20 74 68 61 74 20 73 70 61 72 73 65 20 63  is that sparse c
42b0: 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73  ursor.** numbers
42c0: 20 61 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20   all get mapped 
42d0: 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73  into bit numbers
42e0: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
42f0: 20 30 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a   0 and contain.*
4300: 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74  * no gaps..*/.st
4310: 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65  ruct WhereMaskSe
4320: 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  t {.  int n;    
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4340: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4350: 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72   assigned cursor
4360: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
4370: 20 69 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20   ix[BMS];       
4380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4390: 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
43a0: 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a   each bit */.};.
43b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65  ./*.** This obje
43c0: 63 74 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65  ct is a convenie
43d0: 6e 63 65 20 77 72 61 70 70 65 72 20 68 6f 6c 64  nce wrapper hold
43e0: 69 6e 67 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  ing all informat
43f0: 69 6f 6e 20 6e 65 65 64 65 64 0a 2a 2a 20 74 6f  ion needed.** to
4400: 20 63 6f 6e 73 74 72 75 63 74 20 57 68 65 72 65   construct Where
4410: 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
4420: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 71 75   a particular qu
4430: 65 72 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  ery..*/.struct W
4440: 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
4450: 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
4460: 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 2f 2a  WInfo;        /*
4470: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
4480: 75 74 20 74 68 69 73 20 57 48 45 52 45 20 2a 2f  ut this WHERE */
4490: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
44a0: 70 57 43 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC;         /* 
44b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
44c0: 6d 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ms */.  ExprList
44d0: 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
44e0: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63 6c    /* ORDER BY cl
44f0: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c  ause */.  WhereL
4500: 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
4510: 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
4520: 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 57  WhereLoop */.  W
4530: 68 65 72 65 4f 72 53 65 74 20 2a 70 4f 72 53 65  hereOrSet *pOrSe
4540: 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f  t;       /* Reco
4550: 72 64 20 62 65 73 74 20 6c 6f 6f 70 73 20 68 65  rd best loops he
4560: 72 65 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  re, if not NULL 
4570: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
4580: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
4590: 54 34 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  T4) || defined(S
45a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
45b0: 54 33 29 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  T3).  UnpackedRe
45c0: 63 6f 72 64 20 2a 70 52 65 63 3b 20 20 20 20 20  cord *pRec;     
45d0: 2f 2a 20 50 72 6f 62 65 20 66 6f 72 20 73 74 61  /* Probe for sta
45e0: 74 34 20 28 69 66 20 72 65 71 75 69 72 65 64 29  t4 (if required)
45f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 56 61   */.  int nRecVa
4600: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
4610: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
4620: 69 64 20 66 69 65 6c 64 73 20 63 75 72 72 65 6e  id fields curren
4630: 74 6c 79 20 69 6e 20 70 52 65 63 20 2a 2f 0a 23  tly in pRec */.#
4640: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
4650: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
4660: 20 70 72 6f 63 65 73 73 69 6e 67 20 72 6f 75 74   processing rout
4670: 69 6e 65 20 68 61 73 20 74 77 6f 20 68 61 6c 76  ine has two halv
4680: 65 73 2e 20 20 54 68 65 0a 2a 2a 20 66 69 72 73  es.  The.** firs
4690: 74 20 70 61 72 74 20 64 6f 65 73 20 74 68 65 20  t part does the 
46a0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 57 48 45  start of the WHE
46b0: 52 45 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20  RE loop and the 
46c0: 73 65 63 6f 6e 64 0a 2a 2a 20 68 61 6c 66 20 64  second.** half d
46d0: 6f 65 73 20 74 68 65 20 74 61 69 6c 20 6f 66 20  oes the tail of 
46e0: 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20  the WHERE loop. 
46f0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a   An instance of.
4700: 2a 2a 20 74 68 69 73 20 73 74 72 75 63 74 75 72  ** this structur
4710: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  e is returned by
4720: 20 74 68 65 20 66 69 72 73 74 20 68 61 6c 66 20   the first half 
4730: 61 6e 64 20 70 61 73 73 65 64 0a 2a 2a 20 69 6e  and passed.** in
4740: 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 68 61  to the second ha
4750: 6c 66 20 74 6f 20 67 69 76 65 20 73 6f 6d 65 20  lf to give some 
4760: 63 6f 6e 74 69 6e 75 69 74 79 2e 0a 2a 2a 0a 2a  continuity..**.*
4770: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4780: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c   this object hol
4790: 64 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ds the complete 
47a0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 71 75 65  state of the que
47b0: 72 79 0a 2a 2a 20 70 6c 61 6e 6e 65 72 2e 0a 2a  ry.** planner..*
47c0: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 49 6e  /.struct WhereIn
47d0: 66 6f 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  fo {.  Parse *pP
47e0: 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
47f0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
4800: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
4810: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
4820: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
4830: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
4840: 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
4850: 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69  join */.  ExprLi
4860: 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
4870: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
4880: 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 4e 55   BY clause or NU
4890: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
48a0: 20 2a 70 52 65 73 75 6c 74 53 65 74 3b 20 20 20   *pResultSet;   
48b0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e    /* Result set.
48c0: 20 44 49 53 54 49 4e 43 54 20 6f 70 65 72 61 74   DISTINCT operat
48d0: 65 73 20 6f 6e 20 74 68 65 73 65 20 2a 2f 0a 20  es on these */. 
48e0: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
48f0: 70 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  ps;        /* Li
4900: 73 74 20 6f 66 20 61 6c 6c 20 57 68 65 72 65 4c  st of all WhereL
4910: 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  oop objects */. 
4920: 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b   Bitmask revMask
4930: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  ;          /* Ma
4940: 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  sk of ORDER BY t
4950: 65 72 6d 73 20 74 68 61 74 20 6e 65 65 64 20 72  erms that need r
4960: 65 76 65 72 73 69 6e 67 20 2a 2f 0a 20 20 57 68  eversing */.  Wh
4970: 65 72 65 43 6f 73 74 20 6e 52 6f 77 4f 75 74 3b  ereCost nRowOut;
4980: 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d          /* Estim
4990: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f  ated number of o
49a0: 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20  utput rows */.  
49b0: 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b 20  u16 wctrlFlags; 
49c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
49d0: 67 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 70 61  gs originally pa
49e0: 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
49f0: 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
4a00: 20 75 38 20 62 4f 42 53 61 74 3b 20 20 20 20 20   u8 bOBSat;     
4a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52             /* OR
4a20: 44 45 52 20 42 59 20 73 61 74 69 73 66 69 65 64  DER BY satisfied
4a30: 20 62 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20   by indices */. 
4a40: 20 75 38 20 6f 6b 4f 6e 65 50 61 73 73 3b 20 20   u8 okOnePass;  
4a50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6b             /* Ok
4a60: 20 74 6f 20 75 73 65 20 6f 6e 65 2d 70 61 73 73   to use one-pass
4a70: 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 55   algorithm for U
4a80: 50 44 41 54 45 2f 44 45 4c 45 54 45 20 2a 2f 0a  PDATE/DELETE */.
4a90: 20 20 75 38 20 75 6e 74 65 73 74 65 64 54 65 72    u8 untestedTer
4aa0: 6d 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ms;         /* N
4ab0: 6f 74 20 61 6c 6c 20 57 48 45 52 45 20 74 65 72  ot all WHERE ter
4ac0: 6d 73 20 72 65 73 6f 6c 76 65 64 20 62 79 20 6f  ms resolved by o
4ad0: 75 74 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75  uter loop */.  u
4ae0: 38 20 65 44 69 73 74 69 6e 63 74 3b 20 20 20 20  8 eDistinct;    
4af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
4b00: 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49 53  of the WHERE_DIS
4b10: 54 49 4e 43 54 5f 2a 20 76 61 6c 75 65 73 20 62  TINCT_* values b
4b20: 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e 4c 65  elow */.  u8 nLe
4b30: 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  vel;            
4b40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4b50: 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 2a 2f 0a   nested loop */.
4b60: 20 20 69 6e 74 20 69 54 6f 70 3b 20 20 20 20 20    int iTop;     
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4b80: 68 65 20 76 65 72 79 20 62 65 67 69 6e 6e 69 6e  he very beginnin
4b90: 67 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  g of the WHERE l
4ba0: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  oop */.  int iCo
4bb0: 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 20 20 20  ntinue;         
4bc0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
4bd0: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
4be0: 20 6e 65 78 74 20 72 65 63 6f 72 64 20 2a 2f 0a   next record */.
4bf0: 20 20 69 6e 74 20 69 42 72 65 61 6b 3b 20 20 20    int iBreak;   
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
4c10: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
4c20: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  k out of the loo
4c30: 70 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  p */.  int saved
4c40: 4e 51 75 65 72 79 4c 6f 6f 70 3b 20 20 20 20 20  NQueryLoop;     
4c50: 20 2f 2a 20 70 50 61 72 73 65 2d 3e 6e 51 75 65   /* pParse->nQue
4c60: 72 79 4c 6f 6f 70 20 6f 75 74 73 69 64 65 20 74  ryLoop outside t
4c70: 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 20 2a 2f  he WHERE loop */
4c80: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
4c90: 73 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20  sMaskSet;    /* 
4ca0: 4d 61 70 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  Map cursor numbe
4cb0: 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a  rs to bitmasks *
4cc0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
4cd0: 73 57 43 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  sWC;          /*
4ce0: 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f   Decomposition o
4cf0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
4d00: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  se */.  WhereLev
4d10: 65 6c 20 61 5b 31 5d 3b 20 20 20 20 20 20 20 20  el a[1];        
4d20: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
4d30: 20 61 62 6f 75 74 20 65 61 63 68 20 6e 65 73 74   about each nest
4d40: 20 6c 6f 6f 70 20 69 6e 20 57 48 45 52 45 20 2a   loop in WHERE *
4d50: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d  /.};../*.** Bitm
4d60: 61 73 6b 73 20 66 6f 72 20 74 68 65 20 6f 70 65  asks for the ope
4d70: 72 61 74 6f 72 73 20 6f 6e 20 57 68 65 72 65 54  rators on WhereT
4d80: 65 72 6d 20 6f 62 6a 65 63 74 73 2e 20 20 54 68  erm objects.  Th
4d90: 65 73 65 20 61 72 65 20 61 6c 6c 0a 2a 2a 20 6f  ese are all.** o
4da0: 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 61 72  perators that ar
4db0: 65 20 6f 66 20 69 6e 74 65 72 65 73 74 20 74 6f  e of interest to
4dc0: 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e   the query plann
4dd0: 65 72 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65 64  er.  An.** OR-ed
4de0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
4df0: 74 68 65 73 65 20 76 61 6c 75 65 73 20 63 61 6e  these values can
4e00: 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 73 65   be used when se
4e10: 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20 70  arching for.** p
4e20: 61 72 74 69 63 75 6c 61 72 20 57 68 65 72 65 54  articular WhereT
4e30: 65 72 6d 73 20 77 69 74 68 69 6e 20 61 20 57 68  erms within a Wh
4e40: 65 72 65 43 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64  ereClause..*/.#d
4e50: 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20  efine WO_IN     
4e60: 30 78 30 30 31 0a 23 64 65 66 69 6e 65 20 57 4f  0x001.#define WO
4e70: 5f 45 51 20 20 20 20 20 30 78 30 30 32 0a 23 64  _EQ     0x002.#d
4e80: 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20 20 20  efine WO_LT     
4e90: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d 54  (WO_EQ<<(TK_LT-T
4ea0: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
4eb0: 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_LE     (WO_EQ<
4ec0: 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29 0a  <(TK_LE-TK_EQ)).
4ed0: 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20 20 20  #define WO_GT   
4ee0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 54    (WO_EQ<<(TK_GT
4ef0: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
4f00: 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f 5f 45   WO_GE     (WO_E
4f10: 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45 51 29  Q<<(TK_GE-TK_EQ)
4f20: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d 41 54  ).#define WO_MAT
4f30: 43 48 20 20 30 78 30 34 30 0a 23 64 65 66 69 6e  CH  0x040.#defin
4f40: 65 20 57 4f 5f 49 53 4e 55 4c 4c 20 30 78 30 38  e WO_ISNULL 0x08
4f50: 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4f 52 20  0.#define WO_OR 
4f60: 20 20 20 20 30 78 31 30 30 20 20 20 20 20 20 20      0x100       
4f70: 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 4f  /* Two or more O
4f80: 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
4f90: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  s */.#define WO_
4fa0: 41 4e 44 20 20 20 20 30 78 32 30 30 20 20 20 20  AND    0x200    
4fb0: 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72     /* Two or mor
4fc0: 65 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  e AND-connected 
4fd0: 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65  terms */.#define
4fe0: 20 57 4f 5f 45 51 55 49 56 20 20 30 78 34 30 30   WO_EQUIV  0x400
4ff0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 20 74 68 65         /* Of the
5000: 20 66 6f 72 6d 20 41 3d 3d 42 2c 20 62 6f 74 68   form A==B, both
5010: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66   columns */.#def
5020: 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20 20 20 30 78  ine WO_NOOP   0x
5030: 38 30 30 20 20 20 20 20 20 20 2f 2a 20 54 68 69  800       /* Thi
5040: 73 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20  s term does not 
5050: 72 65 73 74 72 69 63 74 20 73 65 61 72 63 68 20  restrict search 
5060: 73 70 61 63 65 20 2a 2f 0a 0a 23 64 65 66 69 6e  space */..#defin
5070: 65 20 57 4f 5f 41 4c 4c 20 20 20 20 30 78 66 66  e WO_ALL    0xff
5080: 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  f       /* Mask 
5090: 6f 66 20 61 6c 6c 20 70 6f 73 73 69 62 6c 65 20  of all possible 
50a0: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 23  WO_* values */.#
50b0: 64 65 66 69 6e 65 20 57 4f 5f 53 49 4e 47 4c 45  define WO_SINGLE
50c0: 20 30 78 30 66 66 20 20 20 20 20 20 20 2f 2a 20   0x0ff       /* 
50d0: 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 6e 6f 6e 2d  Mask of all non-
50e0: 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f 2a 20 76 61  compound WO_* va
50f0: 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  lues */../*.** T
5100: 68 65 73 65 20 61 72 65 20 64 65 66 69 6e 69 74  hese are definit
5110: 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20  ions of bits in 
5120: 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 77 73  the WhereLoop.ws
5130: 46 6c 61 67 73 20 66 69 65 6c 64 2e 0a 2a 2a 20  Flags field..** 
5140: 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 63  The particular c
5150: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 62 69  ombination of bi
5160: 74 73 20 69 6e 20 65 61 63 68 20 57 68 65 72 65  ts in each Where
5170: 4c 6f 6f 70 20 68 65 6c 70 20 74 6f 0a 2a 2a 20  Loop help to.** 
5180: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 61 6c  determine the al
5190: 67 6f 72 69 74 68 6d 20 74 68 61 74 20 57 68 65  gorithm that Whe
51a0: 72 65 4c 6f 6f 70 20 72 65 70 72 65 73 65 6e 74  reLoop represent
51b0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  s..*/.#define WH
51c0: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20  ERE_COLUMN_EQ   
51d0: 20 30 78 30 30 30 30 30 30 30 31 20 20 2f 2a 20   0x00000001  /* 
51e0: 78 3d 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e  x=EXPR */.#defin
51f0: 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  e WHERE_COLUMN_R
5200: 41 4e 47 45 20 30 78 30 30 30 30 30 30 30 32 20  ANGE 0x00000002 
5210: 20 2f 2a 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f   /* x<EXPR and/o
5220: 72 20 78 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66  r x>EXPR */.#def
5230: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ine WHERE_COLUMN
5240: 5f 49 4e 20 20 20 20 30 78 30 30 30 30 30 30 30  _IN    0x0000000
5250: 34 20 20 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29  4  /* x IN (...)
5260: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
5270: 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30  E_COLUMN_NULL  0
5280: 78 30 30 30 30 30 30 30 38 20 20 2f 2a 20 78 20  x00000008  /* x 
5290: 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69  IS NULL */.#defi
52a0: 6e 65 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41  ne WHERE_CONSTRA
52b0: 49 4e 54 20 20 20 30 78 30 30 30 30 30 30 30 66  INT   0x0000000f
52c0: 20 20 2f 2a 20 41 6e 79 20 6f 66 20 74 68 65 20    /* Any of the 
52d0: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 78 78 78  WHERE_COLUMN_xxx
52e0: 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69   values */.#defi
52f0: 6e 65 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  ne WHERE_TOP_LIM
5300: 49 54 20 20 20 20 30 78 30 30 30 30 30 30 31 30  IT    0x00000010
5310: 20 20 2f 2a 20 78 3c 45 58 50 52 20 6f 72 20 78    /* x<EXPR or x
5320: 3c 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e  <=EXPR constrain
5330: 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  t */.#define WHE
5340: 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20  RE_BTM_LIMIT    
5350: 30 78 30 30 30 30 30 30 32 30 20 20 2f 2a 20 78  0x00000020  /* x
5360: 3e 45 58 50 52 20 6f 72 20 78 3e 3d 45 58 50 52  >EXPR or x>=EXPR
5370: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23   constraint */.#
5380: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 4f 54  define WHERE_BOT
5390: 48 5f 4c 49 4d 49 54 20 20 20 30 78 30 30 30 30  H_LIMIT   0x0000
53a0: 30 30 33 30 20 20 2f 2a 20 42 6f 74 68 20 78 3e  0030  /* Both x>
53b0: 45 58 50 52 20 61 6e 64 20 78 3c 45 58 50 52 20  EXPR and x<EXPR 
53c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
53d0: 5f 49 44 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78  _IDX_ONLY     0x
53e0: 30 30 30 30 30 30 34 30 20 20 2f 2a 20 55 73 65  00000040  /* Use
53f0: 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d   index only - om
5400: 69 74 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66  it table */.#def
5410: 69 6e 65 20 57 48 45 52 45 5f 49 50 4b 20 20 20  ine WHERE_IPK   
5420: 20 20 20 20 20 20 20 30 78 30 30 30 30 30 31 30         0x0000010
5430: 30 20 20 2f 2a 20 78 20 69 73 20 74 68 65 20 49  0  /* x is the I
5440: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
5450: 45 59 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  EY */.#define WH
5460: 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20 20 20  ERE_INDEXED     
5470: 20 30 78 30 30 30 30 30 32 30 30 20 20 2f 2a 20   0x00000200  /* 
5480: 57 68 65 72 65 4c 6f 6f 70 2e 75 2e 62 74 72 65  WhereLoop.u.btre
5490: 65 2e 70 49 6e 64 65 78 20 69 73 20 76 61 6c 69  e.pIndex is vali
54a0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  d */.#define WHE
54b0: 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
54c0: 30 78 30 30 30 30 30 34 30 30 20 20 2f 2a 20 57  0x00000400  /* W
54d0: 68 65 72 65 4c 6f 6f 70 2e 75 2e 76 74 61 62 20  hereLoop.u.vtab 
54e0: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66  is valid */.#def
54f0: 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  ine WHERE_IN_ABL
5500: 45 20 20 20 20 20 20 30 78 30 30 30 30 30 38 30  E      0x0000080
5510: 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75  0  /* Able to su
5520: 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72  pport an IN oper
5530: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
5540: 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 20 20 20  WHERE_ONEROW    
5550: 20 20 20 30 78 30 30 30 30 31 30 30 30 20 20 2f     0x00001000  /
5560: 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f 72  * Selects no mor
5570: 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20 2a  e than one row *
5580: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
5590: 4d 55 4c 54 49 5f 4f 52 20 20 20 20 20 30 78 30  MULTI_OR     0x0
55a0: 30 30 30 32 30 30 30 20 20 2f 2a 20 4f 52 20 75  0002000  /* OR u
55b0: 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e  sing multiple in
55c0: 64 69 63 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65  dices */.#define
55d0: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
55e0: 58 20 20 20 30 78 30 30 30 30 34 30 30 30 20 20  X   0x00004000  
55f0: 2f 2a 20 55 73 65 73 20 61 6e 20 65 70 68 65 6d  /* Uses an ephem
5600: 65 72 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a  eral index */...
5610: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 57 68 65  /* Convert a Whe
5620: 72 65 43 6f 73 74 20 76 61 6c 75 65 20 28 31 30  reCost value (10
5630: 20 74 69 6d 65 73 20 6c 6f 67 32 28 58 29 29 20   times log2(X)) 
5640: 69 6e 74 6f 20 69 74 73 20 69 6e 74 65 67 65 72  into its integer
5650: 20 76 61 6c 75 65 20 58 2e 0a 2a 2a 20 41 20 72   value X..** A r
5660: 6f 75 67 68 20 61 70 70 72 6f 78 69 6d 61 74 69  ough approximati
5670: 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 54 68 65  on is used.  The
5680: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
5690: 69 73 20 6e 6f 74 20 65 78 61 63 74 2e 0a 2a 2f  is not exact..*/
56a0: 0a 73 74 61 74 69 63 20 75 36 34 20 77 68 65 72  .static u64 wher
56b0: 65 43 6f 73 74 54 6f 49 6e 74 28 57 68 65 72 65  eCostToInt(Where
56c0: 43 6f 73 74 20 78 29 7b 0a 20 20 75 36 34 20 6e  Cost x){.  u64 n
56d0: 3b 0a 20 20 69 66 28 20 78 3c 31 30 20 29 20 72  ;.  if( x<10 ) r
56e0: 65 74 75 72 6e 20 31 3b 0a 20 20 6e 20 3d 20 78  eturn 1;.  n = x
56f0: 25 31 30 3b 0a 20 20 78 20 2f 3d 20 31 30 3b 0a  %10;.  x /= 10;.
5700: 20 20 69 66 28 20 6e 3e 3d 35 20 29 20 6e 20 2d    if( n>=5 ) n -
5710: 3d 20 32 3b 0a 20 20 65 6c 73 65 20 69 66 28 20  = 2;.  else if( 
5720: 6e 3e 3d 31 20 29 20 6e 20 2d 3d 20 31 3b 0a 20  n>=1 ) n -= 1;. 
5730: 20 69 66 28 20 78 3e 3d 33 20 29 20 72 65 74 75   if( x>=3 ) retu
5740: 72 6e 20 28 6e 2b 38 29 3c 3c 28 78 2d 33 29 3b  rn (n+8)<<(x-3);
5750: 0a 20 20 72 65 74 75 72 6e 20 28 6e 2b 38 29 3e  .  return (n+8)>
5760: 3e 28 33 2d 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >(3-x);.}../*.**
5770: 20 52 65 74 75 72 6e 20 74 68 65 20 65 73 74 69   Return the esti
5780: 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
5790: 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72 6f 6d  output rows from
57a0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a   a WHERE clause.
57b0: 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 57 68  */.u64 sqlite3Wh
57c0: 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e  ereOutputRowCoun
57d0: 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  t(WhereInfo *pWI
57e0: 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 77  nfo){.  return w
57f0: 68 65 72 65 43 6f 73 74 54 6f 49 6e 74 28 70 57  hereCostToInt(pW
5800: 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a  Info->nRowOut);.
5810: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5820: 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  one of the WHERE
5830: 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78 20  _DISTINCT_xxxxx 
5840: 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63 61  values to indica
5850: 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20 57  te how this.** W
5860: 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74 75  HERE clause retu
5870: 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72 20  rns outputs for 
5880: 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
5890: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
58a0: 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
58b0: 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ct(WhereInfo *pW
58c0: 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20  Info){.  return 
58d0: 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
58e0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
58f0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57  rn TRUE if the W
5900: 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74 75  HERE clause retu
5910: 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44 45  rns rows in ORDE
5920: 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20 52  R BY order..** R
5930: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
5940: 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73 20  he output needs 
5950: 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a 2f  to be sorted..*/
5960: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
5970: 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72 65  eIsOrdered(Where
5980: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
5990: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
59a0: 62 4f 42 53 61 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a  bOBSat!=0;.}../*
59b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
59c0: 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c  DBE address or l
59d0: 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
59e0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74  in order to cont
59f0: 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  inue.** immediat
5a00: 65 6c 79 20 77 69 74 68 20 74 68 65 20 6e 65 78  ely with the nex
5a10: 74 20 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45  t row of a WHERE
5a20: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20   clause..*/.int 
5a30: 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74  sqlite3WhereCont
5a40: 69 6e 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49  inueLabel(WhereI
5a50: 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
5a60: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
5a70: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
5a80: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
5a90: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
5aa0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
5ab0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
5ac0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
5ad0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
5ae0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
5af0: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
5b00: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
5b10: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
5b20: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
5b30: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
5b40: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
5b50: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
5b60: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
5b70: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
5b80: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
5b90: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
5ba0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
5bb0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
5bc0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
5bd0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
5be0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
5bf0: 65 73 75 6c 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  esults..*/.int s
5c00: 71 6c 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65  qlite3WhereOkOne
5c10: 50 61 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a  Pass(WhereInfo *
5c20: 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72  pWInfo){.  retur
5c30: 6e 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  n pWInfo->okOneP
5c40: 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ass;.}../*.** Mo
5c50: 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ve the content o
5c60: 66 20 70 53 72 63 20 69 6e 74 6f 20 70 44 65 73  f pSrc into pDes
5c70: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
5c80: 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 57 68 65   whereOrMove(Whe
5c90: 72 65 4f 72 53 65 74 20 2a 70 44 65 73 74 2c 20  reOrSet *pDest, 
5ca0: 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53 72 63  WhereOrSet *pSrc
5cb0: 29 7b 0a 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20  ){.  pDest->n = 
5cc0: 70 53 72 63 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70  pSrc->n;.  memcp
5cd0: 79 28 70 44 65 73 74 2d 3e 61 2c 20 70 53 72 63  y(pDest->a, pSrc
5ce0: 2d 3e 61 2c 20 70 44 65 73 74 2d 3e 6e 2a 73 69  ->a, pDest->n*si
5cf0: 7a 65 6f 66 28 70 44 65 73 74 2d 3e 61 5b 30 5d  zeof(pDest->a[0]
5d00: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  ));.}../*.** Try
5d10: 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77   to insert a new
5d20: 20 70 72 65 72 65 71 75 69 73 69 74 65 2f 63 6f   prerequisite/co
5d30: 73 74 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  st entry into th
5d40: 65 20 57 68 65 72 65 4f 72 53 65 74 20 70 53 65  e WhereOrSet pSe
5d50: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  t..**.** The new
5d60: 20 65 6e 74 72 79 20 6d 69 67 68 74 20 6f 76 65   entry might ove
5d70: 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69  rwrite an existi
5d80: 6e 67 20 65 6e 74 72 79 2c 20 6f 72 20 69 74 20  ng entry, or it 
5d90: 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 70 70 65  might be.** appe
5da0: 6e 64 65 64 2c 20 6f 72 20 69 74 20 6d 69 67 68  nded, or it migh
5db0: 74 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20  t be discarded. 
5dc0: 20 44 6f 20 77 68 61 74 65 76 65 72 20 69 73 20   Do whatever is 
5dd0: 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 0a  the right thing.
5de0: 2a 2a 20 73 6f 20 74 68 61 74 20 70 53 65 74 20  ** so that pSet 
5df0: 6b 65 65 70 73 20 74 68 65 20 4e 5f 4f 52 5f 43  keeps the N_OR_C
5e00: 4f 53 54 20 62 65 73 74 20 65 6e 74 72 69 65 73  OST best entries
5e10: 20 73 65 65 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f   seen so far..*/
5e20: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
5e30: 65 4f 72 49 6e 73 65 72 74 28 0a 20 20 57 68 65  eOrInsert(.  Whe
5e40: 72 65 4f 72 53 65 74 20 2a 70 53 65 74 2c 20 20  reOrSet *pSet,  
5e50: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
5e60: 4f 72 53 65 74 20 74 6f 20 62 65 20 75 70 64 61  OrSet to be upda
5e70: 74 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ted */.  Bitmask
5e80: 20 70 72 65 72 65 71 2c 20 20 20 20 20 20 20 20   prereq,        
5e90: 2f 2a 20 50 72 65 72 65 71 75 69 73 69 74 65 73  /* Prerequisites
5ea0: 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
5eb0: 79 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  y */.  WhereCost
5ec0: 20 72 52 75 6e 2c 20 20 20 20 20 20 20 20 2f 2a   rRun,        /*
5ed0: 20 52 75 6e 2d 63 6f 73 74 20 6f 66 20 74 68 65   Run-cost of the
5ee0: 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20   new entry */.  
5ef0: 57 68 65 72 65 43 6f 73 74 20 6e 4f 75 74 20 20  WhereCost nOut  
5f00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5f10: 20 6f 66 20 6f 75 74 70 75 74 73 20 66 6f 72 20   of outputs for 
5f20: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
5f30: 0a 29 7b 0a 20 20 75 31 36 20 69 3b 0a 20 20 57  .){.  u16 i;.  W
5f40: 68 65 72 65 4f 72 43 6f 73 74 20 2a 70 3b 0a 20  hereOrCost *p;. 
5f50: 20 66 6f 72 28 69 3d 70 53 65 74 2d 3e 6e 2c 20   for(i=pSet->n, 
5f60: 70 3d 70 53 65 74 2d 3e 61 3b 20 69 3e 30 3b 20  p=pSet->a; i>0; 
5f70: 69 2d 2d 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i--, p++){.    i
5f80: 66 28 20 72 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e  f( rRun<=p->rRun
5f90: 20 26 26 20 28 70 72 65 72 65 71 20 26 20 70 2d   && (prereq & p-
5fa0: 3e 70 72 65 72 65 71 29 3d 3d 70 72 65 72 65 71  >prereq)==prereq
5fb0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 77   ){.      goto w
5fc0: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
5fd0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
5fe0: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 26   p->rRun<=rRun &
5ff0: 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  & (p->prereq & p
6000: 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
6010: 71 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  q ){.      retur
6020: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
6030: 20 69 66 28 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f   if( pSet->n<N_O
6040: 52 5f 43 4f 53 54 20 29 7b 0a 20 20 20 20 70 20  R_COST ){.    p 
6050: 3d 20 26 70 53 65 74 2d 3e 61 5b 70 53 65 74 2d  = &pSet->a[pSet-
6060: 3e 6e 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f  >n++];.    p->nO
6070: 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c  ut = nOut;.  }el
6080: 73 65 7b 0a 20 20 20 20 70 20 3d 20 70 53 65 74  se{.    p = pSet
6090: 2d 3e 61 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ->a;.    for(i=1
60a0: 3b 20 69 3c 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b  ; i<pSet->n; i++
60b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
60c0: 72 52 75 6e 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e  rRun>pSet->a[i].
60d0: 72 52 75 6e 20 29 20 70 20 3d 20 70 53 65 74 2d  rRun ) p = pSet-
60e0: 3e 61 20 2b 20 69 3b 0a 20 20 20 20 7d 0a 20 20  >a + i;.    }.  
60f0: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72    if( p->rRun<=r
6100: 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Run ) return 0;.
6110: 20 20 7d 0a 77 68 65 72 65 4f 72 49 6e 73 65 72    }.whereOrInser
6120: 74 5f 64 6f 6e 65 3a 0a 20 20 70 2d 3e 70 72 65  t_done:.  p->pre
6130: 72 65 71 20 3d 20 70 72 65 72 65 71 3b 0a 20 20  req = prereq;.  
6140: 70 2d 3e 72 52 75 6e 20 3d 20 72 52 75 6e 3b 0a  p->rRun = rRun;.
6150: 20 20 69 66 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f    if( p->nOut>nO
6160: 75 74 20 29 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e  ut ) p->nOut = n
6170: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  Out;.  return 1;
6180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
6190: 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61  lize a prealloca
61a0: 74 65 64 20 57 68 65 72 65 43 6c 61 75 73 65 20  ted WhereClause 
61b0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
61c0: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
61d0: 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65  lauseInit(.  Whe
61e0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
61f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
6200: 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69  reClause to be i
6210: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
6220: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
6230: 6f 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  o        /* The 
6240: 57 48 45 52 45 20 70 72 6f 63 65 73 73 69 6e 67  WHERE processing
6250: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
6260: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 20 3d 20 70   pWC->pWInfo = p
6270: 57 49 6e 66 6f 3b 0a 20 20 70 57 43 2d 3e 70 4f  WInfo;.  pWC->pO
6280: 75 74 65 72 20 3d 20 30 3b 0a 20 20 70 57 43 2d  uter = 0;.  pWC-
6290: 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57  >nTerm = 0;.  pW
62a0: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79  C->nSlot = Array
62b0: 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69  Size(pWC->aStati
62c0: 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70  c);.  pWC->a = p
62d0: 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a 0a  WC->aStatic;.}..
62e0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
62f0: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
6300: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43  oid whereClauseC
6310: 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65  lear(WhereClause
6320: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  *);../*.** Deall
6330: 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79  ocate all memory
6340: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6350: 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 6f   a WhereOrInfo o
6360: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
6370: 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49 6e 66   void whereOrInf
6380: 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  oDelete(sqlite3 
6390: 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e 66 6f  *db, WhereOrInfo
63a0: 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61   *p){.  whereCla
63b0: 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29  useClear(&p->wc)
63c0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
63d0: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
63e0: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c  ** Deallocate al
63f0: 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
6400: 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72 65  ted with a Where
6410: 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  AndInfo object..
6420: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
6430: 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74  hereAndInfoDelet
6440: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
6450: 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b  hereAndInfo *p){
6460: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
6470: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
6480: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6490: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
64a0: 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65  allocate a Where
64b0: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
64c0: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
64d0: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
64e0: 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72  itself is not fr
64f0: 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  eed.  This routi
6500: 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65 72 73  ne is the invers
6510: 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65  e of whereClause
6520: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Init()..*/.stati
6530: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
6540: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
6550: 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74  use *pWC){.  int
6560: 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
6570: 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *a;.  sqlite3 *d
6580: 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d  b = pWC->pWInfo-
6590: 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66  >pParse->db;.  f
65a0: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  or(i=pWC->nTerm-
65b0: 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d  1, a=pWC->a; i>=
65c0: 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20  0; i--, a++){.  
65d0: 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73    if( a->wtFlags
65e0: 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20   & TERM_DYNAMIC 
65f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6600: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 61  ExprDelete(db, a
6610: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
6620: 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61      if( a->wtFla
6630: 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  gs & TERM_ORINFO
6640: 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4f   ){.      whereO
6650: 72 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20  rInfoDelete(db, 
6660: 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20  a->u.pOrInfo);. 
6670: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e     }else if( a->
6680: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 41  wtFlags & TERM_A
6690: 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20  NDINFO ){.      
66a0: 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65  whereAndInfoDele
66b0: 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64  te(db, a->u.pAnd
66c0: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Info);.    }.  }
66d0: 0a 20 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70  .  if( pWC->a!=p
66e0: 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20  WC->aStatic ){. 
66f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6700: 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20  (db, pWC->a);.  
6710: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
6720: 20 73 69 6e 67 6c 65 20 6e 65 77 20 57 68 65 72   single new Wher
6730: 65 54 65 72 6d 20 65 6e 74 72 79 20 74 6f 20 74  eTerm entry to t
6740: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
6750: 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68  bject pWC..** Th
6760: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
6770: 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 73 74 72  object is constr
6780: 75 63 74 65 64 20 66 72 6f 6d 20 45 78 70 72 20  ucted from Expr 
6790: 70 20 61 6e 64 20 77 69 74 68 20 77 74 46 6c 61  p and with wtFla
67a0: 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  gs..** The index
67b0: 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20   in pWC->a[] of 
67c0: 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 72  the new WhereTer
67d0: 6d 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  m is returned on
67e0: 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69   success..** 0 i
67f0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
6800: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
6810: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 64 64  could not be add
6820: 65 64 20 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f  ed due to a memo
6830: 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  ry.** allocation
6840: 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d   error.  The mem
6850: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
6860: 61 69 6c 75 72 65 20 77 69 6c 6c 20 62 65 20 72  ailure will be r
6870: 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68  ecorded in.** th
6880: 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  e db->mallocFail
6890: 65 64 20 66 6c 61 67 20 73 6f 20 74 68 61 74 20  ed flag so that 
68a0: 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e  higher-level fun
68b0: 63 74 69 6f 6e 73 20 63 61 6e 20 64 65 74 65 63  ctions can detec
68c0: 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t it..**.** This
68d0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e   routine will in
68e0: 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20  crease the size 
68f0: 6f 66 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20  of the pWC->a[] 
6900: 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
6910: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ry..**.** If the
6920: 20 77 74 46 6c 61 67 73 20 61 72 67 75 6d 65 6e   wtFlags argumen
6930: 74 20 69 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f  t includes TERM_
6940: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72 65  DYNAMIC, then re
6950: 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20  sponsibility.** 
6960: 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
6970: 65 78 70 72 65 73 73 69 6f 6e 20 70 20 69 73 20  expression p is 
6980: 61 73 73 75 6d 65 64 20 62 79 20 74 68 65 20 57  assumed by the W
6990: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
69a0: 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69  t pWC..** This i
69b0: 73 20 74 72 75 65 20 65 76 65 6e 20 69 66 20 74  s true even if t
69c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
69d0: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  s to allocate a 
69e0: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  new WhereTerm..*
69f0: 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54  *.** WARNING:  T
6a00: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
6a10: 74 20 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65  t reallocate the
6a20: 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 73   space used to s
6a30: 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72  tore.** WhereTer
6a40: 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72  ms.  All pointer
6a50: 73 20 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20  s to WhereTerms 
6a60: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69  should be invali
6a70: 64 61 74 65 64 20 61 66 74 65 72 0a 2a 2a 20 63  dated after.** c
6a80: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
6a90: 69 6e 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74  ine.  Such point
6aa0: 65 72 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69  ers may be reini
6ab0: 74 69 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65  tialized by refe
6ac0: 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70  rencing.** the p
6ad0: 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a  WC->a[] array..*
6ae0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
6af0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57  reClauseInsert(W
6b00: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
6b10: 20 45 78 70 72 20 2a 70 2c 20 75 38 20 77 74 46   Expr *p, u8 wtF
6b20: 6c 61 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65  lags){.  WhereTe
6b30: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
6b40: 20 69 64 78 3b 0a 20 20 74 65 73 74 63 61 73 65   idx;.  testcase
6b50: 28 20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ( wtFlags & TERM
6b60: 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 69 66  _VIRTUAL );.  if
6b70: 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57  ( pWC->nTerm>=pW
6b80: 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20  C->nSlot ){.    
6b90: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20  WhereTerm *pOld 
6ba0: 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71  = pWC->a;.    sq
6bb0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d  lite3 *db = pWC-
6bc0: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  >pWInfo->pParse-
6bd0: 3e 64 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20  >db;.    pWC->a 
6be0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6bf0: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
6c00: 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e  pWC->a[0])*pWC->
6c10: 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69  nSlot*2 );.    i
6c20: 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a  f( pWC->a==0 ){.
6c30: 20 20 20 20 20 20 69 66 28 20 77 74 46 6c 61 67        if( wtFlag
6c40: 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  s & TERM_DYNAMIC
6c50: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6c60: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6c70: 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , p);.      }.  
6c80: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c      pWC->a = pOl
6c90: 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  d;.      return 
6ca0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  0;.    }.    mem
6cb0: 63 70 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64  cpy(pWC->a, pOld
6cc0: 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b  , sizeof(pWC->a[
6cd0: 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b  0])*pWC->nTerm);
6ce0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70  .    if( pOld!=p
6cf0: 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20  WC->aStatic ){. 
6d00: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
6d10: 65 65 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20  ee(db, pOld);.  
6d20: 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c    }.    pWC->nSl
6d30: 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ot = sqlite3DbMa
6d40: 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43  llocSize(db, pWC
6d50: 2d 3e 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d  ->a)/sizeof(pWC-
6d60: 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54  >a[0]);.  }.  pT
6d70: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
6d80: 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b  x = pWC->nTerm++
6d90: 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70  ];.  pTerm->pExp
6da0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
6db0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20  kipCollate(p);. 
6dc0: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
6dd0: 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20 70 54 65  = wtFlags;.  pTe
6de0: 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20  rm->pWC = pWC;. 
6df0: 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20   pTerm->iParent 
6e00: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 69  = -1;.  return i
6e10: 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  dx;.}../*.** Thi
6e20: 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69  s routine identi
6e30: 66 69 65 73 20 73 75 62 65 78 70 72 65 73 73 69  fies subexpressi
6e40: 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  ons in the WHERE
6e50: 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a   clause where.**
6e60: 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73   each subexpress
6e70: 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
6e80: 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72   by the AND oper
6e90: 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68  ator or some oth
6ea0: 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73  er.** operator s
6eb0: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
6ec0: 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54  op parameter.  T
6ed0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
6ee0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66  tructure.** is f
6ef0: 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74  illed with point
6f00: 65 72 73 20 74 6f 20 73 75 62 65 78 70 72 65 73  ers to subexpres
6f10: 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d  sions.  For exam
6f20: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48  ple:.**.**    WH
6f30: 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20  ERE  a=='hello' 
6f40: 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31  AND coalesce(b,1
6f50: 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21  1)<10 AND (c+12!
6f60: 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20  =d OR c==22).** 
6f70: 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
6f80: 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  ___/     \______
6f90: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  _________/     \
6fa0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
6fb0: 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
6fc0: 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20  slot[0]         
6fd0: 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20     slot[1]      
6fe0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d           slot[2]
6ff0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
7000: 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  nal WHERE clause
7010: 20 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61   in pExpr is una
7020: 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69  ltered.  All thi
7030: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65  s routine.** doe
7040: 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d  s is make slot[]
7050: 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74   entries point t
7060: 6f 20 73 75 62 73 74 72 75 63 74 75 72 65 20 77  o substructure w
7070: 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a  ithin pExpr..**.
7080: 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f  ** In the previo
7090: 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20  us sentence and 
70a0: 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20  in the diagram, 
70b0: 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20  "slot[]" refers 
70c0: 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43  to.** the WhereC
70d0: 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e  lause.a[] array.
70e0: 20 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72    The slot[] arr
70f0: 61 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64  ay grows as need
7100: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a  ed to contain.**
7110: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
7120: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
7130: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
7140: 68 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43  hereSplit(WhereC
7150: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
7160: 20 2a 70 45 78 70 72 2c 20 75 38 20 6f 70 29 7b   *pExpr, u8 op){
7170: 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20 6f 70 3b  .  pWC->op = op;
7180: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
7190: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
71a0: 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b  pExpr->op!=op ){
71b0: 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65  .    whereClause
71c0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78 70  Insert(pWC, pExp
71d0: 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r, 0);.  }else{.
71e0: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
71f0: 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  WC, pExpr->pLeft
7200: 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65  , op);.    where
7210: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
7220: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20  ->pRight, op);. 
7230: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
7240: 69 61 6c 69 7a 65 20 61 20 57 68 65 72 65 4d 61  ialize a WhereMa
7250: 73 6b 53 65 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a  skSet object.*/.
7260: 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b  #define initMask
7270: 53 65 74 28 50 29 20 20 28 50 29 2d 3e 6e 3d 30  Set(P)  (P)->n=0
7280: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7290: 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74  he bitmask for t
72a0: 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20  he given cursor 
72b0: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20  number.  Return 
72c0: 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20  0 if.** iCursor 
72d0: 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65  is not in the se
72e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  t..*/.static Bit
72f0: 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 57 68 65  mask getMask(Whe
7300: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
7310: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
7320: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
7330: 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e  sert( pMaskSet->
7340: 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 42  n<=(int)sizeof(B
7350: 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66  itmask)*8 );.  f
7360: 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53  or(i=0; i<pMaskS
7370: 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  et->n; i++){.   
7380: 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69   if( pMaskSet->i
7390: 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b  x[i]==iCursor ){
73a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4d 41  .      return MA
73b0: 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
73c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
73d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
73e0: 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63  a new mask for c
73f0: 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a  ursor iCursor..*
7400: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
7410: 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62  e cursor per tab
7420: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
7430: 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62  lause.  The numb
7440: 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20  er of.** tables 
7450: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
7460: 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
7470: 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e   a test early in
7480: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57   the.** sqlite3W
7490: 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74  hereBegin() rout
74a0: 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77  ine.  So we know
74b0: 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53   that the pMaskS
74c0: 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61  et->ix[].** arra
74d0: 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65  y will never ove
74e0: 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  rflow..*/.static
74f0: 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b   void createMask
7500: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
7510: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
7520: 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rsor){.  assert(
7530: 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41   pMaskSet->n < A
7540: 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65  rraySize(pMaskSe
7550: 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73  t->ix) );.  pMas
7560: 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65  kSet->ix[pMaskSe
7570: 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f  t->n++] = iCurso
7580: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  r;.}../*.** Thes
7590: 65 20 72 6f 75 74 69 6e 65 73 20 77 61 6c 6b 20  e routines walk 
75a0: 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e  (recursively) an
75b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
75c0: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 0a 2a 2a   and generate.**
75d0: 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63   a bitmask indic
75e0: 61 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c  ating which tabl
75f0: 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  es are used in t
7600: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  hat expression.*
7610: 2a 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  * tree..*/.stati
7620: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69  c Bitmask exprLi
7630: 73 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  stTableUsage(Whe
7640: 72 65 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72  reMaskSet*, Expr
7650: 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 42  List*);.static B
7660: 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63  itmask exprSelec
7670: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
7680: 65 4d 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63  eMaskSet*, Selec
7690: 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d  t*);.static Bitm
76a0: 61 73 6b 20 65 78 70 72 54 61 62 6c 65 55 73 61  ask exprTableUsa
76b0: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ge(WhereMaskSet 
76c0: 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20  *pMaskSet, Expr 
76d0: 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  *p){.  Bitmask m
76e0: 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ask = 0;.  if( p
76f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7700: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
7710: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61  COLUMN ){.    ma
7720: 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61  sk = getMask(pMa
7730: 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65  skSet, p->iTable
7740: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61  );.    return ma
7750: 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d  sk;.  }.  mask =
7760: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
7770: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69  pMaskSet, p->pRi
7780: 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20  ght);.  mask |= 
7790: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
77a0: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66  MaskSet, p->pLef
77b0: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
77c0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
77d0: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
77e0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65    mask |= exprSe
77f0: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70  lectTableUsage(p
7800: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53  MaskSet, p->x.pS
7810: 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  elect);.  }else{
7820: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
7830: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
7840: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70  pMaskSet, p->x.p
7850: 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  List);.  }.  ret
7860: 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74  urn mask;.}.stat
7870: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c  ic Bitmask exprL
7880: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 57 68  istTableUsage(Wh
7890: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
78a0: 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a  kSet, ExprList *
78b0: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
78c0: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20  .  Bitmask mask 
78d0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 0;.  if( pList
78e0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
78f0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
7900: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73   i++){.      mas
7910: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
7920: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c  age(pMaskSet, pL
7930: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
7940: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7950: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61  turn mask;.}.sta
7960: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
7970: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
7980: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
7990: 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20  MaskSet, Select 
79a0: 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  *pS){.  Bitmask 
79b0: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c  mask = 0;.  whil
79c0: 65 28 20 70 53 20 29 7b 0a 20 20 20 20 53 72 63  e( pS ){.    Src
79d0: 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 53 2d  List *pSrc = pS-
79e0: 3e 70 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20  >pSrc;.    mask 
79f0: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
7a00: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
7a10: 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  pS->pEList);.   
7a20: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
7a30: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
7a40: 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70  kSet, pS->pGroup
7a50: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
7a60: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
7a70: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
7a80: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
7a90: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
7aa0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
7ab0: 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , pS->pWhere);. 
7ac0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
7ad0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
7ae0: 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29  et, pS->pHaving)
7af0: 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  ;.    if( ALWAYS
7b00: 28 70 53 72 63 21 3d 30 29 20 29 7b 0a 20 20 20  (pSrc!=0) ){.   
7b10: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
7b20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
7b30: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
7b40: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
7b50: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
7b60: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63  e(pMaskSet, pSrc
7b70: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
7b80: 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d  .        mask |=
7b90: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
7ba0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e  pMaskSet, pSrc->
7bb0: 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 20  a[i].pOn);.     
7bc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 20   }.    }.    pS 
7bd0: 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  = pS->pPrior;.  
7be0: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
7bf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7c00: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
7c10: 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f  en operator is o
7c20: 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
7c30: 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61  ors that is.** a
7c40: 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e  llowed for an in
7c50: 64 65 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c  dexable WHERE cl
7c60: 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20  ause term.  The 
7c70: 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72  allowed operator
7c80: 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c  s are.** "=", "<
7c90: 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e  ", ">", "<=", ">
7ca0: 3d 22 2c 20 22 49 4e 22 2c 20 61 6e 64 20 22 49  =", "IN", and "I
7cb0: 53 20 4e 55 4c 4c 22 0a 2a 2f 0a 73 74 61 74 69  S NULL".*/.stati
7cc0: 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28  c int allowedOp(
7cd0: 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72  int op){.  asser
7ce0: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26  t( TK_GT>TK_EQ &
7cf0: 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b  & TK_GT<TK_GE );
7d00: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54  .  assert( TK_LT
7d10: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c  >TK_EQ && TK_LT<
7d20: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
7d30: 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26  t( TK_LE>TK_EQ &
7d40: 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b  & TK_LE<TK_GE );
7d50: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45  .  assert( TK_GE
7d60: 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72  ==TK_EQ+4 );.  r
7d70: 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20  eturn op==TK_IN 
7d80: 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26  || (op>=TK_EQ &&
7d90: 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f   op<=TK_GE) || o
7da0: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a  p==TK_ISNULL;.}.
7db0: 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20  ./*.** Swap two 
7dc0: 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20  objects of type 
7dd0: 54 59 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  TYPE..*/.#define
7de0: 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20   SWAP(TYPE,A,B) 
7df0: 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20  {TYPE t=A; A=B; 
7e00: 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  B=t;}../*.** Com
7e10: 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f  mute a compariso
7e20: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70  n operator.  Exp
7e30: 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
7e40: 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a  form "X op Y".**
7e50: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
7e60: 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a  nto "Y op X"..**
7e70: 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72 69 67 68  .** If left/righ
7e80: 74 20 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c  t precedence rul
7e90: 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61  es come into pla
7ea0: 79 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69  y when determini
7eb0: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74  ng the.** collat
7ec0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 74 68  ing sequence, th
7ed0: 65 6e 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  en COLLATE opera
7ee0: 74 6f 72 73 20 61 72 65 20 61 64 6a 75 73 74 65  tors are adjuste
7ef0: 64 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74  d to ensure.** t
7f00: 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  hat the collatin
7f10: 67 20 73 65 71 75 65 6e 63 65 20 64 6f 65 73 20  g sequence does 
7f20: 6e 6f 74 20 63 68 61 6e 67 65 2e 20 20 46 6f 72  not change.  For
7f30: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20   example:.** "Y 
7f40: 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f  collate NOCASE o
7f50: 70 20 58 22 20 62 65 63 6f 6d 65 73 20 22 58 20  p X" becomes "X 
7f60: 6f 70 20 59 22 20 62 65 63 61 75 73 65 20 61 6e  op Y" because an
7f70: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
7f80: 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c  ence on.** the l
7f90: 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  eft hand side of
7fa0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76   a comparison ov
7fb0: 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c  errides any coll
7fc0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a  ation sequence .
7fd0: 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ** attached to t
7fe0: 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68  he right. For th
7ff0: 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68  e same reason th
8000: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61  e EP_Collate fla
8010: 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d  g.** is not comm
8020: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
8030: 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65  void exprCommute
8040: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8050: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
8060: 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20 28  u16 expRight = (
8070: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
8080: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
8090: 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66  e);.  u16 expLef
80a0: 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66  t = (pExpr->pLef
80b0: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
80c0: 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  llate);.  assert
80d0: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70  ( allowedOp(pExp
80e0: 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d  r->op) && pExpr-
80f0: 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op!=TK_IN );.  
8100: 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d 65 78  if( expRight==ex
8110: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20  pLeft ){.    /* 
8120: 45 69 74 68 65 72 20 58 20 61 6e 64 20 59 20 62  Either X and Y b
8130: 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  oth have COLLATE
8140: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e 65 69   operator or nei
8150: 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69  ther do */.    i
8160: 66 28 20 65 78 70 52 69 67 68 74 20 29 7b 0a 20  f( expRight ){. 
8170: 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58 20 61       /* Both X a
8180: 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54  nd Y have COLLAT
8190: 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d 61  E operators.  Ma
81a0: 6b 65 20 73 75 72 65 20 58 20 69 73 20 61 6c 77  ke sure X is alw
81b0: 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  ays.      ** use
81c0: 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68  d by clearing th
81d0: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61  e EP_Collate fla
81e0: 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20  g from Y. */.   
81f0: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
8200: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43  ->flags &= ~EP_C
8210: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73  ollate;.    }els
8220: 65 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70  e if( sqlite3Exp
8230: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
8240: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
8250: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65  0 ){.      /* Ne
8260: 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20 68 61  ither X nor Y ha
8270: 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  ve COLLATE opera
8280: 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61 73 20  tors, but X has 
8290: 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20  a non-default.  
82a0: 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67      ** collating
82b0: 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f 20 61   sequence.  So a
82c0: 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74  dd the EP_Collat
82d0: 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f  e marker on X to
82e0: 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20   cause.      ** 
82f0: 69 74 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  it to be searche
8300: 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20  d first. */.    
8310: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e    pExpr->pLeft->
8320: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c  flags |= EP_Coll
8330: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ate;.    }.  }. 
8340: 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70   SWAP(Expr*,pExp
8350: 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d  r->pRight,pExpr-
8360: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
8370: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
8380: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ){.    assert( T
8390: 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
83a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
83b0: 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20  GE==TK_LE+2 );. 
83c0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
83d0: 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  >TK_EQ );.    as
83e0: 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c  sert( TK_GT<TK_L
83f0: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
8400: 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47   pExpr->op>=TK_G
8410: 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d  T && pExpr->op<=
8420: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78  TK_GE );.    pEx
8430: 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72  pr->op = ((pExpr
8440: 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54  ->op-TK_GT)^2)+T
8450: 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_GT;.  }.}../*.
8460: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f  ** Translate fro
8470: 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72  m TK_xx operator
8480: 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73   to WO_xx bitmas
8490: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  k..*/.static u16
84a0: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e   operatorMask(in
84b0: 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a  t op){.  u16 c;.
84c0: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
84d0: 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28  dOp(op) );.  if(
84e0: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
84f0: 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d    c = WO_IN;.  }
8500: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
8510: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20  ISNULL ){.    c 
8520: 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d  = WO_ISNULL;.  }
8530: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
8540: 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b  ( (WO_EQ<<(op-TK
8550: 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20 29  _EQ)) < 0x7fff )
8560: 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29 28  ;.    c = (u16)(
8570: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
8580: 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
8590: 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op!=TK_ISNULL 
85a0: 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  || c==WO_ISNULL 
85b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
85c0: 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_IN || c==WO_
85d0: 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IN );.  assert( 
85e0: 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d  op!=TK_EQ || c==
85f0: 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72  WO_EQ );.  asser
8600: 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  t( op!=TK_LT || 
8610: 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73  c==WO_LT );.  as
8620: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20  sert( op!=TK_LE 
8630: 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20  || c==WO_LE );. 
8640: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
8650: 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29  GT || c==WO_GT )
8660: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
8670: 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47  TK_GE || c==WO_G
8680: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b  E );.  return c;
8690: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
86a0: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68  e to the next Wh
86b0: 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74  ereTerm that mat
86c0: 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  ches according t
86d0: 6f 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  o the criteria.*
86e0: 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20 77 68  * established wh
86f0: 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a  en the pScan obj
8700: 65 63 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69  ect was initiali
8710: 7a 65 64 20 62 79 20 77 68 65 72 65 53 63 61 6e  zed by whereScan
8720: 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72  Init()..** Retur
8730: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
8740: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63  are no more matc
8750: 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e  hing WhereTerms.
8760: 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
8770: 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e  Term *whereScanN
8780: 65 78 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70  ext(WhereScan *p
8790: 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75  Scan){.  int iCu
87a0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
87b0: 20 54 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74   The cursor on t
87c0: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65  he LHS of the te
87d0: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rm */.  int iCol
87e0: 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  umn;         /* 
87f0: 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  The column on th
8800: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72  e LHS of the ter
8810: 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a  m.  -1 for IPK *
8820: 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20  /.  Expr *pX;   
8830: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
8840: 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20  xpression being 
8850: 74 65 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72  tested */.  Wher
8860: 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
8870: 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f   /* Shorthand fo
8880: 72 20 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a  r pScan->pWC */.
8890: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
88a0: 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65  rm;    /* The te
88b0: 72 6d 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  rm being tested 
88c0: 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53 63  */.  int k = pSc
88d0: 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65  an->k;    /* Whe
88e0: 72 65 20 74 6f 20 73 74 61 72 74 20 73 63 61 6e  re to start scan
88f0: 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77 68 69 6c 65  ning */..  while
8900: 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c  ( pScan->iEquiv<
8910: 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29  =pScan->nEquiv )
8920: 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53 63  {.    iCur = pSc
8930: 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e  an->aEquiv[pScan
8940: 2d 3e 69 45 71 75 69 76 2d 32 5d 3b 0a 20 20 20  ->iEquiv-2];.   
8950: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53 63 61 6e   iColumn = pScan
8960: 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e  ->aEquiv[pScan->
8970: 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20 77  iEquiv-1];.    w
8980: 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63  hile( (pWC = pSc
8990: 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20  an->pWC)!=0 ){. 
89a0: 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70       for(pTerm=p
89b0: 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e  WC->a+k; k<pWC->
89c0: 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72  nTerm; k++, pTer
89d0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
89e0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
89f0: 73 6f 72 3d 3d 69 43 75 72 20 26 26 20 70 54 65  sor==iCur && pTe
8a00: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
8a10: 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ==iColumn ){.   
8a20: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
8a30: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8a40: 4f 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20  O_EQUIV)!=0.    
8a50: 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d         && pScan-
8a60: 3e 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a  >nEquiv<ArraySiz
8a70: 65 28 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 29  e(pScan->aEquiv)
8a80: 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
8a90: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
8aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20  .            pX 
8ab0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
8ac0: 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e  pCollate(pTerm->
8ad0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
8af0: 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43  rt( pX->op==TK_C
8b00: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
8b10: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
8b20: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a  pScan->nEquiv; j
8b30: 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +=2){.          
8b40: 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61      if( pScan->a
8b50: 45 71 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54  Equiv[j]==pX->iT
8b60: 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
8b70: 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 45      && pScan->aE
8b80: 71 75 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69  quiv[j+1]==pX->i
8b90: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
8bb0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
8bc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
8bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8be0: 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69   j==pScan->nEqui
8bf0: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  v ){.           
8c00: 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76     pScan->aEquiv
8c10: 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  [j] = pX->iTable
8c20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8c30: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b  pScan->aEquiv[j+
8c40: 31 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e  1] = pX->iColumn
8c50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8c60: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d  pScan->nEquiv +=
8c70: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   2;.            
8c80: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
8c90: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
8ca0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8cb0: 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d  pScan->opMask)!=
8cc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8cd0: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61   /* Verify the a
8ce0: 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c  ffinity and coll
8cf0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d  ating sequence m
8d00: 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
8d10: 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a      if( pScan->z
8d20: 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65  CollName && (pTe
8d30: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8d40: 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b  WO_ISNULL)==0 ){
8d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43  .              C
8d60: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72               Par
8d80: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
8d90: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
8da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8db0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
8dc0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
8dd0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
8de0: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c  exAffinityOk(pX,
8df0: 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20   pScan->idxaff) 
8e00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8e10: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8e20: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8e30: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
8e40: 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t(pX->pLeft);.  
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
8e60: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
8e70: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
8e80: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8eb0: 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c            pX->pL
8ec0: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
8ed0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8ee0: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
8ef0: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
8f00: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8f20: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
8f30: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63  Coll->zName, pSc
8f40: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29  an->zCollName) )
8f50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8f60: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8f70: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8f80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8f90: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
8fa0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
8fb0: 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 20 20 20  _EQ)!=0.        
8fc0: 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 70 54       && (pX = pT
8fd0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
8fe0: 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ht)->op==TK_COLU
8ff0: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  MN.             
9000: 26 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pX->iTable==p
9010: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a  Scan->aEquiv[0].
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
9030: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63  pX->iColumn==pSc
9040: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20  an->aEquiv[1].  
9050: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
9060: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
9070: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
9080: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
9090: 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20  Scan->k = k+1;. 
90a0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
90b0: 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  n pTerm;.       
90c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
90d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63       }.      pSc
90e0: 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d  an->pWC = pScan-
90f0: 3e 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20  >pWC->pOuter;.  
9100: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d      k = 0;.    }
9110: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20  .    pScan->pWC 
9120: 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43  = pScan->pOrigWC
9130: 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20  ;.    k = 0;.   
9140: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b   pScan->iEquiv +
9150: 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 2;.  }.  retur
9160: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
9170: 69 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45  itialize a WHERE
9180: 20 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20   clause scanner 
9190: 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20  object.  Return 
91a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
91b0: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e  .** first match.
91c0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
91d0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61   there are no ma
91e0: 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tches..**.** The
91f0: 20 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65   scanner will be
9200: 20 73 65 61 72 63 68 69 6e 67 20 74 68 65 20 57   searching the W
9210: 48 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e  HERE clause pWC.
9220: 20 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a    It will look.*
9230: 2a 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74  * for terms of t
9240: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
9250: 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 58 20  <expr>" where X 
9260: 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d  is column iColum
9270: 6e 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43  n of table.** iC
9280: 75 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75  ur.  The <op> mu
9290: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  st be one of the
92a0: 20 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63 72   operators descr
92b0: 69 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a  ibed by opMask..
92c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61  **.** If the sea
92d0: 72 63 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64  rch is for X and
92e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
92f0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73  e contains terms
9300: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20   of the.** form 
9310: 58 3d 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f  X=Y then this ro
9320: 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f  utine might also
9330: 20 72 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66   return terms of
9340: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20   the form.** "Y 
9350: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54  <op> <expr>".  T
9360: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  he number of lev
9370: 65 6c 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76  els of transitiv
9380: 69 74 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a  ity is limited,.
9390: 2a 2a 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68  ** but is enough
93a0: 20 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20   to handle most 
93b0: 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69  commonly occurri
93c0: 6e 67 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ng SQL statement
93d0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73  s..**.** If X is
93e0: 20 6e 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52   not the INTEGER
93f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65   PRIMARY KEY the
9400: 6e 20 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70  n X must be comp
9410: 61 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69  atible with.** i
9420: 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74  ndex pIdx..*/.st
9430: 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a  atic WhereTerm *
9440: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20  whereScanInit(. 
9450: 20 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61   WhereScan *pSca
9460: 6e 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  n,       /* The 
9470: 57 68 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74  WhereScan object
9480: 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a   being initializ
9490: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ed */.  WhereCla
94a0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
94b0: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
94c0: 75 73 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  use to be scanne
94d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
94f0: 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e  * Cursor to scan
9500: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43   for */.  int iC
9510: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
9520: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73    /* Column to s
9530: 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32  can for */.  u32
9540: 20 6f 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20   opMask,        
9550: 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72       /* Operator
9560: 28 73 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  (s) to scan for 
9570: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9590: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
95a0: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
95b0: 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  ex */.){.  int j
95c0: 3b 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  ;..  /* memset(p
95d0: 53 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Scan, 0, sizeof(
95e0: 2a 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70  *pScan)); */.  p
95f0: 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20  Scan->pOrigWC = 
9600: 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57  pWC;.  pScan->pW
9610: 43 20 3d 20 70 57 43 3b 0a 20 20 69 66 28 20 70  C = pWC;.  if( p
9620: 49 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d  Idx && iColumn>=
9630: 30 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  0 ){.    pScan->
9640: 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70  idxaff = pIdx->p
9650: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
9660: 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  umn].affinity;. 
9670: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78     for(j=0; pIdx
9680: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69  ->aiColumn[j]!=i
9690: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
96a0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e      if( NEVER(j>
96b0: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20  =pIdx->nColumn) 
96c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
96d0: 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f  }.    pScan->zCo
96e0: 6c 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61  llName = pIdx->a
96f0: 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73  zColl[j];.  }els
9700: 65 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64  e{.    pScan->id
9710: 78 61 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53  xaff = 0;.    pS
9720: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d  can->zCollName =
9730: 20 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d   0;.  }.  pScan-
9740: 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b  >opMask = opMask
9750: 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30  ;.  pScan->k = 0
9760: 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  ;.  pScan->aEqui
9770: 76 5b 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70  v[0] = iCur;.  p
9780: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20  Scan->aEquiv[1] 
9790: 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63  = iColumn;.  pSc
97a0: 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a  an->nEquiv = 2;.
97b0: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20    pScan->iEquiv 
97c0: 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 77 68  = 2;.  return wh
97d0: 65 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61  ereScanNext(pSca
97e0: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  n);.}../*.** Sea
97f0: 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69  rch for a term i
9800: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
9810: 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68  se that is of th
9820: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
9830: 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20  expr>".** where 
9840: 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  X is a reference
9850: 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20   to the iColumn 
9860: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e  of table iCur an
9870: 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66  d <op> is one of
9880: 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70  .** the WO_xx op
9890: 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65  erator codes spe
98a0: 63 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70  cified by the op
98b0: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52   parameter..** R
98c0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
98d0: 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65  to the term.  Re
98e0: 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f  turn 0 if not fo
98f0: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  und..**.** The t
9900: 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67  erm returned mig
9910: 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69  ht by Y=<expr> i
9920: 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68  f there is anoth
9930: 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e  er constraint in
9940: 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
9950: 61 75 73 65 20 74 68 61 74 20 73 70 65 63 69 66  ause that specif
9960: 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41  ies that X=Y.  A
9970: 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69  ny such constrai
9980: 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69  nts will be.** i
9990: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
99a0: 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e   WO_EQUIV bit in
99b0: 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65   the pTerm->eOpe
99c0: 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68  rator field.  Th
99d0: 65 0a 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61 72  e.** aEquiv[] ar
99e0: 72 61 79 20 68 6f 6c 64 73 20 58 20 61 6e 64 20  ray holds X and 
99f0: 61 6c 6c 20 69 74 73 20 65 71 75 69 76 61 6c 65  all its equivale
9a00: 6e 74 73 2c 20 77 69 74 68 20 65 61 63 68 20 53  nts, with each S
9a10: 51 4c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74  QL variable.** t
9a20: 61 6b 69 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f  aking up two slo
9a30: 74 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20  ts in aEquiv[]. 
9a40: 20 54 68 65 20 66 69 72 73 74 20 73 6c 6f 74 20   The first slot 
9a50: 69 73 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f  is for the curso
9a60: 72 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20  r number.** and 
9a70: 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 66 6f  the second is fo
9a80: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  r the column num
9a90: 62 65 72 2e 20 20 54 68 65 72 65 20 61 72 65 20  ber.  There are 
9aa0: 32 32 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75  22 slots in aEqu
9ab0: 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20  iv[].** so that 
9ac0: 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f  means we can loo
9ad0: 6b 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20  k for X plus up 
9ae0: 74 6f 20 31 30 20 6f 74 68 65 72 20 65 71 75 69  to 10 other equi
9af0: 76 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a  valent values..*
9b00: 2a 20 48 65 6e 63 65 20 61 20 73 65 61 72 63 68  * Hence a search
9b10: 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75   for X will retu
9b20: 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41  rn <expr> if X=A
9b30: 31 20 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20  1 and A1=A2 and 
9b40: 41 32 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e  A2=A3.** and ...
9b50: 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20   and A9=A10 and 
9b60: 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a  A10=<expr>..**.*
9b70: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6d  * If there are m
9b80: 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e  ultiple terms in
9b90: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
9ba0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  e of the form "X
9bb0: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a   <op> <expr>".**
9bc0: 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68   then try for th
9bd0: 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65  e one with no de
9be0: 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65  pendencies on <e
9bf0: 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20  xpr> - in other 
9c00: 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c  words where.** <
9c10: 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74  expr> is a const
9c20: 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ant expression o
9c30: 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e  f some kind.  On
9c40: 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65  ly return entrie
9c50: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
9c60: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
9c70: 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  e Y is a column 
9c80: 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  in another table
9c90: 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a   if no terms of.
9ca0: 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  ** the form "X <
9cb0: 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e  op> <const-expr>
9cc0: 22 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f  " exist.   If no
9cd0: 20 74 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f   terms with a co
9ce0: 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78  nstant RHS.** ex
9cf0: 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75  ist, try to retu
9d00: 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20 64  rn a term that d
9d10: 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45  oes not use WO_E
9d20: 51 55 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  QUIV..*/.static 
9d30: 57 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54  WhereTerm *findT
9d40: 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75  erm(.  WhereClau
9d50: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20  se *pWC,     /* 
9d60: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
9d70: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
9d80: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
9d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
9da0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c  rsor number of L
9db0: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  HS */.  int iCol
9dc0: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  umn,          /*
9dd0: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
9de0: 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61  f LHS */.  Bitma
9df0: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
9e00: 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74   /* RHS must not
9e10: 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74 68   overlap with th
9e20: 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32  is mask */.  u32
9e30: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
9e40: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f     /* Mask of WO
9e50: 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73 63 72  _xx values descr
9e60: 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a  ibing operator *
9e70: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
9e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
9e90: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
9ea0: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c  with this index,
9eb0: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
9ec0: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
9ed0: 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57  pResult = 0;.  W
9ee0: 68 65 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57  hereTerm *p;.  W
9ef0: 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a  hereScan scan;..
9f00: 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49    p = whereScanI
9f10: 6e 69 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20  nit(&scan, pWC, 
9f20: 69 43 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f  iCur, iColumn, o
9f30: 70 2c 20 70 49 64 78 29 3b 0a 20 20 77 68 69 6c  p, pIdx);.  whil
9f40: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
9f50: 28 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  (p->prereqRight 
9f60: 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29  & notReady)==0 )
9f70: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
9f80: 72 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26  rereqRight==0 &&
9f90: 20 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57   (p->eOperator&W
9fa0: 4f 5f 45 51 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_EQ)!=0 ){.    
9fb0: 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20      return p;.  
9fc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9fd0: 70 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65  pResult==0 ) pRe
9fe0: 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  sult = p;.    }.
9ff0: 20 20 20 20 70 20 3d 20 77 68 65 72 65 53 63 61      p = whereSca
a000: 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20  nNext(&scan);.  
a010: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73 75  }.  return pResu
a020: 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  lt;.}../* Forwar
a030: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
a040: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
a050: 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c  nalyze(SrcList*,
a060: 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69   WhereClause*, i
a070: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  nt);../*.** Call
a080: 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20   exprAnalyze on 
a090: 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57  all terms in a W
a0a0: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a  HERE clause.  .*
a0b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
a0c0: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20  prAnalyzeAll(.  
a0d0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
a0e0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  t,       /* the 
a0f0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
a100: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
a110: 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  C         /* the
a120: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
a130: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
a140: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
a150: 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31  r(i=pWC->nTerm-1
a160: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
a170: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54    exprAnalyze(pT
a180: 61 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b  abList, pWC, i);
a190: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
a1a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
a1b0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a  _OPTIMIZATION./*
a1c0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
a1d0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
a1e0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49  pression is a LI
a1f0: 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61  KE or GLOB opera
a200: 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20  tor that.** can 
a210: 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  be optimized usi
a220: 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ng inequality co
a230: 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75  nstraints.  Retu
a240: 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
a250: 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65  .** so and false
a260: 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49   if not..**.** I
a270: 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  n order for the 
a280: 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f  operator to be o
a290: 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20  ptimizible, the 
a2a0: 52 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 74  RHS must be a st
a2b0: 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20  ring.** literal 
a2c0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  that does not be
a2d0: 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63  gin with a wildc
a2e0: 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  ard.  .*/.static
a2f0: 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f   int isLikeOrGlo
a300: 62 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  b(.  Parse *pPar
a310: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
a320: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
a330: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
a340: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
a350: 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69       /* Test thi
a360: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
a370: 20 20 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69    Expr **ppPrefi
a380: 78 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  x,  /* Pointer t
a390: 6f 20 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72  o TK_STRING expr
a3a0: 65 73 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74  ession with patt
a3b0: 65 72 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20  ern prefix */.  
a3c0: 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  int *pisComplete
a3d0: 2c 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  , /* True if the
a3e0: 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69   only wildcard i
a3f0: 73 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20  s % in the last 
a400: 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69  character */.  i
a410: 6e 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20  nt *pnoCase     
a420: 20 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65   /* True if uppe
a430: 72 63 61 73 65 20 69 73 20 65 71 75 69 76 61 6c  rcase is equival
a440: 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65  ent to lowercase
a450: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
a460: 68 61 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20  har *z = 0;     
a470: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e      /* String on
a480: 20 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65   RHS of LIKE ope
a490: 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20  rator */.  Expr 
a4a0: 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
a4b0: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61        /* Right a
a4c0: 6e 64 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20  nd left size of 
a4d0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
a4e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
a4f0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
a500: 20 4c 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64   List of operand
a510: 73 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70  s to the LIKE op
a520: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
a530: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
a540: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68         /* One ch
a550: 61 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a  aracter in z[] *
a560: 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20  /.  int cnt;    
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a580: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d  * Number of non-
a590: 77 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20  wildcard prefix 
a5a0: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
a5b0: 63 68 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20  char wc[3];     
a5c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69             /* Wi
a5d0: 6c 64 63 61 72 64 20 63 68 61 72 61 63 74 65 72  ldcard character
a5e0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
a5f0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a600: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
a610: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  nnection */.  sq
a620: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
a630: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b  l = 0;.  int op;
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66      /* Opcode of
a660: 20 70 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66   pRight */..  if
a670: 28 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65  ( !sqlite3IsLike
a680: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78  Function(db, pEx
a690: 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29  pr, pnoCase, wc)
a6a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
a6b0: 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
a6c0: 49 54 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28  ITE_EBCDIC.  if(
a6d0: 20 2a 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75   *pnoCase ) retu
a6e0: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70  rn 0;.#endif.  p
a6f0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
a700: 70 4c 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d  pList;.  pLeft =
a710: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
a720: 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d  pr;.  if( pLeft-
a730: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a  >op!=TK_COLUMN .
a740: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70     || sqlite3Exp
a750: 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29  rAffinity(pLeft)
a760: 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  !=SQLITE_AFF_TEX
a770: 54 20 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75  T .   || IsVirtu
a780: 61 6c 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a  al(pLeft->pTab).
a790: 20 20 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a    ){.    /* IMP:
a7a0: 20 52 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54   R-02065-49465 T
a7b0: 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  he left-hand sid
a7c0: 65 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72  e of the LIKE or
a7d0: 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d   GLOB operator m
a7e0: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68  ust.    ** be th
a7f0: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64  e name of an ind
a800: 65 78 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68  exed column with
a810: 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20   TEXT affinity. 
a820: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
a830: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
a840: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28  Left->iColumn!=(
a850: 2d 31 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73  -1) ); /* Becaus
a860: 65 20 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20  e IPK never has 
a870: 41 46 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70  AFF_TEXT */..  p
a880: 52 69 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61  Right = pList->a
a890: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20  [0].pExpr;.  op 
a8a0: 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20  = pRight->op;.  
a8b0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
a8c0: 54 45 52 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  TER ){.    op = 
a8d0: 70 52 69 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d  pRight->op2;.  }
a8e0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41  .  if( op==TK_VA
a8f0: 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64  RIABLE ){.    Vd
a900: 62 65 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d  be *pReprepare =
a910: 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70   pParse->pReprep
a920: 61 72 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  are;.    int iCo
a930: 6c 20 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c  l = pRight->iCol
a940: 75 6d 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20  umn;.    pVal = 
a950: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f  sqlite3VdbeGetBo
a960: 75 6e 64 56 61 6c 75 65 28 70 52 65 70 72 65 70  undValue(pReprep
a970: 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54  are, iCol, SQLIT
a980: 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20  E_AFF_NONE);.   
a990: 20 69 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c   if( pVal && sql
a9a0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
a9b0: 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45  pVal)==SQLITE_TE
a9c0: 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  XT ){.      z = 
a9d0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
a9e0: 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
a9f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
aa00: 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
aa10: 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  k(pParse->pVdbe,
aa20: 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65   iCol);.    asse
aa30: 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  rt( pRight->op==
aa40: 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70  TK_VARIABLE || p
aa50: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  Right->op==TK_RE
aa60: 47 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73  GISTER );.  }els
aa70: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52  e if( op==TK_STR
aa80: 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70  ING ){.    z = p
aa90: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  Right->u.zToken;
aaa0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a  .  }.  if( z ){.
aab0: 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20      cnt = 0;.   
aac0: 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74   while( (c=z[cnt
aad0: 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30  ])!=0 && c!=wc[0
aae0: 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26  ] && c!=wc[1] &&
aaf0: 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20   c!=wc[2] ){.   
ab00: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a     cnt++;.    }.
ab10: 20 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26      if( cnt!=0 &
ab20: 26 20 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74  & 255!=(u8)z[cnt
ab30: 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70  -1] ){.      Exp
ab40: 72 20 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20  r *pPrefix;.    
ab50: 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d    *pisComplete =
ab60: 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63   c==wc[0] && z[c
ab70: 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20  nt+1]==0;.      
ab80: 70 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65  pPrefix = sqlite
ab90: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52  3Expr(db, TK_STR
aba0: 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69  ING, z);.      i
abb0: 66 28 20 70 50 72 65 66 69 78 20 29 20 70 50 72  f( pPrefix ) pPr
abc0: 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63  efix->u.zToken[c
abd0: 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a  nt] = 0;.      *
abe0: 70 70 50 72 65 66 69 78 20 3d 20 70 50 72 65 66  ppPrefix = pPref
abf0: 69 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  ix;.      if( op
ac00: 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b  ==TK_VARIABLE ){
ac10: 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76  .        Vdbe *v
ac20: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
ac30: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ac40: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
ac50: 76 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75  v, pRight->iColu
ac60: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mn);.        if(
ac70: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26   *pisComplete &&
ac80: 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65   pRight->u.zToke
ac90: 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[1] ){.        
aca0: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20    /* If the rhs 
acb0: 6f 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72  of the LIKE expr
acc0: 65 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69  ession is a vari
acd0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75  able, and the cu
ace0: 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  rrent.          
acf0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
ad00: 76 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74  variable means t
ad10: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
ad20: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49  to invoke the LI
ad30: 4b 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  KE.          ** 
ad40: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e  function, then n
ad50: 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69  o OP_Variable wi
ad60: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
ad70: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20  he program..    
ad80: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61        ** This ca
ad90: 75 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f  uses problems fo
ada0: 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  r the sqlite3_bi
adb0: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
adc0: 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e().          **
add0: 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f   API. To workaro
ade0: 75 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20  und them, add a 
adf0: 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c  dummy OP_Variabl
ae00: 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20  e here..        
ae10: 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20    */ .          
ae20: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
ae30: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
ae40: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
ae50: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
ae60: 67 65 74 28 70 50 61 72 73 65 2c 20 70 52 69 67  get(pParse, pRig
ae70: 68 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  ht, r1);.       
ae80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
ae90: 61 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65  angeP3(v, sqlite
aea0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
aeb0: 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  (v)-1, 0);.     
aec0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
aed0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
aee0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
aef0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
af00: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30  lse{.      z = 0
af10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
af20: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
af30: 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVal);.  return 
af40: 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  (z!=0);.}.#endif
af50: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
af60: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
af70: 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  N */...#ifndef S
af80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
af90: 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68  ALTABLE./*.** Ch
afa0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
afb0: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
afc0: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
afd0: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  m.**.**         
afe0: 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70  column MATCH exp
aff0: 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  r.**.** If it is
b000: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55   then return TRU
b010: 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75  E.  If not, retu
b020: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
b030: 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f  tic int isMatchO
b040: 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20  fColumn(.  Expr 
b050: 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54  *pExpr      /* T
b060: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
b070: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ion */.){.  Expr
b080: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20  List *pList;..  
b090: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
b0a0: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
b0b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
b0c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
b0d0: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
b0e0: 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30  oken,"match")!=0
b0f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
b100: 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20  ;.  }.  pList = 
b110: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
b120: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
b130: 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74  pr!=2 ){.    ret
b140: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
b150: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
b160: 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c  pr->op != TK_COL
b170: 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  UMN ){.    retur
b180: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
b190: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
b1a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
b1b0: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
b1c0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65  .** If the pBase
b1d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
b1e0: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
b1f0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
b200: 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74   of.** a join, t
b210: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
b220: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72   appropriate mar
b230: 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65  kings over to de
b240: 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  rived..*/.static
b250: 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f   void transferJo
b260: 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20  inMarkings(Expr 
b270: 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20  *pDerived, Expr 
b280: 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69  *pBase){.  pDeri
b290: 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42  ved->flags |= pB
b2a0: 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ase->flags & EP_
b2b0: 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72  FromJoin;.  pDer
b2c0: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
b2d0: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
b2e0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
b2f0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
b300: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
b310: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
b320: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b330: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f  OMIT_SUBQUERY)./
b340: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74  *.** Analyze a t
b350: 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74  erm that consist
b360: 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  s of two or more
b370: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a   OR-connected.**
b380: 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69   subterms.  So i
b390: 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e  n:.**.**     ...
b3a0: 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e   WHERE  (a=5) AN
b3b0: 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52  D (b=7 OR c=9 OR
b3c0: 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33   d=13) AND (d=13
b3d0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e                ^^
b3f0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
b400: 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ^^.**.** This ro
b410: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74  utine analyzes t
b420: 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68 65  erms such as the
b430: 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20   middle term in 
b440: 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c  the above exampl
b450: 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54  e..** A WhereOrT
b460: 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  erm object is co
b470: 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61 63  mputed and attac
b480: 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20  hed to the term 
b490: 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69  under.** analysi
b4a0: 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  s, regardless of
b4b0: 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20   the outcome of 
b4c0: 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48  the analysis.  H
b4d0: 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ence:.**.**     
b4e0: 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67  WhereTerm.wtFlag
b4f0: 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49  s   |=  TERM_ORI
b500: 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  NFO.**     Where
b510: 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20  Term.u.pOrInfo  
b520: 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  =  a dynamically
b530: 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65   allocated Where
b540: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a  OrTerm object.**
b550: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69  .** The term bei
b560: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74  ng analyzed must
b570: 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72   have two or mor
b580: 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  e of OR-connecte
b590: 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41  d subterms..** A
b5a0: 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20   single subterm 
b5b0: 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20 6f  might be a set o
b5c0: 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  f AND-connected 
b5d0: 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a  sub-subterms..**
b5e0: 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72   Examples of ter
b5f0: 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69  ms under analysi
b600: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29  s:.**.**     (A)
b610: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
b620: 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74  R t1.x=t2.z OR t
b630: 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74  1.y=15 OR t1.z=t
b640: 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29  3.a+5.**     (B)
b650: 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20       x=expr1 OR 
b660: 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70  expr2=x OR x=exp
b670: 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20  r3.**     (C)   
b680: 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28    t1.x=t2.y OR (
b690: 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31  t1.x=t2.z AND t1
b6a0: 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44  .y=15).**     (D
b6b0: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
b6c0: 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20   (y>11 AND y<22 
b6d0: 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c  AND z LIKE '*hel
b6e0: 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29  lo*').**     (E)
b6f0: 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20       (p.a=1 AND 
b700: 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29  q.b=2 AND r.c=3)
b710: 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71   OR (p.x=4 AND q
b720: 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a  .y=5 AND r.z=6).
b730: 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a  **.** CASE 1:.**
b740: 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65  .** If all subte
b750: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
b760: 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72  orm T.C=expr for
b770: 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c   some single col
b780: 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20  umn of C and.** 
b790: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54  a single table T
b7a0: 20 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78   (as shown in ex
b7b0: 61 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74  ample B above) t
b7c0: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
b7d0: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d   virtual.** term
b7e0: 20 74 68 61 74 20 69 73 20 61 6e 20 65 71 75 69   that is an equi
b7f0: 76 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73  valent IN expres
b800: 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20  sion.  In other 
b810: 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74 65  words, if the te
b820: 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c  rm.** being anal
b830: 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  yzed is:.**.**  
b840: 20 20 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f      x = expr1  O
b850: 52 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52  R  expr2 = x  OR
b860: 20 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a    x = expr3.**.*
b870: 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  * then create a 
b880: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
b890: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
b8a0: 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65 78 70  *      x IN (exp
b8b0: 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a  r1,expr2,expr3).
b8c0: 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a  **.** CASE 2:.**
b8d0: 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65  .** If all subte
b8e0: 72 6d 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c  rms are indexabl
b8f0: 65 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61  e by a single ta
b900: 62 6c 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a  ble T, then set.
b910: 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  **.**     WhereT
b920: 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20  erm.eOperator   
b930: 20 20 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f             =  WO
b940: 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  _OR.**     Where
b950: 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  Term.u.pOrInfo->
b960: 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74  indexable  |=  t
b970: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
b980: 20 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a   for table T.**.
b990: 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20  ** A subterm is 
b9a0: 22 69 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69  "indexable" if i
b9b0: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
b9c0: 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65  .** "T.C <op> <e
b9d0: 78 70 72 3e 22 20 77 68 65 72 65 20 43 20 69 73  xpr>" where C is
b9e0: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   any column of t
b9f0: 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c  able T and .** <
ba00: 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d  op> is one of "=
ba10: 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e  ", "<", "<=", ">
ba20: 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c  ", ">=", "IS NUL
ba30: 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20  L", or "IN"..** 
ba40: 41 20 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73  A subterm is als
ba50: 6f 20 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69  o indexable if i
ba60: 74 20 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74  t is an AND of t
ba70: 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75  wo or more.** su
ba80: 62 73 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61  bsubterms at lea
ba90: 73 74 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20  st one of which 
baa0: 69 73 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49  is indexable.  I
bab0: 6e 64 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a  ndexable AND .**
bac0: 20 73 75 62 74 65 72 6d 73 20 68 61 76 65 20 74   subterms have t
bad0: 68 65 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73  heir eOperator s
bae0: 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64  et to WO_AND and
baf0: 20 74 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e   they have.** u.
bb00: 70 41 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20  pAndInfo set to 
bb10: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
bb20: 6c 6f 63 61 74 65 64 20 57 68 65 72 65 41 6e 64  located WhereAnd
bb30: 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  Term object..**.
bb40: 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20  ** From another 
bb50: 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22  point of view, "
bb60: 69 6e 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73  indexable" means
bb70: 20 74 68 61 74 20 74 68 65 20 73 75 62 74 65 72   that the subter
bb80: 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e  m could.** poten
bb90: 74 69 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77  tially be used w
bba0: 69 74 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20  ith an index if 
bbb0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 69  an appropriate i
bbc0: 6e 64 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20  ndex exists..** 
bbd0: 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f  This analysis do
bbe0: 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20  es not consider 
bbf0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
bc00: 68 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b  he index exists;
bc10: 20 74 68 61 74 0a 2a 2a 20 69 73 20 64 65 63 69   that.** is deci
bc20: 64 65 64 20 65 6c 73 65 77 68 65 72 65 2e 20 20  ded elsewhere.  
bc30: 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 6f 6e  This analysis on
bc40: 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74  ly looks at whet
bc50: 68 65 72 20 73 75 62 74 65 72 6d 73 0a 2a 2a 20  her subterms.** 
bc60: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
bc70: 69 6e 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a  indexing exist..
bc80: 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c  **.** All exampl
bc90: 65 73 20 41 20 74 68 72 6f 75 67 68 20 45 20 61  es A through E a
bca0: 62 6f 76 65 20 73 61 74 69 73 66 79 20 63 61 73  bove satisfy cas
bcb0: 65 20 32 2e 20 20 42 75 74 20 69 66 20 61 20 74  e 2.  But if a t
bcc0: 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74  erm.** also stat
bcd0: 69 73 66 69 65 73 20 63 61 73 65 20 31 20 28 73  isfies case 1 (s
bce0: 75 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f  uch as B) we kno
bcf0: 77 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  w that the optim
bd00: 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77  izer will.** alw
bd10: 61 79 73 20 70 72 65 66 65 72 20 63 61 73 65 20  ays prefer case 
bd20: 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61  1, so in that ca
bd30: 73 65 20 77 65 20 70 72 65 74 65 6e 64 20 74 68  se we pretend th
bd40: 61 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74  at case 2 is not
bd50: 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a  .** satisfied..*
bd60: 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65  *.** It might be
bd70: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 6d   the case that m
bd80: 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61  ultiple tables a
bd90: 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46  re indexable.  F
bda0: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28  or example,.** (
bdb0: 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65  E) above is inde
bdc0: 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20  xable on tables 
bdd0: 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a  P, Q, and R..**.
bde0: 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73 61  ** Terms that sa
bdf0: 74 69 73 66 79 20 63 61 73 65 20 32 20 61 72 65  tisfy case 2 are
be00: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
be10: 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a  lookup by using.
be20: 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64 69  ** separate indi
be30: 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69  ces to find rowi
be40: 64 73 20 66 6f 72 20 65 61 63 68 20 73 75 62 74  ds for each subt
be50: 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e  erm and composin
be60: 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f  g.** the union o
be70: 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69  f all rowids usi
be80: 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65  ng a RowSet obje
be90: 63 74 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ct.  This is sim
bea0: 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d  ilar.** to "bitm
beb0: 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f  ap indices" in o
bec0: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 65 6e  ther database en
bed0: 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48  gines..**.** OTH
bee0: 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66  ERWISE:.**.** If
bef0: 20 6e 65 69 74 68 65 72 20 63 61 73 65 20 31 20   neither case 1 
bf00: 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c 79  nor case 2 apply
bf10: 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65  , then leave the
bf20: 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74   eOperator set t
bf30: 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73  o.** zero.  This
bf40: 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65   term is not use
bf50: 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a  ful for search..
bf60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
bf70: 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d  xprAnalyzeOrTerm
bf80: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
bf90: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
bfa0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
bfb0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
bfc0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
bfd0: 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* the complete 
bfe0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
bff0: 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20    int idxTerm   
c000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
c010: 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74  ndex of the OR-t
c020: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
c030: 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  ed */.){.  Where
c040: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
c050: 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 20 20 20 20  WC->pWInfo;     
c060: 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75     /* WHERE clau
c070: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f  se processing co
c080: 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65  ntext */.  Parse
c090: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66   *pParse = pWInf
c0a0: 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20  o->pParse;      
c0b0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
c0c0: 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
c0d0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c0e0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
c0f0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
c100: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68  nnection */.  Wh
c110: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d  ereTerm *pTerm =
c120: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
c130: 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72  ];    /* The ter
c140: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
c150: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
c160: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
c170: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
c180: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
c190: 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20  of the term */. 
c1a0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
c1d0: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
c1e0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
c1f0: 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61  c;       /* Brea
c200: 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74  kup of pTerm int
c210: 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
c220: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
c230: 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53  rm;       /* A S
c240: 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74  ub-term within t
c250: 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68  he pOrWc */.  Wh
c260: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
c270: 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74  fo;     /* Addit
c280: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
c290: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  n associated wit
c2a0: 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74  h pTerm */.  Bit
c2b0: 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20  mask chngToIN;  
c2c0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
c2d0: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
c2e0: 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20  sfy case 1 */.  
c2f0: 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c  Bitmask indexabl
c300: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  e;        /* Tab
c310: 6c 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 64  les that are ind
c320: 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69  exable, satisfyi
c330: 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20  ng case 2 */..  
c340: 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68  /*.  ** Break th
c350: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f  e OR clause into
c360: 20 69 74 73 20 73 65 70 61 72 61 74 65 20 73 75   its separate su
c370: 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62  bterms.  The sub
c380: 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73  terms are.  ** s
c390: 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72 65  tored in a Where
c3a0: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
c3b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68   containing with
c3c0: 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e  in the WhereOrIn
c3d0: 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74  fo.  ** object t
c3e0: 68 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20  hat is attached 
c3f0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
c400: 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  OR clause term..
c410: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
c420: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
c430: 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54   (TERM_DYNAMIC|T
c440: 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f  ERM_ORINFO|TERM_
c450: 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a  ANDINFO))==0 );.
c460: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
c470: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20  >op==TK_OR );.  
c480: 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
c490: 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c   = pOrInfo = sql
c4a0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
c4b0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72  (db, sizeof(*pOr
c4c0: 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f  Info));.  if( pO
c4d0: 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  rInfo==0 ) retur
c4e0: 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  n;.  pTerm->wtFl
c4f0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e  ags |= TERM_ORIN
c500: 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70  FO;.  pOrWc = &p
c510: 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68  OrInfo->wc;.  wh
c520: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f  ereClauseInit(pO
c530: 72 57 63 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  rWc, pWInfo);.  
c540: 77 68 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63  whereSplit(pOrWc
c550: 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b  , pExpr, TK_OR);
c560: 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  .  exprAnalyzeAl
c570: 6c 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a  l(pSrc, pOrWc);.
c580: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
c590: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
c5a0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 57 63  .  assert( pOrWc
c5b0: 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20  ->nTerm>=2 );.. 
c5c0: 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65   /*.  ** Compute
c5d0: 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c   the set of tabl
c5e0: 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61  es that might sa
c5f0: 74 69 73 66 79 20 63 61 73 65 73 20 31 20 6f 72  tisfy cases 1 or
c600: 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78   2..  */.  index
c610: 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b  able = ~(Bitmask
c620: 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d  )0;.  chngToIN =
c630: 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
c640: 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65  for(i=pOrWc->nTe
c650: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f  rm-1, pOrTerm=pO
c660: 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20  rWc->a; i>=0 && 
c670: 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20  indexable; i--, 
c680: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
c690: 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
c6a0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e  perator & WO_SIN
c6b0: 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  GLE)==0 ){.     
c6c0: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
c6d0: 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61  AndInfo;.      a
c6e0: 73 73 65 72 74 28 20 28 70 4f 72 54 65 72 6d 2d  ssert( (pOrTerm-
c6f0: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
c700: 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52  _ANDINFO|TERM_OR
c710: 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20  INFO))==0 );.   
c720: 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b     chngToIN = 0;
c730: 0a 20 20 20 20 20 20 70 41 6e 64 49 6e 66 6f 20  .      pAndInfo 
c740: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c750: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
c760: 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20  *pAndInfo));.   
c770: 20 20 20 69 66 28 20 70 41 6e 64 49 6e 66 6f 20     if( pAndInfo 
c780: 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
c790: 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a  Clause *pAndWC;.
c7a0: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
c7b0: 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20  m *pAndTerm;.   
c7c0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
c7d0: 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20      Bitmask b = 
c7e0: 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  0;.        pOrTe
c7f0: 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d  rm->u.pAndInfo =
c800: 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20   pAndInfo;.     
c810: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
c820: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49  ags |= TERM_ANDI
c830: 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  NFO;.        pOr
c840: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
c850: 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20  = WO_AND;.      
c860: 20 20 70 41 6e 64 57 43 20 3d 20 26 70 41 6e 64    pAndWC = &pAnd
c870: 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
c880: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
c890: 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70  t(pAndWC, pWC->p
c8a0: 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
c8b0: 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64 57  whereSplit(pAndW
c8c0: 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  C, pOrTerm->pExp
c8d0: 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20  r, TK_AND);.    
c8e0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41      exprAnalyzeA
c8f0: 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43 29  ll(pSrc, pAndWC)
c900: 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43  ;.        pAndWC
c910: 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a  ->pOuter = pWC;.
c920: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
c930: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
c940: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ed );.        if
c950: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
c960: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
c970: 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e 64 54 65   for(j=0, pAndTe
c980: 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c  rm=pAndWC->a; j<
c990: 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a  pAndWC->nTerm; j
c9a0: 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b 2b 29 7b  ++, pAndTerm++){
c9b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
c9c0: 65 72 74 28 20 70 41 6e 64 54 65 72 6d 2d 3e 70  ert( pAndTerm->p
c9d0: 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20  Expr );.        
c9e0: 20 20 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f      if( allowedO
c9f0: 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70  p(pAndTerm->pExp
ca00: 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20 20 20 20  r->op) ){.      
ca10: 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74          b |= get
ca20: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
ca30: 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65 72 6d  askSet, pAndTerm
ca40: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
ca50: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
ca60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ca70: 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64 65 78   }.        index
ca80: 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20  able &= b;.     
ca90: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
caa0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
cab0: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  s & TERM_COPIED 
cac0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70  ){.      /* Skip
cad0: 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72 20 6e   this term for n
cae0: 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69 74 20  ow.  We revisit 
caf0: 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65  it when we proce
cb00: 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ss the.      ** 
cb10: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 45  corresponding TE
cb20: 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72 6d 20  RM_VIRTUAL term 
cb30: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
cb40: 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20      Bitmask b;. 
cb50: 20 20 20 20 20 62 20 3d 20 67 65 74 4d 61 73 6b       b = getMask
cb60: 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
cb70: 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  et, pOrTerm->lef
cb80: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
cb90: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  if( pOrTerm->wtF
cba0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
cbb0: 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 57  UAL ){.        W
cbc0: 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72  hereTerm *pOther
cbd0: 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72   = &pOrWc->a[pOr
cbe0: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a  Term->iParent];.
cbf0: 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74          b |= get
cc00: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
cc10: 61 73 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e  askSet, pOther->
cc20: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
cc30: 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 64 65 78     }.      index
cc40: 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20  able &= b;.     
cc50: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
cc60: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
cc70: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
cc80: 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  chngToIN = 0;.  
cc90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cca0: 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20 62     chngToIN &= b
ccb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ccc0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52    }..  /*.  ** R
ccd0: 65 63 6f 72 64 20 74 68 65 20 73 65 74 20 6f 66  ecord the set of
cce0: 20 74 61 62 6c 65 73 20 74 68 61 74 20 73 61 74   tables that sat
ccf0: 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 54 68  isfy case 2.  Th
cd00: 65 20 73 65 74 20 6d 69 67 68 74 20 62 65 0a 20  e set might be. 
cd10: 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   ** empty..  */.
cd20: 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78    pOrInfo->index
cd30: 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c 65  able = indexable
cd40: 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  ;.  pTerm->eOper
cd50: 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c 65  ator = indexable
cd60: 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b  ==0 ? 0 : WO_OR;
cd70: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67  ..  /*.  ** chng
cd80: 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73 65 74  ToIN holds a set
cd90: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
cda0: 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66 79 20  *might* satisfy 
cdb0: 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20 20 2a  case 1.  But.  *
cdc0: 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64 6f 20  * we have to do 
cdd0: 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
cde0: 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20  checking to see 
cdf0: 69 66 20 63 61 73 65 20 31 20 72 65 61 6c 6c 79  if case 1 really
ce00: 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73 66 69  .  ** is satisfi
ce10: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 68  ed..  **.  ** ch
ce20: 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c 64  ngToIN will hold
ce30: 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20 6f 72   either 0, 1, or
ce40: 20 32 20 62 69 74 73 2e 20 20 54 68 65 20 30 2d   2 bits.  The 0-
ce50: 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73 0a 20  bit case means. 
ce60: 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20 69   ** that there i
ce70: 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74 79  s no possibility
ce80: 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67   of transforming
ce90: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69   the OR clause i
cea0: 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f  nto an.  ** IN o
ceb0: 70 65 72 61 74 6f 72 20 62 65 63 61 75 73 65 20  perator because 
cec0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  one or more term
ced0: 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75  s in the OR clau
cee0: 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20  se contain.  ** 
cef0: 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
cf00: 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c  than == on a col
cf10: 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e 67 6c  umn in the singl
cf20: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 31 2d  e table.  The 1-
cf30: 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d 65  bit.  ** case me
cf40: 61 6e 73 20 74 68 61 74 20 65 76 65 72 79 20 74  ans that every t
cf50: 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63 6c  erm of the OR cl
cf60: 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 20 66  ause is of the f
cf70: 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65 2e  orm.  ** "table.
cf80: 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f 72  column=expr" for
cf90: 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61 62   some single tab
cfa0: 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62 69 74  le.  The one bit
cfb0: 20 74 68 61 74 20 69 73 20 73 65 74 0a 20 20 2a   that is set.  *
cfc0: 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f 6e  * will correspon
cfd0: 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  d to the common 
cfe0: 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69 6c 6c  table.  We still
cff0: 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 74   need to check t
d000: 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  o make.  ** sure
d010: 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
d020: 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c 20   is used on all 
d030: 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d 62 69  terms.  The 2-bi
d040: 74 20 63 61 73 65 20 69 73 20 77 68 65 6e 0a 20  t case is when. 
d050: 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65 72 6d   ** the all term
d060: 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72  s are of the for
d070: 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e  m "table1.column
d080: 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e  =table2.column".
d090: 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20    It.  ** might 
d0a0: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  be possible to f
d0b0: 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  orm an IN operat
d0c0: 6f 72 20 77 69 74 68 20 65 69 74 68 65 72 20 74  or with either t
d0d0: 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a  able1.column.  *
d0e0: 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c 75  * or table2.colu
d0f0: 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20 69 66  mn as the LHS if
d100: 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d 6d 6f   either is commo
d110: 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  n to every term 
d120: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20 63  of.  ** the OR c
d130: 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
d140: 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72 6d 73   Note that terms
d150: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61   of the form "ta
d160: 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c  ble.column1=tabl
d170: 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65 0a  e.column2" (the.
d180: 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20    ** same table 
d190: 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20 6f 66  on both sizes of
d1a0: 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74 20   the ==) cannot 
d1b0: 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20 20  be optimized..  
d1c0: 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54 6f 49  */.  if( chngToI
d1d0: 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 54  N ){.    int okT
d1e0: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20 20  oChngToIN = 0;  
d1f0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
d200: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20  e conversion to 
d210: 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  IN is valid */. 
d220: 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d     int iColumn =
d230: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   -1;         /* 
d240: 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e 20  Column index on 
d250: 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  lhs of IN operat
d260: 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  or */.    int iC
d270: 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20 20  ursor = -1;     
d280: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 75 72      /* Table cur
d290: 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  sor common to al
d2a0: 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69  l terms */.    i
d2b0: 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20  nt j = 0;       
d2c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
d2d0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20   counter */..   
d2e0: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
d2f0: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
d300: 6e 20 74 68 61 74 20 61 70 70 65 61 72 73 20 6f  n that appears o
d310: 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68  n one side or th
d320: 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 6f  e.    ** other o
d330: 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61 74 6f  f the == operato
d340: 72 20 69 6e 20 65 76 65 72 79 20 73 75 62 74 65  r in every subte
d350: 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  rm.  That table 
d360: 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  and column.    *
d370: 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  * will be record
d380: 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20 61 6e  ed in iCursor an
d390: 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65 72  d iColumn.  Ther
d3a0: 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  e might not be a
d3b0: 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 74  ny.    ** such t
d3c0: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e  able and column.
d3d0: 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54 6f    Set okToChngTo
d3e0: 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72  IN if an appropr
d3f0: 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20 20 2a  iate table.    *
d400: 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20  * and column is 
d410: 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76 65 20  found but leave 
d420: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61 6c  okToChngToIN fal
d430: 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  se if not found.
d440: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
d450: 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b 54  j=0; j<2 && !okT
d460: 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b  oChngToIN; j++){
d470: 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d 20 3d  .      pOrTerm =
d480: 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20 20   pOrWc->a;.     
d490: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
d4a0: 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
d4b0: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
d4c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
d4d0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
d4e0: 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
d4f0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
d500: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
d510: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
d520: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
d530: 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 7b  rsor==iCursor ){
d540: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
d550: 69 73 20 69 73 20 74 68 65 20 32 2d 62 69 74 20  is is the 2-bit 
d560: 63 61 73 65 20 61 6e 64 20 77 65 20 61 72 65 20  case and we are 
d570: 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74  on the second it
d580: 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  eration and.    
d590: 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
d5a0: 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74 68   term is from th
d5b0: 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
d5c0: 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69 73  n.  So skip this
d5d0: 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20   term. */.      
d5e0: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31      assert( j==1
d5f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
d600: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
d610: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63  }.        if( (c
d620: 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61 73  hngToIN & getMas
d630: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
d640: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
d650: 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b  ftCursor))==0 ){
d660: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
d670: 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  is term must be 
d680: 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e 61  of the form t1.a
d690: 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32 20  ==t2.b where t2 
d6a0: 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  is in the.      
d6b0: 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20      ** chngToIN 
d6c0: 73 65 74 20 62 75 74 20 74 31 20 69 73 20 6e 6f  set but t1 is no
d6d0: 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77 69  t.  This term wi
d6e0: 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70 72 65  ll be either pre
d6f0: 63 65 65 64 65 64 0a 20 20 20 20 20 20 20 20 20  ceeded.         
d700: 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62   ** or follwed b
d710: 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20 63 6f  y an inverted co
d720: 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e  py (t2.b==t1.a).
d730: 20 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d    Skip this term
d740: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
d750: 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76 65 72  nd use its inver
d760: 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  sion. */.       
d770: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72     testcase( pOr
d780: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
d790: 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20  TERM_COPIED );. 
d7a0: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
d7b0: 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  e( pOrTerm->wtFl
d7c0: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
d7d0: 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  AL );.          
d7e0: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
d7f0: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
d800: 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49 52  _COPIED|TERM_VIR
d810: 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20 20 20  TUAL) );.       
d820: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
d830: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
d840: 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d  Column = pOrTerm
d850: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
d860: 20 20 20 20 20 20 20 20 69 43 75 72 73 6f 72 20          iCursor 
d870: 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  = pOrTerm->leftC
d880: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62  ursor;.        b
d890: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
d8a0: 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
d8b0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e         /* No can
d8c0: 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c  didate table+col
d8d0: 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20 20  umn was found.  
d8e0: 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  This can only oc
d8f0: 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  cur.        ** o
d900: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65  n the second ite
d910: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ration */.      
d920: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29    assert( j==1 )
d930: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d940: 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 63  ( IsPowerOfTwo(c
d950: 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20 20  hngToIN) );.    
d960: 20 20 20 20 61 73 73 65 72 74 28 20 63 68 6e 67      assert( chng
d970: 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 26 70  ToIN==getMask(&p
d980: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
d990: 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20   iCursor) );.   
d9a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d9b0: 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
d9c0: 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20  se( j==1 );..   
d9d0: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 66 6f     /* We have fo
d9e0: 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74 65 20  und a candidate 
d9f0: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
da00: 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
da10: 69 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  if that.      **
da20: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
da30: 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65  n is common to e
da40: 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
da50: 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   OR clause */.  
da60: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
da70: 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 1;.      for(
da80: 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43 68  ; i>=0 && okToCh
da90: 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72  ngToIN; i--, pOr
daa0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
dab0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
dac0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
dad0: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 69  _EQ );.        i
dae0: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
daf0: 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72 20  Cursor!=iCursor 
db00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  ){.          pOr
db10: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d  Term->wtFlags &=
db20: 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20   ~TERM_OR_OK;.  
db30: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
db40: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
db50: 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29  olumn!=iColumn )
db60: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f  {.          okTo
db70: 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  ChngToIN = 0;.  
db80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
db90: 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c 65         int affLe
dba0: 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20 20  ft, affRight;.  
dbb0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
dbc0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
dbd0: 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75  e is also a colu
dbe0: 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66  mn, then the aff
dbf0: 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20 20  inities.        
dc00: 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69 67    ** of both rig
dc10: 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64 65  ht and left side
dc20: 73 20 6d 75 73 74 20 62 65 20 73 75 63 68 20 74  s must be such t
dc30: 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20 20  hat no type.    
dc40: 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72 73        ** convers
dc50: 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72 65  ions are require
dc60: 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  d on the right. 
dc70: 20 28 54 69 63 6b 65 74 20 23 32 32 34 39 29 0a   (Ticket #2249).
dc80: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
dc90: 20 20 20 20 20 20 20 61 66 66 52 69 67 68 74 20         affRight 
dca0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
dcb0: 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70  inity(pOrTerm->p
dcc0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
dcd0: 20 20 20 20 20 20 20 20 20 61 66 66 4c 65 66 74           affLeft
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 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
dd10: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 66 66           if( aff
dd20: 52 69 67 68 74 21 3d 30 20 26 26 20 61 66 66 52  Right!=0 && affR
dd30: 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29 7b  ight!=affLeft ){
dd40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b 54  .            okT
dd50: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20  oChngToIN = 0;. 
dd60: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 54              pOrT
dd80: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
dd90: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
dda0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ddb0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
ddc0: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
ddd0: 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67 54  point, okToChngT
dde0: 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66 20 6f  oIN is true if o
ddf0: 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73 61  riginal pTerm sa
de00: 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20 63  tisfies.    ** c
de10: 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74 20  ase 1.  In that 
de20: 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74 20  case, construct 
de30: 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  a new virtual te
de40: 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20 20  rm that is .    
de50: 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72 74  ** pTerm convert
de60: 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70  ed into an IN op
de70: 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  erator..    */. 
de80: 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67 54     if( okToChngT
de90: 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70  oIN ){.      Exp
dea0: 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20  r *pDup;        
deb0: 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69 65      /* A transie
dec0: 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65 78 70  nt duplicate exp
ded0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
dee0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
def0: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 52   = 0;   /* The R
df00: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
df10: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45  rator */.      E
df20: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 20  xpr *pLeft = 0; 
df30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53        /* The LHS
df40: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
df50: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  tor */.      Exp
df60: 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  r *pNew;        
df70: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
df80: 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  ete IN operator 
df90: 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  */..      for(i=
dfa0: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20  pOrWc->nTerm-1, 
dfb0: 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61  pOrTerm=pOrWc->a
dfc0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72  ; i>=0; i--, pOr
dfd0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
dfe0: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77   if( (pOrTerm->w
dff0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
e000: 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  _OK)==0 ) contin
e010: 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ue;.        asse
e020: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
e030: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
e040: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e050: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
e060: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
e070: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e080: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
e090: 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  tColumn==iColumn
e0a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70   );.        pDup
e0b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
e0c0: 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  p(db, pOrTerm->p
e0d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29  Expr->pRight, 0)
e0e0: 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20  ;.        pList 
e0f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
e100: 74 41 70 70 65 6e 64 28 70 57 49 6e 66 6f 2d 3e  tAppend(pWInfo->
e110: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70  pParse, pList, p
e120: 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  Dup);.        pL
e130: 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70  eft = pOrTerm->p
e140: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
e150: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
e160: 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20  t( pLeft!=0 );. 
e170: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
e180: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
e190: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Left, 0);.      
e1a0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45  pNew = sqlite3PE
e1b0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
e1c0: 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a  N, pDup, 0, 0);.
e1d0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
e1e0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
e1f0: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72  xNew;.        tr
e200: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
e210: 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b  gs(pNew, pExpr);
e220: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e230: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
e240: 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65  y(pNew, EP_xIsSe
e250: 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20  lect) );.       
e260: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
e270: 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20   pList;.        
e280: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
e290: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
e2a0: 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55  pNew, TERM_VIRTU
e2b0: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
e2c0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
e2d0: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
e2e0: 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61  .        exprAna
e2f0: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
e300: 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  idxNew);.       
e310: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
e320: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
e330: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
e340: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
e350: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  erm;.        pTe
e360: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
e370: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e380: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e390: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
e3a0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
e3b0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
e3c0: 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b  rator = WO_NOOP;
e3d0: 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72 75 6d    /* case 1 trum
e3e0: 70 73 20 63 61 73 65 20 32 20 2a 2f 0a 20 20 20  ps case 2 */.   
e3f0: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20   }.  }.}.#endif 
e400: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
e410: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
e420: 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  && !SQLITE_OMIT_
e430: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
e440: 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20  ** The input to 
e450: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
e460: 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74 72  an WhereTerm str
e470: 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79  ucture with only
e480: 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20   the.** "pExpr" 
e490: 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e  field filled in.
e4a0: 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69    The job of thi
e4b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
e4c0: 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73  analyze the.** s
e4d0: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  ubexpression and
e4e0: 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68   populate all th
e4f0: 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f  e other fields o
e500: 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a  f the WhereTerm.
e510: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ** structure..**
e520: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
e530: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
e540: 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70  form "<expr> <op
e550: 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d  > X" it gets com
e560: 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  muted.** to the 
e570: 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66  standard form of
e580: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
e590: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
e5a0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
e5b0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
e5c0: 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20 58   Y" where both X
e5d0: 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f   and Y are.** co
e5e0: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20  lumns, then the 
e5f0: 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73  original express
e600: 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ion is unchanged
e610: 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75   and a new virtu
e620: 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68  al.** term of th
e630: 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58  e form "Y <op> X
e640: 22 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  " is added to th
e650: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
e660: 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73  nd.** analyzed s
e670: 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20  eparately.  The 
e680: 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73  original term is
e690: 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52   marked with TER
e6a0: 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20  M_COPIED.** and 
e6b0: 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20  the new term is 
e6c0: 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d  marked with TERM
e6d0: 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73  _DYNAMIC (becaus
e6e0: 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20  e it's pExpr.** 
e6f0: 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
e700: 64 20 77 69 74 68 20 74 68 65 20 57 68 65 72 65  d with the Where
e710: 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d  Clause) and TERM
e720: 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61 75 73  _VIRTUAL (becaus
e730: 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d  e it.** is a com
e740: 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20  muted copy of a 
e750: 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68  prior term.)  Th
e760: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20  e original term 
e770: 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20  has nChild=1.** 
e780: 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61 73  and the copy has
e790: 20 69 64 78 50 61 72 65 6e 74 20 73 65 74 20 74   idxParent set t
e7a0: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
e7b0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
e7c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e7d0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20   exprAnalyze(.  
e7e0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
e7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
e800: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
e810: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
e820: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  WC,         /* t
e830: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
e840: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d  */.  int idxTerm
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e860: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
e870: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
e880: 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  ed */.){.  Where
e890: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
e8a0: 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a 20 57  WC->pWInfo; /* W
e8b0: 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
e8c0: 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  essing context *
e8d0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
e8e0: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
e8f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d       /* The term
e900: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
e910: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
e920: 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
e930: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
e940: 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b  table index mask
e950: 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  s */.  Expr *pEx
e960: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
e970: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
e980: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
e990: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69  analyzed */.  Bi
e9a0: 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74  tmask prereqLeft
e9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
e9c0: 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20  * Prerequesites 
e9d0: 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c  of the pExpr->pL
e9e0: 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  eft */.  Bitmask
e9f0: 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20   prereqAll;     
ea00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
ea10: 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 70 45  requesites of pE
ea20: 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  xpr */.  Bitmask
ea30: 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b   extraRight = 0;
ea40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
ea50: 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  ra dependencies 
ea60: 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a  on LEFT JOIN */.
ea70: 20 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20    Expr *pStr1 = 
ea80: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
ea90: 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b     /* RHS of LIK
eaa0: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
eab0: 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  */.  int isCompl
eac0: 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ete = 0;        
ead0: 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20        /* RHS of 
eae0: 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77  LIKE/GLOB ends w
eaf0: 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a  ith wildcard */.
eb00: 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30    int noCase = 0
eb10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
eb20: 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20     /* LIKE/GLOB 
eb30: 64 69 73 74 69 6e 67 75 69 73 68 65 73 20 63 61  distinguishes ca
eb40: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  se */.  int op; 
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d           /* Top-
eb70: 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20  level operator. 
eb80: 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20   pExpr->op */.  
eb90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
eba0: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20  pWInfo->pParse; 
ebb0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
ebc0: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
ebd0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
ebe0: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  b;        /* Dat
ebf0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
ec00: 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   */..  if( db->m
ec10: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
ec20: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
ec30: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
ec40: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61  [idxTerm];.  pMa
ec50: 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d  skSet = &pWInfo-
ec60: 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45 78  >sMaskSet;.  pEx
ec70: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
ec80: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  r;.  assert( pEx
ec90: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 26 26  pr->op!=TK_AS &&
eca0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
ecb0: 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 70 72 65 72  OLLATE );.  prer
ecc0: 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62  eqLeft = exprTab
ecd0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
ece0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
ecf0: 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
ed00: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
ed10: 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  IN ){.    assert
ed20: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  ( pExpr->pRight=
ed30: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 45 78  =0 );.    if( Ex
ed40: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
ed50: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
ed60: 74 29 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  t) ){.      pTer
ed70: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
ed80: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
ed90: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
eda0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
edb0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
edc0: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
edd0: 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73  qRight = exprLis
ede0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
edf0: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  kSet, pExpr->x.p
ee00: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
ee10: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
ee20: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54  ISNULL ){.    pT
ee30: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
ee40: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
ee50: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
ee60: 52 69 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c  Right = exprTabl
ee70: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
ee80: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
ee90: 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c  .  }.  prereqAll
eea0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
eeb0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
eec0: 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  r);.  if( ExprHa
eed0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
eee0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
eef0: 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78 20 3d  .    Bitmask x =
ef00: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
ef10: 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  t, pExpr->iRight
ef20: 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20  JoinTable);.    
ef30: 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a  prereqAll |= x;.
ef40: 20 20 20 20 65 78 74 72 61 52 69 67 68 74 20 3d      extraRight =
ef50: 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61   x-1;  /* ON cla
ef60: 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f  use terms may no
ef70: 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  t be used with a
ef80: 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20  n index.        
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
efa0: 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65 20  * on left table 
efb0: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
efc0: 20 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a 2f   Ticket #3015 */
efd0: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72  .  }.  pTerm->pr
efe0: 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71  ereqAll = prereq
eff0: 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65  All;.  pTerm->le
f000: 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  ftCursor = -1;. 
f010: 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20   pTerm->iParent 
f020: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65  = -1;.  pTerm->e
f030: 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20  Operator = 0;.  
f040: 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70  if( allowedOp(op
f050: 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ) ){.    Expr *p
f060: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
f070: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
f080: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
f090: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
f0a0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
f0b0: 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 52  ollate(pExpr->pR
f0c0: 69 67 68 74 29 3b 0a 20 20 20 20 75 31 36 20 6f  ight);.    u16 o
f0d0: 70 4d 61 73 6b 20 3d 20 28 70 54 65 72 6d 2d 3e  pMask = (pTerm->
f0e0: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 72  prereqRight & pr
f0f0: 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 3f 20 57  ereqLeft)==0 ? W
f100: 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51 55 49 56  O_ALL : WO_EQUIV
f110: 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  ;.    if( pLeft-
f120: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
f130: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c  {.      pTerm->l
f140: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
f150: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
f160: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
f170: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
f180: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65  olumn;.      pTe
f190: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
f1a0: 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70 29  operatorMask(op)
f1b0: 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d   & opMask;.    }
f1c0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20  .    if( pRight 
f1d0: 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  && pRight->op==T
f1e0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
f1f0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65    WhereTerm *pNe
f200: 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  w;.      Expr *p
f210: 44 75 70 3b 0a 20 20 20 20 20 20 75 31 36 20 65  Dup;.      u16 e
f220: 45 78 74 72 61 4f 70 20 3d 20 30 3b 20 20 20 20  ExtraOp = 0;    
f230: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 69 74      /* Extra bit
f240: 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65 4f 70 65  s for pNew->eOpe
f250: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69  rator */.      i
f260: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
f270: 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20  rsor>=0 ){.     
f280: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
f290: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
f2a0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
f2b0: 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
f2c0: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
f2d0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
f2e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f2f0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70  rDelete(db, pDup
f300: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
f310: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
f320: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
f330: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
f340: 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52  t(pWC, pDup, TER
f350: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
f360: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
f370: 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29   if( idxNew==0 )
f380: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
f390: 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b   pNew = &pWC->a[
f3a0: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20  idxNew];.       
f3b0: 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d   pNew->iParent =
f3c0: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
f3d0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
f3e0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
f3f0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
f400: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  d = 1;.        p
f410: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
f420: 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20   TERM_COPIED;.  
f430: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
f440: 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20 20 20 20 20  >op==TK_EQ.     
f450: 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50      && !ExprHasP
f460: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
f470: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20  P_FromJoin).    
f480: 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
f490: 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
f4a0: 53 51 4c 49 54 45 5f 54 72 61 6e 73 69 74 69 76  SQLITE_Transitiv
f4b0: 65 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  e).        ){.  
f4c0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65          pTerm->e
f4d0: 4f 70 65 72 61 74 6f 72 20 7c 3d 20 57 4f 5f 45  Operator |= WO_E
f4e0: 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 20 20  QUIV;.          
f4f0: 65 45 78 74 72 61 4f 70 20 3d 20 57 4f 5f 45 51  eExtraOp = WO_EQ
f500: 55 49 56 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  UIV;.        }. 
f510: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f520: 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70 72      pDup = pExpr
f530: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
f540: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
f550: 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74        exprCommut
f560: 65 28 70 50 61 72 73 65 2c 20 70 44 75 70 29 3b  e(pParse, pDup);
f570: 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73  .      pLeft = s
f580: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
f590: 6c 6c 61 74 65 28 70 44 75 70 2d 3e 70 4c 65 66  llate(pDup->pLef
f5a0: 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  t);.      pNew->
f5b0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
f5c0: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
f5d0: 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43 6f    pNew->u.leftCo
f5e0: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
f5f0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74 65 73  olumn;.      tes
f600: 74 63 61 73 65 28 20 28 70 72 65 72 65 71 4c 65  tcase( (prereqLe
f610: 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 29  ft | extraRight)
f620: 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74 20 29   != prereqLeft )
f630: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72  ;.      pNew->pr
f640: 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72  ereqRight = prer
f650: 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69  eqLeft | extraRi
f660: 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ght;.      pNew-
f670: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65  >prereqAll = pre
f680: 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e  reqAll;.      pN
f690: 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  ew->eOperator = 
f6a0: 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44  (operatorMask(pD
f6b0: 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78 74 72 61  up->op) + eExtra
f6c0: 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20  Op) & opMask;.  
f6d0: 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66    }.  }..#ifndef
f6e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54   SQLITE_OMIT_BET
f6f0: 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  WEEN_OPTIMIZATIO
f700: 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d  N.  /* If a term
f710: 20 69 73 20 74 68 65 20 42 45 54 57 45 45 4e 20   is the BETWEEN 
f720: 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65  operator, create
f730: 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c   two new virtual
f740: 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74   terms.  ** that
f750: 20 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67   define the rang
f760: 65 20 74 68 61 74 20 74 68 65 20 42 45 54 57 45  e that the BETWE
f770: 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20  EN implements.  
f780: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a  For example:.  *
f790: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61 20 42 45  *.  **      a BE
f7a0: 54 57 45 45 4e 20 62 20 41 4e 44 20 63 0a 20 20  TWEEN b AND c.  
f7b0: 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65  **.  ** is conve
f7c0: 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a  rted into:.  **.
f7d0: 20 20 2a 2a 20 20 20 20 20 20 28 61 20 42 45 54    **      (a BET
f7e0: 57 45 45 4e 20 62 20 41 4e 44 20 63 29 20 41 4e  WEEN b AND c) AN
f7f0: 44 20 28 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c  D (a>=b) AND (a<
f800: 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  =c).  **.  ** Th
f810: 65 20 74 77 6f 20 6e 65 77 20 74 65 72 6d 73 20  e two new terms 
f820: 61 72 65 20 61 64 64 65 64 20 6f 6e 74 6f 20 74  are added onto t
f830: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 68  he end of the Wh
f840: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
f850: 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 74  ..  ** The new t
f860: 65 72 6d 73 20 61 72 65 20 22 64 79 6e 61 6d 69  erms are "dynami
f870: 63 22 20 61 6e 64 20 61 72 65 20 63 68 69 6c 64  c" and are child
f880: 72 65 6e 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ren of the origi
f890: 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a  nal BETWEEN.  **
f8a0: 20 74 65 72 6d 2e 20 20 54 68 61 74 20 6d 65 61   term.  That mea
f8b0: 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 20 42  ns that if the B
f8c0: 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 63  ETWEEN term is c
f8d0: 6f 64 65 64 2c 20 74 68 65 20 63 68 69 6c 64 72  oded, the childr
f8e0: 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70  en are.  ** skip
f8f0: 70 65 64 2e 20 20 4f 72 2c 20 69 66 20 74 68 65  ped.  Or, if the
f900: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 73 61   children are sa
f910: 74 69 73 66 69 65 64 20 62 79 20 61 6e 20 69 6e  tisfied by an in
f920: 64 65 78 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  dex, the origina
f930: 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e 20 74  l.  ** BETWEEN t
f940: 65 72 6d 20 69 73 20 73 6b 69 70 70 65 64 2e 0a  erm is skipped..
f950: 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
f960: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45  pExpr->op==TK_BE
f970: 54 57 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70  TWEEN && pWC->op
f980: 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
f990: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
f9a0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
f9b0: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
f9c0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
f9d0: 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c   ops[] = {TK_GE,
f9e0: 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73   TK_LE};.    ass
f9f0: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
fa00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
fa10: 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a  st->nExpr==2 );.
fa20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
fa30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
fa40: 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
fa50: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
fa60: 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d        pNewExpr =
fa70: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
fa80: 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20  arse, ops[i], . 
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
fab0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
fac0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c  Expr->pLeft, 0),
fad0: 0a 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 20 73 71                sq
faf0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
fb00: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
fb10: 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20  pr, 0), 0);.    
fb20: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
fb30: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
fb40: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
fb50: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
fb60: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65  NAMIC);.      te
fb70: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
fb80: 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41  0 );.      exprA
fb90: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
fba0: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
fbb0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
fbc0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
fbd0: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
fbe0: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
fbf0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65  m;.    }.    pTe
fc00: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a  rm->nChild = 2;.
fc10: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
fc20: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
fc30: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  N_OPTIMIZATION *
fc40: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
fc50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
fc60: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
fc70: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
fc80: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20  OMIT_SUBQUERY). 
fc90: 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65   /* Analyze a te
fca0: 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f  rm that is compo
fcb0: 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  sed of two or mo
fcc0: 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e  re subterms conn
fcd0: 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e  ected by.  ** an
fce0: 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   OR operator..  
fcf0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
fd00: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
fd10: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  {.    assert( pW
fd20: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  C->op==TK_AND );
fd30: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
fd40: 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43  OrTerm(pSrc, pWC
fd50: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20  , idxTerm);.    
fd60: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
fd70: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65  idxTerm];.  }.#e
fd80: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
fd90: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
fda0: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ION */..#ifndef 
fdb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
fdc0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
fdd0: 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e  /* Add constrain
fde0: 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  ts to reduce the
fdf0: 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e   search space on
fe00: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a   a LIKE or GLOB.
fe10: 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20    ** operator.. 
fe20: 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20   **.  ** A like 
fe30: 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66  pattern of the f
fe40: 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62 63  orm "x LIKE 'abc
fe50: 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20 69  %'" is changed i
fe60: 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  nto constraints.
fe70: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
fe80: 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20     x>='abc' AND 
fe90: 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49  x<'abd' AND x LI
fea0: 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20  KE 'abc%'.  **. 
feb0: 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61   ** The last cha
fec0: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70 72  racter of the pr
fed0: 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69 6e  efix "abc" is in
fee0: 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72  cremented to for
fef0: 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69  m the.  ** termi
ff00: 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e  nation condition
ff10: 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69   "abd"..  */.  i
ff20: 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  f( pWC->op==TK_A
ff30: 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b 65  ND .   && isLike
ff40: 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70  OrGlob(pParse, p
ff50: 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26 69  Expr, &pStr1, &i
ff60: 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61  sComplete, &noCa
ff70: 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70  se).  ){.    Exp
ff80: 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  r *pLeft;       
ff90: 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47  /* LHS of LIKE/G
ffa0: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
ffb0: 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32 3b      Expr *pStr2;
ffc0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
ffd0: 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f 66  f pStr1 - RHS of
ffe0: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
fff0: 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  tor */.    Expr 
10000 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20 20  *pNewExpr1;.    
10010 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32 3b  Expr *pNewExpr2;
10020 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31  .    int idxNew1
10030 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
10040 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f  2;.    Token sCo
10050 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20 4e  llSeqName;  /* N
10060 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67  ame of collating
10070 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20   sequence */..  
10080 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
10090 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
100a0 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32 20  Expr;.    pStr2 
100b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
100c0 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a  (db, pStr1, 0);.
100d0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
100e0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
100f0 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20 20     u8 c, *pC;   
10100 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 72      /* Last char
10110 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65  acter before the
10120 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64 20   first wildcard 
10130 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28 75  */.      pC = (u
10140 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54 6f  8*)&pStr2->u.zTo
10150 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ken[sqlite3Strle
10160 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54 6f  n30(pStr2->u.zTo
10170 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20 63  ken)-1];.      c
10180 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69 66   = *pC;.      if
10190 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20  ( noCase ){.    
101a0 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
101b0 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74   is to increment
101c0 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
101d0 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20 66  ter before the f
101e0 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  irst.        ** 
101f0 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20 69  wildcard.  But i
10200 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20 27  f we increment '
10210 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70 75  @', that will pu
10220 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20  sh it into the. 
10230 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61 62         ** alphab
10240 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72 65  etic range where
10250 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f 6e   case conversion
10260 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20 74  s will mess up t
10270 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  he .        ** i
10280 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20 61  nequality.  To a
10290 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65 20  void this, make 
102a0 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75 6e  sure to also run
102b0 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20 20   the full.      
102c0 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c    ** LIKE on all
102d0 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72 65   candidate expre
102e0 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72 69  ssions by cleari
102f0 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65 74  ng the isComplet
10300 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20 2a  e flag.        *
10310 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  /.        if( c=
10320 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70 6c  ='A'-1 ) isCompl
10330 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ete = 0;.       
10340 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65   c = sqlite3Uppe
10350 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20  rToLower[c];.   
10360 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d     }.      *pC =
10370 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20   c + 1;.    }.  
10380 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 7a    sCollSeqName.z
10390 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43   = noCase ? "NOC
103a0 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22 3b  ASE" : "BINARY";
103b0 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
103c0 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e 65  e.n = 6;.    pNe
103d0 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33  wExpr1 = sqlite3
103e0 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
103f0 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45  t, 0);.    pNewE
10400 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45  xpr1 = sqlite3PE
10410 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47  xpr(pParse, TK_G
10420 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 73  E, .           s
10430 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
10440 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65  lateToken(pParse
10450 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f 6c  ,pNewExpr1,&sCol
10460 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20  lSeqName),.     
10470 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b        pStr1, 0);
10480 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77  .    idxNew1 = w
10490 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
104a0 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c  (pWC, pNewExpr1,
104b0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
104c0 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
104d0 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
104e0 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70  w1==0 );.    exp
104f0 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
10500 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20  WC, idxNew1);.  
10510 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71    pNewExpr2 = sq
10520 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
10530 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20   pLeft, 0);.    
10540 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69  pNewExpr2 = sqli
10550 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
10560 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20   TK_LT,.        
10570 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
10580 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
10590 61 72 73 65 2c 70 4e 65 77 45 78 70 72 32 2c 26  arse,pNewExpr2,&
105a0 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20  sCollSeqName),. 
105b0 20 20 20 20 20 20 20 20 20 20 70 53 74 72 32 2c            pStr2,
105c0 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32   0);.    idxNew2
105d0 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
105e0 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
105f0 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  pr2, TERM_VIRTUA
10600 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
10610 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
10620 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20  dxNew2==0 );.   
10630 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
10640 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29  c, pWC, idxNew2)
10650 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
10660 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
10670 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65      if( isComple
10680 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d  te ){.      pWC-
10690 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61 72  >a[idxNew1].iPar
106a0 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
106b0 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
106c0 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew2].iParent = i
106d0 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
106e0 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
106f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
10700 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
10710 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
10720 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ON */..#ifndef S
10730 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
10740 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64  ALTABLE.  /* Add
10750 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75 78 69   a WO_MATCH auxi
10760 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20 74 68  liary term to th
10770 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 65 74  e constraint set
10780 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
10790 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  rent expression 
107a0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  is of the form: 
107b0 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78   column MATCH ex
107c0 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e  pr..  ** This in
107d0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
107e0 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e  d by the xBestIn
107f0 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20  dex methods of. 
10800 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c   ** virtual tabl
10810 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20  es.  The native 
10820 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 20  query optimizer 
10830 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  does not attempt
10840 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74  .  ** to do anyt
10850 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43 48 20  hing with MATCH 
10860 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  functions..  */.
10870 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f 66 43    if( isMatchOfC
10880 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a  olumn(pExpr) ){.
10890 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
108a0 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
108b0 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57 68  , *pLeft;.    Wh
108c0 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72  ereTerm *pNewTer
108d0 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 70  m;.    Bitmask p
108e0 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65  rereqColumn, pre
108f0 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20 70 52  reqExpr;..    pR
10900 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
10910 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
10920 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70  r;.    pLeft = p
10930 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
10940 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [1].pExpr;.    p
10950 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70 72  rereqExpr = expr
10960 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
10970 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  Set, pRight);.  
10980 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d    prereqColumn =
10990 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
109a0 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29  pMaskSet, pLeft)
109b0 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72 65  ;.    if( (prere
109c0 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43 6f  qExpr & prereqCo
109d0 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lumn)==0 ){.    
109e0 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
109f0 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72  ;.      pNewExpr
10a00 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
10a10 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48  pParse, TK_MATCH
10a20 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a40 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44   0, sqlite3ExprD
10a50 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c 20 30  up(db, pRight, 0
10a60 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78  ), 0);.      idx
10a70 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
10a80 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
10a90 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
10aa0 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
10ab0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
10ac0 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
10ad0 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d        pNewTerm =
10ae0 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d   &pWC->a[idxNew]
10af0 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
10b00 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
10b10 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20 20 20  prereqExpr;.    
10b20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74    pNewTerm->left
10b30 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
10b40 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
10b50 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  ewTerm->u.leftCo
10b60 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
10b70 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65  olumn;.      pNe
10b80 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  wTerm->eOperator
10b90 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20   = WO_MATCH;.   
10ba0 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61     pNewTerm->iPa
10bb0 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
10bc0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
10bd0 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
10be0 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
10bf0 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ild = 1;.      p
10c00 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
10c10 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20   TERM_COPIED;.  
10c20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
10c30 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d  ereqAll = pTerm-
10c40 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20  >prereqAll;.    
10c50 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
10c60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
10c70 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
10c80 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
10c90 45 4e 41 42 4c 45 5f 53 54 41 54 34 29 20 7c 7c  ENABLE_STAT4) ||
10ca0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
10cb0 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 0a 20 20  ENABLE_STAT3).  
10cc0 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73  /* When sqlite_s
10cd0 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
10ce0 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
10cf0 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20   an operator of 
10d00 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78  the.  ** form "x
10d10 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61   IS NOT NULL" ca
10d20 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65  n sometimes be e
10d30 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66  valuated more ef
10d40 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61  ficiently.  ** a
10d50 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20  s "x>NULL" if x 
10d60 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
10d70 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  R PRIMARY KEY.  
10d80 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20  So construct a. 
10d90 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d   ** virtual term
10da0 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20   of that form.. 
10db0 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
10dc0 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  at the virtual t
10dd0 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67  erm must be tagg
10de0 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55  ed with TERM_VNU
10df0 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54  LL.  This.  ** T
10e00 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69  ERM_VNULL tag wi
10e10 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20  ll suppress the 
10e20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
10e30 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
10e40 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70    ** of the loop
10e50 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54  .  Without the T
10e60 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20  ERM_VNULL flag, 
10e70 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65  the not-null che
10e80 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73  ck at.  ** the s
10e90 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tart of the loop
10ea0 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e   will prevent an
10eb0 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62  y results from b
10ec0 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20  eing returned.. 
10ed0 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
10ee0 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a  >op==TK_NOTNULL.
10ef0 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65     && pExpr->pLe
10f00 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
10f10 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70  N.   && pExpr->p
10f20 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Left->iColumn>=0
10f30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
10f40 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
10f50 51 4c 49 54 45 5f 53 74 61 74 33 29 0a 20 20 29  QLITE_Stat3).  )
10f60 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
10f70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
10f80 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
10f90 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64  Left;.    int id
10fa0 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54  xNew;.    WhereT
10fb0 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a  erm *pNewTerm;..
10fc0 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
10fd0 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
10fe0 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20  se, TK_GT,.     
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
11010 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c  prDup(db, pLeft,
11020 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
11030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11040 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
11050 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30  arse, TK_NULL, 0
11060 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20  , 0, 0), 0);..  
11070 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
11080 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
11090 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20  , pNewExpr,.    
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110b0 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56            TERM_V
110c0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
110d0 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b  MIC|TERM_VNULL);
110e0 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 20  .    if( idxNew 
110f0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ){.      pNewTer
11100 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
11110 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
11120 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
11130 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
11140 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
11150 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
11160 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
11170 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
11180 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
11190 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
111a0 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
111b0 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  GT;.      pNewTe
111c0 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64  rm->iParent = id
111d0 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65  xTerm;.      pTe
111e0 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
111f0 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65  Term];.      pTe
11200 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
11210 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
11220 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
11230 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
11240 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
11250 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
11260 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
11270 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
11280 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20 20  ABLE_STAT */..  
11290 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c  /* Prevent ON cl
112a0 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20  ause terms of a 
112b0 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62  LEFT JOIN from b
112c0 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69  eing used to dri
112d0 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  ve.  ** an index
112e0 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74   for tables to t
112f0 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a  he left of the j
11300 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72  oin..  */.  pTer
11310 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c  m->prereqRight |
11320 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a  = extraRight;.}.
11330 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11340 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 70 4c  tion searches pL
11350 69 73 74 20 66 6f 72 20 61 20 65 6e 74 72 79 20  ist for a entry 
11360 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
11370 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a   iCol-th column.
11380 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  ** of index pIdx
11390 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
113a0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
113b0 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65   found, its inde
113c0 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20  x in pList->a[] 
113d0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a  is returned. If.
113e0 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e  ** no expression
113f0 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73   is found, -1 is
11400 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
11410 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64  atic int findInd
11420 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a  exCol(.  Parse *
11430 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
11440 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
11450 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  e context */.  E
11460 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11480 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * Expression lis
11490 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  t to search */. 
114a0 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20   int iBase,     
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114c0 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74   /* Cursor for t
114d0 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
114e0 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49  with pIdx */.  I
114f0 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11510 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68  * Index to match
11520 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20   column of */.  
11530 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20  int iCol        
11540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11550 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  /* Column of ind
11560 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29  ex to match */.)
11570 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  {.  int i;.  con
11580 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
11590 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43   pIdx->azColl[iC
115a0 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ol];..  for(i=0;
115b0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
115c0 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
115d0 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  *p = sqlite3Expr
115e0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
115f0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
11600 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
11610 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26  K_COLUMN.     &&
11620 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64   p->iColumn==pId
11630 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  x->aiColumn[iCol
11640 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61  ].     && p->iTa
11650 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29  ble==iBase.    )
11660 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
11670 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
11680 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
11690 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
116a0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
116b0 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20  ( ALWAYS(pColl) 
116c0 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
116d0 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
116e0 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
116f0 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20       return i;. 
11700 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11710 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ..  return -1;.}
11720 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11730 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
11740 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  NCT expression-l
11750 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
11760 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
11770 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74  .** is redundant
11780 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e  ..**.** A DISTIN
11790 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e  CT list is redun
117a0 64 61 6e 74 20 69 66 20 74 68 65 20 64 61 74 61  dant if the data
117b0 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f  base contains so
117c0 6d 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20  me subset of.** 
117d0 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
117e0 20 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e 2d   unique and non-
117f0 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  null..*/.static 
11800 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52 65  int isDistinctRe
11810 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65  dundant(.  Parse
11820 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
11830 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11840 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
11850 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
11860 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
11870 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
11880 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
11890 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
118a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
118b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73    ExprList *pDis
118c0 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20 54  tinct       /* T
118d0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 68  he result set th
118e0 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 44  at needs to be D
118f0 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20  ISTINCT */.){.  
11900 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
11910 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
11920 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
11940 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f   int iBase;..  /
11950 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f  * If there is mo
11960 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c  re than one tabl
11970 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20  e or sub-select 
11980 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
11990 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  se of.  ** this 
119a0 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77  query, then it w
119b0 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
119c0 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74  ble to show that
119d0 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20   the DISTINCT . 
119e0 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65   ** clause is re
119f0 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  dundant. */.  if
11a00 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
11a10 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
11a20 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69    iBase = pTabLi
11a30 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
11a40 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c  ;.  pTab = pTabL
11a50 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  ist->a[0].pTab;.
11a60 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  /* If any of 
11a70 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
11a80 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e  is an IPK column
11a90 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c   on table iBase,
11aa0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20   then return .  
11ab0 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54  ** true. Note: T
11ac0 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69  he (p->iTable==i
11ad0 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74 68  Base) part of th
11ae0 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20 66  is test may be f
11af0 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a  alse if the.  **
11b00 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
11b10 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
11b20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  sub-query..  */.
11b30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69    for(i=0; i<pDi
11b40 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69  stinct->nExpr; i
11b50 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
11b60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
11b70 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69  ipCollate(pDisti
11b80 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  nct->a[i].pExpr)
11b90 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
11ba0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d  =TK_COLUMN && p-
11bb0 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26  >iTable==iBase &
11bc0 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  & p->iColumn<0 )
11bd0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
11be0 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
11bf0 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e  h all indices on
11c00 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63   the table, chec
11c10 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65  king each to see
11c20 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a   if it makes.  *
11c30 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  * the DISTINCT q
11c40 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61  ualifier redunda
11c50 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69  nt. It does so i
11c60 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  f:.  **.  **   1
11c70 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 69  . The index is i
11c80 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e  tself UNIQUE, an
11c90 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e  d.  **.  **   2.
11ca0 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75   All of the colu
11cb0 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
11cc0 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72 74   are either part
11cd0 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e 63   of the pDistinc
11ce0 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74  t.  **      list
11cf0 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48  , or else the WH
11d00 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
11d10 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  ins a term of th
11d20 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a  e form "col=X",.
11d30 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20    **      where 
11d40 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  X is a constant 
11d50 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61  value. The colla
11d60 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f  tion sequences o
11d70 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20  f the.  **      
11d80 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73  comparison and s
11d90 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65  elect-list expre
11da0 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63  ssions must matc
11db0 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69  h those of the i
11dc0 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
11dd0 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73    3. All of thos
11de0 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  e index columns 
11df0 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48  for which the WH
11e00 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
11e10 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f  not.  **      co
11e20 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20  ntain a "col=X" 
11e30 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74  term are subject
11e40 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63   to a NOT NULL c
11e50 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a  onstraint..  */.
11e60 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
11e70 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
11e80 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
11e90 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  {.    if( pIdx->
11ea0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
11eb0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11ec0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
11ed0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
11ee0 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
11ef0 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
11f00 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  [i];.      if( 0
11f10 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ==findTerm(pWC, 
11f20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42  iBase, iCol, ~(B
11f30 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c  itmask)0, WO_EQ,
11f40 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
11f50 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20    int iIdxCol = 
11f60 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61  findIndexCol(pPa
11f70 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20  rse, pDistinct, 
11f80 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3b  iBase, pIdx, i);
11f90 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 49 64  .        if( iId
11fa0 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e  xCol<0 || pTab->
11fb0 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c  aCol[pIdx->aiCol
11fc0 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 3d  umn[i]].notNull=
11fd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11fe0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
11ff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12000 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e     if( i==pIdx->
12010 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
12020 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
12030 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20  mplies that the 
12040 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
12050 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  er is redundant.
12060 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
12070 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
12080 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
12090 20 0a 2a 2a 20 46 69 6e 64 20 28 61 6e 20 61 70   .** Find (an ap
120a0 70 72 6f 78 69 6d 61 74 65 29 20 73 75 6d 20 6f  proximate) sum o
120b0 66 20 74 77 6f 20 57 68 65 72 65 43 6f 73 74 73  f two WhereCosts
120c0 2e 20 20 54 68 69 73 20 63 6f 6d 70 75 74 61 74  .  This computat
120d0 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 20  ion is.** not a 
120e0 73 69 6d 70 6c 65 20 22 2b 22 20 6f 70 65 72 61  simple "+" opera
120f0 74 6f 72 20 62 65 63 61 75 73 65 20 57 68 65 72  tor because Wher
12100 65 43 6f 73 74 20 69 73 20 73 74 6f 72 65 64 20  eCost is stored 
12110 61 73 20 61 20 6c 6f 67 61 72 69 74 68 6d 69 63  as a logarithmic
12120 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 20 0a 2a  .** value..** .*
12130 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43 6f  /.static WhereCo
12140 73 74 20 77 68 65 72 65 43 6f 73 74 41 64 64 28  st whereCostAdd(
12150 57 68 65 72 65 43 6f 73 74 20 61 2c 20 57 68 65  WhereCost a, Whe
12160 72 65 43 6f 73 74 20 62 29 7b 0a 20 20 73 74 61  reCost b){.  sta
12170 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
12180 65 64 20 63 68 61 72 20 78 5b 5d 20 3d 20 7b 0a  ed char x[] = {.
12190 20 20 20 20 20 31 30 2c 20 31 30 2c 20 20 20 20       10, 10,    
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121b0 20 20 20 20 20 2f 2a 20 30 2c 31 20 2a 2f 0a 20       /* 0,1 */. 
121c0 20 20 20 20 20 39 2c 20 39 2c 20 20 20 20 20 20       9, 9,      
121d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121e0 20 20 20 20 2f 2a 20 32 2c 33 20 2a 2f 0a 20 20      /* 2,3 */.  
121f0 20 20 20 20 38 2c 20 38 2c 20 20 20 20 20 20 20      8, 8,       
12200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12210 20 20 20 2f 2a 20 34 2c 35 20 2a 2f 0a 20 20 20     /* 4,5 */.   
12220 20 20 20 37 2c 20 37 2c 20 37 2c 20 20 20 20 20     7, 7, 7,     
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12240 20 20 2f 2a 20 36 2c 37 2c 38 20 2a 2f 0a 20 20    /* 6,7,8 */.  
12250 20 20 20 20 36 2c 20 36 2c 20 36 2c 20 20 20 20      6, 6, 6,    
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12270 20 20 20 2f 2a 20 39 2c 31 30 2c 31 31 20 2a 2f     /* 9,10,11 */
12280 0a 20 20 20 20 20 20 35 2c 20 35 2c 20 35 2c 20  .      5, 5, 5, 
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 20 20 20 20 20 20 2f 2a 20 31 32 2d 31 34 20 2a        /* 12-14 *
122b0 2f 0a 20 20 20 20 20 20 34 2c 20 34 2c 20 34 2c  /.      4, 4, 4,
122c0 20 34 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   4,             
122d0 20 20 20 20 20 20 20 2f 2a 20 31 35 2d 31 38 20         /* 15-18 
122e0 2a 2f 0a 20 20 20 20 20 20 33 2c 20 33 2c 20 33  */.      3, 3, 3
122f0 2c 20 33 2c 20 33 2c 20 33 2c 20 20 20 20 20 20  , 3, 3, 3,      
12300 20 20 20 20 20 20 20 20 2f 2a 20 31 39 2d 32 34          /* 19-24
12310 20 2a 2f 0a 20 20 20 20 20 20 32 2c 20 32 2c 20   */.      2, 2, 
12320 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 20  2, 2, 2, 2, 2,  
12330 20 20 20 20 20 20 20 20 20 2f 2a 20 32 35 2d 33           /* 25-3
12340 31 20 2a 2f 0a 20 20 7d 3b 0a 20 20 69 66 28 20  1 */.  };.  if( 
12350 61 3e 3d 62 20 29 7b 0a 20 20 20 20 69 66 28 20  a>=b ){.    if( 
12360 61 3e 62 2b 34 39 20 29 20 72 65 74 75 72 6e 20  a>b+49 ) return 
12370 61 3b 0a 20 20 20 20 69 66 28 20 61 3e 62 2b 33  a;.    if( a>b+3
12380 31 20 29 20 72 65 74 75 72 6e 20 61 2b 31 3b 0a  1 ) return a+1;.
12390 20 20 20 20 72 65 74 75 72 6e 20 61 2b 78 5b 61      return a+x[a
123a0 2d 62 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -b];.  }else{.  
123b0 20 20 69 66 28 20 62 3e 61 2b 34 39 20 29 20 72    if( b>a+49 ) r
123c0 65 74 75 72 6e 20 62 3b 0a 20 20 20 20 69 66 28  eturn b;.    if(
123d0 20 62 3e 61 2b 33 31 20 29 20 72 65 74 75 72 6e   b>a+31 ) return
123e0 20 62 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   b+1;.    return
123f0 20 62 2b 78 5b 62 2d 61 5d 3b 0a 20 20 7d 0a 7d   b+x[b-a];.  }.}
12400 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
12410 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  an integer into 
12420 61 20 57 68 65 72 65 43 6f 73 74 2e 20 20 49 6e  a WhereCost.  In
12430 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 63 6f   other words, co
12440 6d 70 75 74 65 20 61 0a 2a 2a 20 67 6f 6f 64 20  mpute a.** good 
12450 61 70 70 72 6f 78 69 6d 61 74 61 74 69 6f 6e 20  approximatation 
12460 66 6f 72 20 31 30 2a 6c 6f 67 32 28 78 29 2e 0a  for 10*log2(x)..
12470 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43  */.static WhereC
12480 6f 73 74 20 77 68 65 72 65 43 6f 73 74 28 74 52  ost whereCost(tR
12490 6f 77 63 6e 74 20 78 29 7b 0a 20 20 73 74 61 74  owcnt x){.  stat
124a0 69 63 20 57 68 65 72 65 43 6f 73 74 20 61 5b 5d  ic WhereCost a[]
124b0 20 3d 20 7b 20 30 2c 20 32 2c 20 33 2c 20 35 2c   = { 0, 2, 3, 5,
124c0 20 36 2c 20 37 2c 20 38 2c 20 39 20 7d 3b 0a 20   6, 7, 8, 9 };. 
124d0 20 57 68 65 72 65 43 6f 73 74 20 79 20 3d 20 34   WhereCost y = 4
124e0 30 3b 0a 20 20 69 66 28 20 78 3c 38 20 29 7b 0a  0;.  if( x<8 ){.
124f0 20 20 20 20 69 66 28 20 78 3c 32 20 29 20 72 65      if( x<2 ) re
12500 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
12510 65 28 20 78 3c 38 20 29 7b 20 20 79 20 2d 3d 20  e( x<8 ){  y -= 
12520 31 30 3b 20 78 20 3c 3c 3d 20 31 3b 20 7d 0a 20  10; x <<= 1; }. 
12530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
12540 65 28 20 78 3e 32 35 35 20 29 7b 20 79 20 2b 3d  e( x>255 ){ y +=
12550 20 34 30 3b 20 78 20 3e 3e 3d 20 34 3b 20 7d 0a   40; x >>= 4; }.
12560 20 20 20 20 77 68 69 6c 65 28 20 78 3e 31 35 20      while( x>15 
12570 29 7b 20 20 79 20 2b 3d 20 31 30 3b 20 78 20 3e  ){  y += 10; x >
12580 3e 3d 20 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65  >= 1; }.  }.  re
12590 74 75 72 6e 20 61 5b 78 26 37 5d 20 2b 20 79 20  turn a[x&7] + y 
125a0 2d 20 31 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  - 10;.}..#ifndef
125b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
125c0 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
125d0 43 6f 6e 76 65 72 74 20 61 20 64 6f 75 62 6c 65  Convert a double
125e0 20 28 61 73 20 72 65 63 65 69 76 65 64 20 66 72   (as received fr
125f0 6f 6d 20 78 42 65 73 74 49 6e 64 65 78 20 6f 66  om xBestIndex of
12600 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
12610 29 0a 2a 2a 20 69 6e 74 6f 20 61 20 57 68 65 72  ).** into a Wher
12620 65 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65 72  eCost.  In other
12630 20 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65 20   words, compute 
12640 61 6e 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e  an approximation
12650 20 66 6f 72 0a 2a 2a 20 31 30 2a 6c 6f 67 32 28   for.** 10*log2(
12660 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  x)..*/.static Wh
12670 65 72 65 43 6f 73 74 20 77 68 65 72 65 43 6f 73  ereCost whereCos
12680 74 46 72 6f 6d 44 6f 75 62 6c 65 28 64 6f 75 62  tFromDouble(doub
12690 6c 65 20 78 29 7b 0a 20 20 75 36 34 20 61 3b 0a  le x){.  u64 a;.
126a0 20 20 57 68 65 72 65 43 6f 73 74 20 65 3b 0a 20    WhereCost e;. 
126b0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
126c0 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28  x)==8 && sizeof(
126d0 61 29 3d 3d 38 20 29 3b 0a 20 20 69 66 28 20 78  a)==8 );.  if( x
126e0 3c 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  <=1 ) return 0;.
126f0 20 20 69 66 28 20 78 3c 3d 32 30 30 30 30 30 30    if( x<=2000000
12700 30 30 30 20 29 20 72 65 74 75 72 6e 20 77 68 65  000 ) return whe
12710 72 65 43 6f 73 74 28 28 74 52 6f 77 63 6e 74 29  reCost((tRowcnt)
12720 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61 2c  x);.  memcpy(&a,
12730 20 26 78 2c 20 38 29 3b 0a 20 20 65 20 3d 20 28   &x, 8);.  e = (
12740 61 3e 3e 35 32 29 20 2d 20 31 30 32 32 3b 0a 20  a>>52) - 1022;. 
12750 20 72 65 74 75 72 6e 20 65 2a 31 30 3b 0a 7d 0a   return e*10;.}.
12760 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12770 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12780 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  LE */../*.** Est
12790 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69  imate the logari
127a0 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
127b0 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32   value to base 2
127c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
127d0 65 43 6f 73 74 20 65 73 74 4c 6f 67 28 57 68 65  eCost estLog(Whe
127e0 72 65 43 6f 73 74 20 4e 29 7b 0a 20 20 57 68 65  reCost N){.  Whe
127f0 72 65 43 6f 73 74 20 78 20 3d 20 77 68 65 72 65  reCost x = where
12800 43 6f 73 74 28 4e 29 3b 0a 20 20 72 65 74 75 72  Cost(N);.  retur
12810 6e 20 78 3e 33 33 20 3f 20 78 20 2d 20 33 33 20  n x>33 ? x - 33 
12820 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77  : 0;.}../*.** Tw
12830 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  o routines for p
12840 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74  rinting the cont
12850 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65  ent of an sqlite
12860 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20  3_index_info.** 
12870 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64  structure.  Used
12880 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
12890 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
128a0 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20    If neither.** 
128b0 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53  SQLITE_TEST or S
128c0 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20  QLITE_DEBUG are 
128d0 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
128e0 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20  ese routines.** 
128f0 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23  are no-ops..*/.#
12900 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
12910 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12920 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
12930 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
12940 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64  LED).static void
12950 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
12960 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
12970 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
12980 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
12990 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
129a0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
129b0 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
129c0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
129d0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
129e0 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
129f0 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
12a00 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
12a10 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
12a20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
12a30 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
12a40 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
12a50 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
12a60 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
12a70 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
12a80 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
12a90 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
12aa0 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
12ab0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
12ac0 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
12ad0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
12ae0 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
12af0 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
12b00 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
12b10 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
12b20 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
12b30 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
12b40 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
12b50 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
12b60 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
12b70 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
12b80 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
12b90 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
12ba0 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
12bb0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
12bc0 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
12bd0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
12be0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
12bf0 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
12c00 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
12c10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
12c20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
12c30 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
12c40 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
12c50 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
12c60 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
12c70 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
12c80 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
12c90 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
12ca0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
12cb0 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
12cc0 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
12cd0 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
12ce0 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
12cf0 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
12d00 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
12d10 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
12d20 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
12d30 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
12d40 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
12d50 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65  edCost);.}.#else
12d60 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
12d70 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65  DX_INPUTS(A).#de
12d80 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f  fine TRACE_IDX_O
12d90 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66  UTPUTS(A).#endif
12da0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12db0 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
12dc0 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75  INDEX./*.** Retu
12dd0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57  rn TRUE if the W
12de0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
12df0 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66   pTerm is of a f
12e00 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20  orm where it.** 
12e10 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77 69  could be used wi
12e20 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61  th an index to a
12e30 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73 75  ccess pSrc, assu
12e40 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69  ming an appropri
12e50 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69  ate.** index exi
12e60 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
12e70 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65  int termCanDrive
12e80 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54 65  Index(.  WhereTe
12e90 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20  rm *pTerm,      
12ea0 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
12eb0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
12ec0 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63  check */.  struc
12ed0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
12ee0 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62  pSrc,     /* Tab
12ef0 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  le we are trying
12f00 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20   to access */.  
12f10 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
12f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12f30 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65  * Tables in oute
12f40 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a  r loops of the j
12f50 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  oin */.){.  char
12f60 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72   aff;.  if( pTer
12f70 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70  m->leftCursor!=p
12f80 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72  Src->iCursor ) r
12f90 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
12fa0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
12fb0 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72   & WO_EQ)==0 ) r
12fc0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
12fd0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
12fe0 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ht & notReady)!=
12ff0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
13000 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  if( pTerm->u.lef
13010 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  tColumn<0 ) retu
13020 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53  rn 0;.  aff = pS
13030 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  rc->pTab->aCol[p
13040 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
13050 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
13060 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
13070 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72  xAffinityOk(pTer
13080 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29  m->pExpr, aff) )
13090 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
130a0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
130b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
130c0 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
130d0 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  INDEX./*.** Gene
130e0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e  rate code to con
130f0 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78  struct the Index
13100 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61   object for an a
13110 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a  utomatic index.*
13120 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20  * and to set up 
13130 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f  the WhereLevel o
13140 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20  bject pLevel so 
13150 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67 65  that the code ge
13160 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73  nerator.** makes
13170 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f   use of the auto
13180 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a  matic index..*/.
13190 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73  static void cons
131a0 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
131b0 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
131c0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
131d0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
131e0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
131f0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
13200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13210 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
13220 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
13230 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
13240 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
13250 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74  se term to get t
13260 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f  he next index */
13270 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
13280 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
13290 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
132a0 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
132b0 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68  vailable */.  Wh
132c0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
132d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
132e0 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72  te new index her
132f0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43  e */.){.  int nC
13300 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
13310 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13320 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
13330 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
13340 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  dex */.  WhereTe
13350 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
13360 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
13370 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
13380 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
13390 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
133a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  ;          /* En
133b0 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
133c0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
133d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
133e0 2a 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72 79  * Byte of memory
133f0 20 6e 65 65 64 65 64 20 66 6f 72 20 70 49 64 78   needed for pIdx
13400 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
13410 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
13420 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63    /* Object desc
13430 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73  ribing the trans
13440 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ient index */.  
13450 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
13460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
13470 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
13480 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
13490 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
134a0 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  drInit;         
134b0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
134c0 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
134d0 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75  zation bypass ju
134e0 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  mp */.  Table *p
134f0 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
13500 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
13510 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a   being indexed *
13520 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
13530 79 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yinfo;          
13540 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69  /* Key informati
13550 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  on for the index
13560 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64 64   */   .  int add
13570 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
13580 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
13590 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f  he index fill lo
135a0 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  op */.  int regR
135b0 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
135c0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
135d0 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78  holding an index
135e0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
135f0 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
13600 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
13610 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  mn counter */.  
13620 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
13630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
13640 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
13650 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20   int mxBitCol;  
13660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13670 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69  Maximum column i
13680 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  n pSrc->colUsed 
13690 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
136a0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
136b0 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
136c0 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63  quence to on a c
136d0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65  olumn */.  Where
136e0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
136f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f         /* The Lo
13700 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 42  op object */.  B
13710 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20  itmask idxCols; 
13720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
13730 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  tmap of columns 
13740 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e  used for indexin
13750 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  g */.  Bitmask e
13760 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20  xtraCols;       
13770 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
13780 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
13790 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57  ns */.  u8 sentW
137a0 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20  arning = 0;     
137b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
137c0 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65   warnning has be
137d0 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 0a 20 20  en issued */..  
137e0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
137f0 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68   to skip over th
13800 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69  e creation and i
13810 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
13820 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69   the.  ** transi
13830 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64  ent index on 2nd
13840 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
13850 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  iterations of th
13860 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d  e loop. */.  v =
13870 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
13880 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
13890 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73  ;.  addrInit = s
138a0 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
138b0 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 43 6f  Parse);..  /* Co
138c0 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
138d0 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  f columns that w
138e0 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20  ill be added to 
138f0 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61  the index.  ** a
13900 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68  nd used to match
13910 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
13920 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e  nstraints */.  n
13930 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70 54  Column = 0;.  pT
13940 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  able = pSrc->pTa
13950 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70  b;.  pWCEnd = &p
13960 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d  WC->a[pWC->nTerm
13970 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  ];.  pLoop = pLe
13980 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69  vel->pWLoop;.  i
13990 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f  dxCols = 0;.  fo
139a0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
139b0 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
139c0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
139d0 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
139e0 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e  x(pTerm, pSrc, n
139f0 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20  otReady) ){.    
13a00 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65    int iCol = pTe
13a10 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
13a20 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  ;.      Bitmask 
13a30 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d  cMask = iCol>=BM
13a40 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  S ? MASKBIT(BMS-
13a50 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f  1) : MASKBIT(iCo
13a60 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  l);.      testca
13a70 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b  se( iCol==BMS );
13a80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13a90 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
13aa0 20 20 20 20 20 20 69 66 28 20 21 73 65 6e 74 57        if( !sentW
13ab0 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  arning ){.      
13ac0 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
13ad0 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54  LITE_WARNING_AUT
13ae0 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20 20 20  OINDEX,.        
13af0 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63 20 69      "automatic i
13b00 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29 22 2c  ndex on %s(%s)",
13b10 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a   pTable->zName,.
13b20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
13b30 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  le->aCol[iCol].z
13b40 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73  Name);.        s
13b50 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a  entWarning = 1;.
13b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
13b70 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61  ( (idxCols & cMa
13b80 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
13b90 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
13ba0 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62  esize(pParse->db
13bb0 2c 20 70 4c 6f 6f 70 2c 20 6e 43 6f 6c 75 6d 6e  , pLoop, nColumn
13bc0 2b 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  +1) ) return;.  
13bd0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54        pLoop->aLT
13be0 65 72 6d 5b 6e 43 6f 6c 75 6d 6e 2b 2b 5d 20 3d  erm[nColumn++] =
13bf0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
13c00 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
13c10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13c20 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43    }.  assert( nC
13c30 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c 6f  olumn>0 );.  pLo
13c40 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
13c50 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20  = pLoop->nLTerm 
13c60 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 4c 6f  = nColumn;.  pLo
13c70 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  op->wsFlags = WH
13c80 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20  ERE_COLUMN_EQ | 
13c90 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c  WHERE_IDX_ONLY |
13ca0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a 20   WHERE_INDEXED. 
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cc0 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54 4f      | WHERE_AUTO
13cd0 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f  _INDEX;..  /* Co
13ce0 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
13cf0 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  f additional col
13d00 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63  umns needed to c
13d10 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76  reate a.  ** cov
13d20 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20  ering index.  A 
13d30 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22  "covering index"
13d40 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61   is an index tha
13d50 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20  t contains all. 
13d60 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   ** columns that
13d70 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74   are needed by t
13d80 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68 20  he query.  With 
13d90 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
13da0 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  , the.  ** origi
13db0 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20  nal table never 
13dc0 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63 65  needs to be acce
13dd0 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63  ssed.  Automatic
13de0 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20   indices must.  
13df0 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67  ** be a covering
13e00 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20 74   index because t
13e10 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f  he index will no
13e20 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66 20  t be updated if 
13e30 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
13e40 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20  l table changes 
13e50 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e  and the index an
13e60 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62  d table cannot b
13e70 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a  oth be used.  **
13e80 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20   if they go out 
13e90 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20  of sync..  */.  
13ea0 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63  extraCols = pSrc
13eb0 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64  ->colUsed & (~id
13ec0 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28  xCols | MASKBIT(
13ed0 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74  BMS-1));.  mxBit
13ee0 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e 6e  Col = (pTable->n
13ef0 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f 20  Col >= BMS-1) ? 
13f00 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d 3e  BMS-1 : pTable->
13f10 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73 65  nCol;.  testcase
13f20 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d  ( pTable->nCol==
13f30 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63  BMS-1 );.  testc
13f40 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ase( pTable->nCo
13f50 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f  l==BMS-2 );.  fo
13f60 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f  r(i=0; i<mxBitCo
13f70 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
13f80 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53   extraCols & MAS
13f90 4b 42 49 54 28 69 29 20 29 20 6e 43 6f 6c 75 6d  KBIT(i) ) nColum
13fa0 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n++;.  }.  if( p
13fb0 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d  Src->colUsed & M
13fc0 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b  ASKBIT(BMS-1) ){
13fd0 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d 20  .    nColumn += 
13fe0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42  pTable->nCol - B
13ff0 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70 4c  MS + 1;.  }.  pL
14000 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
14010 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
14020 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  | WHERE_IDX_ONLY
14030 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  ;..  /* Construc
14040 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  t the Index obje
14050 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  ct to describe t
14060 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 6e  his index */.  n
14070 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49 6e  Byte = sizeof(In
14080 64 65 78 29 3b 0a 20 20 6e 42 79 74 65 20 2b 3d  dex);.  nByte +=
14090 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28   nColumn*sizeof(
140a0 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49 6e 64  int);     /* Ind
140b0 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a 20  ex.aiColumn */. 
140c0 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d   nByte += nColum
140d0 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 3b  n*sizeof(char*);
140e0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f     /* Index.azCo
140f0 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d  ll */.  nByte +=
14100 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   nColumn;       
14110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
14120 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f  ex.aSortOrder */
14130 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65  .  pIdx = sqlite
14140 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
14150 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65 29  arse->db, nByte)
14160 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20  ;.  if( pIdx==0 
14170 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f  ) return;.  pLoo
14180 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
14190 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78  x = pIdx;.  pIdx
141a0 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72  ->azColl = (char
141b0 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20 70  **)&pIdx[1];.  p
141c0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20  Idx->aiColumn = 
141d0 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a 43  (int*)&pIdx->azC
141e0 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20  oll[nColumn];.  
141f0 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
14200 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d 3e 61   = (u8*)&pIdx->a
14210 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 5d  iColumn[nColumn]
14220 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  ;.  pIdx->zName 
14230 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a  = "auto-index";.
14240 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
14250 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49 64  = nColumn;.  pId
14260 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
14270 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69  le;.  n = 0;.  i
14280 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f  dxCols = 0;.  fo
14290 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
142a0 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
142b0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
142c0 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
142d0 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e  x(pTerm, pSrc, n
142e0 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20  otReady) ){.    
142f0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65    int iCol = pTe
14300 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
14310 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  ;.      Bitmask 
14320 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d  cMask = iCol>=BM
14330 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  S ? MASKBIT(BMS-
14340 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f  1) : MASKBIT(iCo
14350 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  l);.      testca
14360 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20  se( iCol==BMS-1 
14370 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14380 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  e( iCol==BMS );.
14390 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
143a0 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
143b0 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
143c0 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
143d0 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  r;.        idxCo
143e0 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
143f0 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
14400 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e  umn[n] = pTerm->
14410 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
14420 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
14430 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
14440 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
14450 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d  , pX->pLeft, pX-
14460 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
14470 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
14480 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c  ] = ALWAYS(pColl
14490 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  ) ? pColl->zName
144a0 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   : "BINARY";.   
144b0 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20       n++;.      
144c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
144d0 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c  sert( (u32)n==pL
144e0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
144f0 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64   );..  /* Add ad
14500 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
14510 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20   needed to make 
14520 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
14530 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20  dex into.  ** a 
14540 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a  covering index *
14550 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  /.  for(i=0; i<m
14560 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
14570 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
14580 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b   & MASKBIT(i) ){
14590 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43  .      pIdx->aiC
145a0 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20  olumn[n] = i;.  
145b0 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
145c0 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [n] = "BINARY";.
145d0 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
145e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
145f0 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42  >colUsed & MASKB
14600 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20  IT(BMS-1) ){.   
14610 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c   for(i=BMS-1; i<
14620 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b  pTable->nCol; i+
14630 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e  +){.      pIdx->
14640 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b  aiColumn[n] = i;
14650 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43  .      pIdx->azC
14660 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59  oll[n] = "BINARY
14670 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ";.      n++;.  
14680 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
14690 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  ( n==nColumn );.
146a0 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
146b0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
146c0 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20 3d   */.  pKeyinfo =
146d0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
146e0 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  info(pParse, pId
146f0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  x);.  assert( pL
14700 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30  evel->iIdxCur>=0
14710 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49   );.  pLevel->iI
14720 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  dxCur = pParse->
14730 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  nTab++;.  sqlite
14740 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
14750 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c  P_OpenAutoindex,
14760 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
14770 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a  , nColumn+1, 0,.
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14790 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 69      (char*)pKeyi
147a0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
147b0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62 65  HANDOFF);.  Vdbe
147c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72  Comment((v, "for
147d0 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e   %s", pTable->zN
147e0 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ame));..  /* Fil
147f0 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  l the automatic 
14800 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65  index with conte
14810 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20  nt */.  addrTop 
14820 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14830 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
14840 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
14850 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20  r);.  regRecord 
14860 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
14870 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
14880 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
14890 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
148a0 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  Idx, pLevel->iTa
148b0 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c  bCur, regRecord,
148c0 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   1, 0);.  sqlite
148d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
148e0 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65  P_IdxInsert, pLe
148f0 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65  vel->iIdxCur, re
14900 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
14910 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
14920 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
14930 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
14940 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14950 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c   OP_Next, pLevel
14960 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72 54  ->iTabCur, addrT
14970 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  op+1);.  sqlite3
14980 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
14990 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
149a0 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20  S_AUTOINDEX);.  
149b0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
149c0 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  ere(v, addrTop);
149d0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
149e0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
149f0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a   regRecord);.  .
14a00 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77    /* Jump here w
14a10 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65  hen skipping the
14a20 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
14a30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
14a40 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
14a50 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Init);.}.#endif 
14a60 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
14a70 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a  UTOMATIC_INDEX *
14a80 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
14a90 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
14aa0 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  BLE./*.** Alloca
14ab0 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  te and populate 
14ac0 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  an sqlite3_index
14ad0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
14ae0 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
14af0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
14b00 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
14b10 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73  ventually releas
14b20 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
14b30 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74 68  ** by passing th
14b40 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
14b50 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
14b60 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66  ion to sqlite3_f
14b70 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
14b80 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14b90 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64  nfo *allocateInd
14ba0 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20  exInfo(.  Parse 
14bb0 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65  *pParse,.  Where
14bc0 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73  Clause *pWC,.  s
14bd0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
14be0 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72  em *pSrc,.  Expr
14bf0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29  List *pOrderBy.)
14c00 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
14c10 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72  int nTerm;.  str
14c20 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
14c30 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
14c40 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
14c50 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
14c60 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65  rderby *pIdxOrde
14c70 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71  rBy;.  struct sq
14c80 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
14c90 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
14ca0 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
14cb0 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
14cc0 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69  nOrderBy;.  sqli
14cd0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
14ce0 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  pIdxInfo;..  /* 
14cf0 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
14d00 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45   of possible WHE
14d10 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
14d20 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a  aints referring.
14d30 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72    ** to this vir
14d40 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
14d50 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70  for(i=nTerm=0, p
14d60 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
14d70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
14d80 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
14d90 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
14da0 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
14db0 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
14dc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50  .    assert( IsP
14dd0 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d  owerOfTwo(pTerm-
14de0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f  >eOperator & ~WO
14df0 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74  _EQUIV) );.    t
14e00 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
14e10 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
14e20 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  N );.    testcas
14e30 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
14e40 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  tor & WO_ISNULL 
14e50 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
14e60 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
14e70 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74  O_ISNULL) ) cont
14e80 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
14e90 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
14ea0 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74  ERM_VNULL ) cont
14eb0 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b  inue;.    nTerm+
14ec0 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
14ed0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
14ee0 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  use contains onl
14ef0 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  y columns in the
14f00 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76   current .  ** v
14f10 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65  irtual table the
14f20 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  n allocate space
14f30 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42   for the aOrderB
14f40 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74  y part of.  ** t
14f50 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
14f60 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
14f70 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79  .  */.  nOrderBy
14f80 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64   = 0;.  if( pOrd
14f90 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  erBy ){.    int 
14fa0 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  n = pOrderBy->nE
14fb0 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  xpr;.    for(i=0
14fc0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
14fd0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
14fe0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
14ff0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
15000 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
15010 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
15020 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43  iTable!=pSrc->iC
15030 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
15040 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
15050 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72  n){.      nOrder
15060 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  By = n;.    }.  
15070 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
15080 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
15090 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
150a0 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66  e.  */.  pIdxInf
150b0 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
150c0 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
150d0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78  db, sizeof(*pIdx
150e0 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20  Info).          
150f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15100 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78   + (sizeof(*pIdx
15110 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a  Cons) + sizeof(*
15120 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20  pUsage))*nTerm. 
15130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15140 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
15150 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29  of(*pIdxOrderBy)
15160 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69  *nOrderBy );.  i
15170 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29  f( pIdxInfo==0 )
15180 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
15190 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
151a0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a  ut of memory");.
151b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
151c0 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
151d0 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ze the structure
151e0 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
151f0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
15200 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a  ure contains.  *
15210 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68  * many fields th
15220 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20  at are declared 
15230 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65  "const" to preve
15240 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72  nt xBestIndex fr
15250 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67  om.  ** changing
15260 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20   them.  We have 
15270 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79  to do some funky
15280 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65   casting in orde
15290 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61  r to.  ** initia
152a0 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64  lize those field
152b0 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f  s..  */.  pIdxCo
152c0 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ns = (struct sql
152d0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
152e0 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  raint*)&pIdxInfo
152f0 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72  [1];.  pIdxOrder
15300 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  By = (struct sql
15310 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
15320 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54  by*)&pIdxCons[nT
15330 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d  erm];.  pUsage =
15340 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
15350 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
15360 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72  t_usage*)&pIdxOr
15370 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b  derBy[nOrderBy];
15380 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
15390 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
153a0 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e   = nTerm;.  *(in
153b0 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
153c0 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
153d0 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
153e0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
153f0 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
15400 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20  fo->aConstraint 
15410 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28  = pIdxCons;.  *(
15420 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
15430 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26  ndex_orderby**)&
15440 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72  pIdxInfo->aOrder
15450 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79  By = pIdxOrderBy
15460 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
15470 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
15480 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70  raint_usage**)&p
15490 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
154a0 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20  aintUsage =.    
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
154f0 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  Usage;..  for(i=
15500 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  j=0, pTerm=pWC->
15510 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
15520 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
15530 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69      u8 op;.    i
15540 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
15550 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
15560 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
15570 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73  ;.    assert( Is
15580 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d  PowerOfTwo(pTerm
15590 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57  ->eOperator & ~W
155a0 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20  O_EQUIV) );.    
155b0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
155c0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
155d0 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IN );.    testca
155e0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
155f0 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
15600 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72   );.    if( pTer
15610 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
15620 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e  WO_ISNULL) ) con
15630 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
15640 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
15650 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
15660 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43  tinue;.    pIdxC
15670 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  ons[j].iColumn =
15680 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
15690 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f  lumn;.    pIdxCo
156a0 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65  ns[j].iTermOffse
156b0 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20  t = i;.    op = 
156c0 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72  (u8)pTerm->eOper
156d0 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20  ator & WO_ALL;. 
156e0 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e     if( op==WO_IN
156f0 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20   ) op = WO_EQ;. 
15700 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f     pIdxCons[j].o
15710 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54  p = op;.    /* T
15720 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e  he direct assign
15730 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76  ment in the prev
15740 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73  ious line is pos
15750 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75  sible only becau
15760 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f  se.    ** the WO
15770 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44  _ and SQLITE_IND
15780 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63  EX_CONSTRAINT_ c
15790 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63  odes are identic
157a0 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20  al.  The.    ** 
157b0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
157c0 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61  s verify this fa
157d0 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ct. */.    asser
157e0 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45  t( WO_EQ==SQLITE
157f0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
15800 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  T_EQ );.    asse
15810 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54  rt( WO_LT==SQLIT
15820 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
15830 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_LT );.    ass
15840 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49  ert( WO_LE==SQLI
15850 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
15860 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73  INT_LE );.    as
15870 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c  sert( WO_GT==SQL
15880 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
15890 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61  AINT_GT );.    a
158a0 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51  ssert( WO_GE==SQ
158b0 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
158c0 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20  RAINT_GE );.    
158d0 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48  assert( WO_MATCH
158e0 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
158f0 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20  ONSTRAINT_MATCH 
15900 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15910 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
15920 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57  & (WO_IN|WO_EQ|W
15930 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
15940 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29  |WO_GE|WO_MATCH)
15950 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d   );.    j++;.  }
15960 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
15970 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
15980 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
15990 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
159a0 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72  Expr;.    pIdxOr
159b0 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
159c0 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
159d0 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  n;.    pIdxOrder
159e0 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72  By[i].desc = pOr
159f0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
15a00 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  Order;.  }..  re
15a10 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d  turn pIdxInfo;.}
15a20 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ../*.** The tabl
15a30 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  e object referen
15a40 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ce passed as the
15a50 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
15a60 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
15a70 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73  n.** must repres
15a80 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  ent a virtual ta
15a90 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ble. This functi
15aa0 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78  on invokes the x
15ab0 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d  BestIndex().** m
15ac0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
15ad0 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20  tual table with 
15ae0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
15af0 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  x_info object th
15b00 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61  at.** comes in a
15b10 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d 65  s the 3rd argume
15b20 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
15b30 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
15b40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70   error occurs, p
15b50 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74  Parse is populat
15b60 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
15b70 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a   message and a.*
15b80 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
15b90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
15ba0 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
15bb0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f  turned and the o
15bc0 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66  utput.** part of
15bd0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
15be0 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
15bf0 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61  e is left popula
15c00 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  ted..**.** Wheth
15c10 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72  er or not an err
15c20 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  or is returned, 
15c30 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  it is the respon
15c40 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a  sibility of the.
15c50 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  ** caller to eve
15c60 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e  ntually free p->
15c70 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65  idxStr if p->nee
15c80 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e  dToFreeIdxStr in
15c90 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20  dicates.** that 
15ca0 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  this is required
15cb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15cc0 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50 61  vtabBestIndex(Pa
15cd0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
15ce0 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65  le *pTab, sqlite
15cf0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
15d00 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
15d10 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65   *pVtab = sqlite
15d20 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73  3GetVTable(pPars
15d30 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56  e->db, pTab)->pV
15d40 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tab;.  int i;.  
15d50 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45  int rc;..  TRACE
15d60 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a  _IDX_INPUTS(p);.
15d70 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d    rc = pVtab->pM
15d80 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65  odule->xBestInde
15d90 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54  x(pVtab, p);.  T
15da0 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
15db0 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  (p);..  if( rc!=
15dc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15dd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15de0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70  NOMEM ){.      p
15df0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
15e00 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
15e10 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61   }else if( !pVta
15e20 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
15e30 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15e40 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
15e50 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
15e60 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
15e70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
15e80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15e90 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  %s", pVtab->zErr
15ea0 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Msg);.    }.  }.
15eb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15ec0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
15ed0 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
15ee0 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
15ef0 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
15f00 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  nt; i++){.    if
15f10 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  ( !p->aConstrain
15f20 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70  t[i].usable && p
15f30 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
15f40 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e  ge[i].argvIndex>
15f50 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
15f60 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15f70 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74  e, .          "t
15f80 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e  able %s: xBestIn
15f90 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20  dex returned an 
15fa0 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70  invalid plan", p
15fb0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
15fc0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
15fd0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d   pParse->nErr;.}
15fe0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
15ff0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
16000 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
16010 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ...#if defined(S
16020 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
16030 54 34 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  T4) || defined(S
16040 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
16050 54 33 29 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  T3)./*.** Estima
16060 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  te the location 
16070 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  of a particular 
16080 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65  key among all ke
16090 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65  ys in an.** inde
160a0 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65  x.  Store the re
160b0 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61  sults in aStat a
160c0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
160d0 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20      aStat[0]    
160e0 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
160f0 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   rows less than 
16100 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74  pVal.**    aStat
16110 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [1]      Est. nu
16120 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75  mber of rows equ
16130 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a  al to pVal.**.**
16140 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
16150 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  K on success..*/
16160 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
16170 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61  reKeyStats(.  Pa
16180 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
16190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
161a0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
161b0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
161c0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
161d0 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f    /* Index to co
161e0 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66  nsider domain of
161f0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
16200 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20  cord *pRec,     
16210 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76    /* Vector of v
16220 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65  alues to conside
16230 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
16240 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
16250 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
16260 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
16270 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
16280 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
162a0 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
162b0 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
162c0 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53   IndexSample *aS
162d0 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
162e0 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f  ample;.  int iCo
162f0 6c 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  l = pRec->nField
16300 2d 31 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  -1;  /* Index of
16310 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20   required stats 
16320 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a  in anEq[] etc. *
16330 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30  /.  int iMin = 0
16340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16350 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70  /* Smallest samp
16360 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65  le not yet teste
16370 64 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  d */.  int i = p
16380 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20 20  Idx->nSample;   
16390 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
163a0 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61  ample larger tha
163b0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
163c0 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73  ec */.  int iTes
163d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
163e0 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70      /* Next samp
163f0 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20  le to test */.  
16400 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
16410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16420 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
16430 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  son operation */
16440 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ..  assert( pIdx
16450 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
16460 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e   assert( pRec->n
16470 46 69 65 6c 64 3e 30 20 26 26 20 69 43 6f 6c 3c  Field>0 && iCol<
16480 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  pIdx->nSampleCol
16490 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 54   );.  do{.    iT
164a0 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 29 2f 32  est = (iMin+i)/2
164b0 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  ;.    res = sqli
164c0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
164d0 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 54 65  pare(aSample[iTe
164e0 73 74 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  st].n, aSample[i
164f0 54 65 73 74 5d 2e 70 2c 20 70 52 65 63 29 3b 0a  Test].p, pRec);.
16500 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
16510 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54  .      iMin = iT
16520 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  est+1;.    }else
16530 7b 0a 20 20 20 20 20 20 69 20 3d 20 69 54 65 73  {.      i = iTes
16540 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  t;.    }.  }whil
16550 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69  e( res && iMin<i
16560 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
16570 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
16580 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
16590 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68  rt statements ch
165a0 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e  eck that the bin
165b0 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a  ary search code.
165c0 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64    ** above found
165d0 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77 65   the right answe
165e0 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  r. This block se
165f0 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20  rves no purpose 
16600 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20  other.  ** than 
16610 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73  to invoke the as
16620 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28  serts.  */.  if(
16630 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   res==0 ){.    /
16640 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73  * If (res==0) is
16650 20 74 72 75 65 2c 20 74 68 65 6e 20 73 61 6d 70   true, then samp
16660 6c 65 20 24 69 20 6d 75 73 74 20 62 65 20 65 71  le $i must be eq
16670 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20  ual to pRec */. 
16680 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64     assert( i<pId
16690 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20  x->nSample );.  
166a0 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
166b0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
166c0 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d  mpare(aSample[i]
166d0 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70  .n, aSample[i].p
166e0 2c 20 70 52 65 63 29 0a 20 20 20 20 20 20 20 20  , pRec).        
166f0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
16700 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
16710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
16720 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63 20  Otherwise, pRec 
16730 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20  must be smaller 
16740 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20 61  than sample $i a
16750 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  nd larger than. 
16760 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69     ** sample ($i
16770 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  -1).  */.    ass
16780 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  ert( i==pIdx->nS
16790 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20  ample .         
167a0 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  || sqlite3VdbeRe
167b0 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
167c0 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
167d0 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a  e[i].p, pRec)>0.
167e0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
167f0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
16800 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65  iled );.    asse
16810 72 74 28 20 69 3d 3d 30 0a 20 20 20 20 20 20 20  rt( i==0.       
16820 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65    || sqlite3Vdbe
16830 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
16840 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53  ample[i-1].n, aS
16850 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52  ample[i-1].p, pR
16860 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  ec)<0.         |
16870 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
16880 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
16890 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65  }.#endif /* ifde
168a0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
168b0 2f 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  /..  /* At this 
168c0 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69  point, aSample[i
168d0 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  ] is the first s
168e0 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67 72  ample that is gr
168f0 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20  eater than.  ** 
16900 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c  or equal to pVal
16910 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49 64 78  .  Or if i==pIdx
16920 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20  ->nSample, then 
16930 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72 65 20  all samples are 
16940 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70  less.  ** than p
16950 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c 65  Val.  If aSample
16960 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20  [i]==pVal, then 
16970 72 65 73 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 69  res==0..  */.  i
16980 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
16990 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d   aStat[0] = aSam
169a0 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  ple[i].anLt[iCol
169b0 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  ];.    aStat[1] 
169c0 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45  = aSample[i].anE
169d0 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65  q[iCol];.  }else
169e0 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c  {.    tRowcnt iL
169f0 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20 69 47  ower, iUpper, iG
16a00 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 30  ap;.    if( i==0
16a10 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
16a20 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70   = 0;.      iUpp
16a30 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e  er = aSample[0].
16a40 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
16a50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70  }else{.      iUp
16a60 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e  per = i>=pIdx->n
16a70 53 61 6d 70 6c 65 20 3f 20 70 49 64 78 2d 3e 61  Sample ? pIdx->a
16a80 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 61 53 61  iRowEst[0] : aSa
16a90 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
16aa0 6c 5d 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72  l];.      iLower
16ab0 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e   = aSample[i-1].
16ac0 61 6e 45 71 5b 69 43 6f 6c 5d 20 2b 20 61 53 61  anEq[iCol] + aSa
16ad0 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 4c 74 5b 69  mple[i-1].anLt[i
16ae0 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col];.    }.    
16af0 61 53 74 61 74 5b 31 5d 20 3d 20 28 70 49 64 78  aStat[1] = (pIdx
16b00 2d 3e 6e 43 6f 6c 75 6d 6e 3e 69 43 6f 6c 20 3f  ->nColumn>iCol ?
16b10 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43   pIdx->aAvgEq[iC
16b20 6f 6c 5d 20 3a 20 31 29 3b 0a 20 20 20 20 69 66  ol] : 1);.    if
16b30 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72  ( iLower>=iUpper
16b40 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
16b50 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
16b60 20 20 20 20 20 69 47 61 70 20 3d 20 69 55 70 70       iGap = iUpp
16b70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20  er - iLower;.   
16b80 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64   }.    if( round
16b90 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70  Up ){.      iGap
16ba0 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20   = (iGap*2)/3;. 
16bb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16bc0 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20  iGap = iGap/3;. 
16bd0 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30     }.    aStat[0
16be0 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61  ] = iLower + iGa
16bf0 70 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  p;.  }.}.#endif 
16c00 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
16c10 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
16c20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
16c30 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61  s used to estima
16c40 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
16c50 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
16c60 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  be visited.** by
16c70 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64   scanning an ind
16c80 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f  ex for a range o
16c90 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61  f values. The ra
16ca0 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20  nge may have an 
16cb0 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20  upper.** bound, 
16cc0 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f  a lower bound, o
16cd0 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52  r both. The WHER
16ce0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
16cf0 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65  hat set the uppe
16d00 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62  r.** and lower b
16d10 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73  ounds are repres
16d20 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20  ented by pLower 
16d30 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65  and pUpper respe
16d40 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20  ctively. For.** 
16d50 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
16d60 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69  g that index p i
16d70 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a  s on t1(a):.**.*
16d80 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
16d90 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
16da0 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20  a < ? ....**    
16db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16dc0 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f  |_____|   |_____
16dd0 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
16de0 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
16df0 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
16e10 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a  ower    pUpper.*
16e20 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  *.** If either o
16e30 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c  f the upper or l
16e40 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f  ower bound is no
16e50 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
16e60 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69  NULL is passed i
16e70 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68  n.** place of th
16e80 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
16e90 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
16ea0 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70   The value in (p
16eb0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
16ec0 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74  .btree.nEq) is t
16ed0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
16ee0 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  index.** column 
16ef0 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72  subject to the r
16f00 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
16f10 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
16f20 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
16f30 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  .** equality con
16f40 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a  straints optimiz
16f50 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
16f60 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
16f70 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61  or example,.** a
16f80 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20  ssuming index p 
16f90 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  is on t1(a, b), 
16fa0 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
16fb0 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
16fc0 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
16fd0 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
16fe0 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
16ff0 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20  .** then nEq is 
17000 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68 65  set to 1 (as the
17010 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65   range restricte
17020 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20  d column, b, is 
17030 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c  the second .** l
17040 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
17050 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
17060 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
17070 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
17080 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
17090 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
170a0 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
170b0 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
170c0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
170d0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
170e0 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20  , *pnOut is set 
170f0 74 6f 20 74 68 65 20 77 68 65 72 65 43 6f 73 74  to the whereCost
17100 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  () of the.** num
17110 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
17120 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
17130 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 76  is expected to v
17140 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a  isit without .**
17150 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65   considering the
17160 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
17170 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c  ts. If nEq is 0,
17180 20 74 68 69 73 20 69 73 20 74 68 65 20 6e 75 6d   this is the num
17190 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20  ber of .** rows 
171a0 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73  in the index. As
171b0 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20  suming no error 
171c0 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69  occurs, *pnOut i
171d0 73 20 61 64 6a 75 73 74 65 64 20 28 72 65 64 75  s adjusted (redu
171e0 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75  ced).** to accou
171f0 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65  nt for the range
17200 20 63 6f 6e 74 72 61 69 6e 74 73 20 70 4c 6f 77   contraints pLow
17210 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a  er and pUpper..*
17220 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73  * .** In the abs
17230 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73  ence of sqlite_s
17240 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61 74  tat4 ANALYZE dat
17250 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64 61  a, or if such da
17260 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ta cannot be.** 
17270 75 73 65 64 2c 20 65 61 63 68 20 72 61 6e 67 65  used, each range
17280 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75   inequality redu
17290 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73  ces the search s
172a0 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f 72  pace by a factor
172b0 20 6f 66 20 34 2e 20 0a 2a 2a 20 48 65 6e 63 65   of 4. .** Hence
172c0 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73 74   a pair of const
172d0 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20  raints (x>? AND 
172e0 78 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68 65  x<?) reduces the
172f0 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72   expected number
17300 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69   of.** rows visi
17310 74 65 64 20 62 79 20 61 20 66 61 63 74 6f 72 20  ted by a factor 
17320 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74 61 74 69 63  of 16..*/.static
17330 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53   int whereRangeS
17340 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
17350 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
17360 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
17370 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
17380 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
17390 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
173a0 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72 6d  der,.  WhereTerm
173b0 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c   *pLower,   /* L
173c0 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  ower bound on th
173d0 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e  e range. ex: "x>
173e0 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55  123" Might be NU
173f0 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  LL */.  WhereTer
17400 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20  m *pUpper,   /* 
17410 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Upper bound on t
17420 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
17430 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e  <455" Might be N
17440 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ULL */.  WhereCo
17450 73 74 20 2a 70 6e 4f 75 74 20 20 20 20 20 2f 2a  st *pnOut     /*
17460 20 49 4e 2f 4f 55 54 3a 20 4e 75 6d 62 65 72 20   IN/OUT: Number 
17470 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
17480 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
17490 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
174a0 74 20 6e 4f 75 74 20 3d 20 28 69 6e 74 29 2a 70  t nOut = (int)*p
174b0 6e 4f 75 74 3b 0a 0a 23 69 66 20 64 65 66 69 6e  nOut;..#if defin
174c0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
174d0 5f 53 54 41 54 34 29 20 7c 7c 20 64 65 66 69 6e  _STAT4) || defin
174e0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
174f0 5f 53 54 41 54 33 29 0a 20 20 49 6e 64 65 78 20  _STAT3).  Index 
17500 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  *p = pBuilder->p
17510 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
17520 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
17530 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
17540 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20  >u.btree.nEq;.. 
17550 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64   if( nEq==pBuild
17560 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a 20 20  er->nRecValid.  
17570 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70   && nEq<p->nSamp
17580 6c 65 43 6f 6c 0a 20 20 20 26 26 20 70 2d 3e 6e  leCol.   && p->n
17590 53 61 6d 70 6c 65 20 0a 20 20 20 26 26 20 4f 70  Sample .   && Op
175a0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
175b0 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
175c0 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29  LITE_Stat3) .  )
175d0 7b 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65  {.    UnpackedRe
175e0 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
175f0 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20  ilder->pRec;.   
17600 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20   tRowcnt a[2];. 
17610 20 20 20 75 38 20 61 66 66 20 3d 20 70 2d 3e 70     u8 aff = p->p
17620 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
17630 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69  iColumn[0]].affi
17640 6e 69 74 79 3b 0a 0a 20 20 20 20 2f 2a 20 56 61  nity;..    /* Va
17650 72 69 61 62 6c 65 20 69 4c 6f 77 65 72 20 77 69  riable iLower wi
17660 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  ll be set to the
17670 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
17680 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
17690 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 69  in .    ** the i
176a0 6e 64 65 78 20 74 68 61 74 20 61 72 65 20 6c 65  ndex that are le
176b0 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65  ss than the lowe
176c0 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
176d0 61 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a  ange query. The.
176e0 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75      ** lower bou
176f0 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e  nd being the con
17700 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50  catenation of $P
17710 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24   and $L, where $
17720 50 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  P is the.    ** 
17730 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72 6d 65  key-prefix forme
17740 64 20 62 79 20 74 68 65 20 6e 45 71 20 76 61 6c  d by the nEq val
17750 75 65 73 20 6d 61 74 63 68 65 64 20 61 67 61 69  ues matched agai
17760 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65 66 74  nst the nEq left
17770 2d 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 63 6f 6c  -most.    ** col
17780 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
17790 78 2c 20 61 6e 64 20 24 4c 20 69 73 20 74 68 65  x, and $L is the
177a0 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72   value in pLower
177b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
177c0 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20 69 73  Or, if pLower is
177d0 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e 6e   NULL or $L cann
177e0 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20  ot be extracted 
177f0 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75 73 65  from it (because
17800 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f   it.    ** is no
17810 74 20 61 20 73 69 6d 70 6c 65 20 76 61 72 69 61  t a simple varia
17820 62 6c 65 20 6f 72 20 6c 69 74 65 72 61 6c 20 76  ble or literal v
17830 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f 77 65 72  alue), the lower
17840 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20 20   bound of the.  
17850 20 20 2a 2a 20 72 61 6e 67 65 20 69 73 20 24 50    ** range is $P
17860 2e 20 44 75 65 20 74 6f 20 61 20 71 75 69 72 6b  . Due to a quirk
17870 20 69 6e 20 74 68 65 20 77 61 79 20 77 68 65 72   in the way wher
17880 65 4b 65 79 53 74 61 74 73 28 29 20 77 6f 72 6b  eKeyStats() work
17890 73 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20 69  s, even.    ** i
178a0 66 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c  f $L is availabl
178b0 65 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  e, whereKeyStats
178c0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
178d0 20 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a   both ($P) and .
178e0 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61      ** ($P:$L) a
178f0 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  nd the larger of
17900 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65   the two returne
17910 64 20 76 61 6c 75 65 73 20 75 73 65 64 2e 0a 20  d values used.. 
17920 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69 6d     **.    ** Sim
17930 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20 69  ilarly, iUpper i
17940 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 74  s to be set to t
17950 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  he estimate of t
17960 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
17970 73 0a 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68  s.    ** less th
17980 61 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  an the upper bou
17990 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  nd of the range 
179a0 71 75 65 72 79 2e 20 57 68 65 72 65 20 74 68 65  query. Where the
179b0 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 20   upper bound.   
179c0 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 28 24   ** is either ($
179d0 50 29 20 6f 72 20 28 24 50 3a 24 55 29 2e 20 41  P) or ($P:$U). A
179e0 67 61 69 6e 2c 20 65 76 65 6e 20 69 66 20 24 55  gain, even if $U
179f0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 62   is available, b
17a00 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 20 20 2a  oth values.    *
17a10 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72 65 20  * of iUpper are 
17a20 72 65 71 75 65 73 74 65 64 20 6f 66 20 77 68 65  requested of whe
17a30 72 65 4b 65 79 53 74 61 74 73 28 29 20 61 6e 64  reKeyStats() and
17a40 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75 73 65   the smaller use
17a50 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 74 52  d..    */.    tR
17a60 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 0a 20 20  owcnt iLower;.  
17a70 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72    tRowcnt iUpper
17a80 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  ;..    /* Determ
17a90 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69  ine iLower and i
17aa0 55 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29  Upper using ($P)
17ab0 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66   only. */.    if
17ac0 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20  ( nEq==0 ){.    
17ad0 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    iLower = 0;.  
17ae0 20 20 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e      iUpper = p->
17af0 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
17b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
17b10 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c   Note: this call
17b20 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69   could be optimi
17b30 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65  zed away - since
17b40 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73   the same values
17b50 20 6d 75 73 74 20 0a 20 20 20 20 20 20 2a 2a 20   must .      ** 
17b60 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73  have been reques
17b70 74 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67  ted when testing
17b80 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72 65   key $P in where
17b90 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20  EqualScanEst(). 
17ba0 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 4b   */.      whereK
17bb0 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
17bc0 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
17bd0 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
17be0 5b 30 5d 3b 0a 20 20 20 20 20 20 69 55 70 70 65  [0];.      iUppe
17bf0 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b  r = a[0] + a[1];
17c00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
17c10 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72  f possible, impr
17c20 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65  ove on the iLowe
17c30 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67  r estimate using
17c40 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20   ($P:$L). */.   
17c50 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
17c60 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
17c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c80 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
17c90 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
17ca0 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
17cb0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
17cc0 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e   pLower->pExpr->
17cd0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73  pRight;.      as
17ce0 73 65 72 74 28 20 28 70 4c 6f 77 65 72 2d 3e 65  sert( (pLower->e
17cf0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
17d00 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a  T|WO_GE))!=0 );.
17d10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17d20 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
17d30 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
17d40 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66  &pRec, pExpr, af
17d50 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20  f, nEq, &bOk);. 
17d60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
17d70 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b  ITE_OK && bOk ){
17d80 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74  .        tRowcnt
17d90 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77   iNew;.        w
17da0 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
17db0 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
17dc0 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65   a);.        iNe
17dd0 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f  w = a[0] + ((pLo
17de0 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
17df0 20 57 4f 5f 47 54 29 20 3f 20 61 5b 31 5d 20 3a   WO_GT) ? a[1] :
17e00 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
17e10 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69   iNew>iLower ) i
17e20 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20  Lower = iNew;.  
17e30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
17e40 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c   /* If possible,
17e50 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20   improve on the 
17e60 69 55 70 70 65 72 20 65 73 74 69 6d 61 74 65 20  iUpper estimate 
17e70 75 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a  using ($P:$U). *
17e80 2f 0a 20 20 20 20 69 66 28 20 70 55 70 70 65 72  /.    if( pUpper
17e90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   ){.      int bO
17ea0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
17eb0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
17ec0 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63   value is extrac
17ed0 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
17ee0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  /.      Expr *pE
17ef0 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45  xpr = pUpper->pE
17f00 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
17f10 20 20 20 61 73 73 65 72 74 28 20 28 70 55 70 70     assert( (pUpp
17f20 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
17f30 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d  (WO_LT|WO_LE))!=
17f40 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
17f50 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
17f60 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
17f70 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
17f80 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f  r, aff, nEq, &bO
17f90 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
17fa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
17fb0 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 74 52  Ok ){.        tR
17fc0 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20  owcnt iNew;.    
17fd0 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74      whereKeyStat
17fe0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
17ff0 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 1, a);.      
18000 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20    iNew = a[0] + 
18010 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61  ((pUpper->eOpera
18020 74 6f 72 20 26 20 57 4f 5f 4c 45 29 20 3f 20 61  tor & WO_LE) ? a
18030 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
18040 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65    if( iNew<iUppe
18050 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65  r ) iUpper = iNe
18060 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  w;.      }.    }
18070 0a 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ..    pBuilder->
18080 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20  pRec = pRec;.   
18090 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
180a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  OK ){.      Wher
180b0 65 43 6f 73 74 20 6e 4e 65 77 3b 0a 20 20 20 20  eCost nNew;.    
180c0 20 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f    if( iUpper>iLo
180d0 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  wer ){.        n
180e0 4e 65 77 20 3d 20 77 68 65 72 65 43 6f 73 74 28  New = whereCost(
180f0 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29  iUpper - iLower)
18100 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18110 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30         nNew = 10
18120 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  ;        assert(
18130 20 31 30 3d 3d 77 68 65 72 65 43 6f 73 74 28 32   10==whereCost(2
18140 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
18150 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74     if( nNew<nOut
18160 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74   ){.        nOut
18170 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = nNew;.      }
18180 0a 20 20 20 20 20 20 2a 70 6e 4f 75 74 20 3d 20  .      *pnOut = 
18190 28 57 68 65 72 65 43 6f 73 74 29 6e 4f 75 74 3b  (WhereCost)nOut;
181a0 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
181b0 45 28 30 78 31 30 30 2c 20 28 22 72 61 6e 67 65  E(0x100, ("range
181c0 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25   scan regions: %
181d0 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22  u..%u  est=%d\n"
181e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
181f0 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
18200 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70  iLower, (u32)iUp
18210 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20  per, nOut));.   
18220 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18230 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  _OK;.    }.  }.#
18240 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
18250 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b  RAMETER(pParse);
18260 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
18270 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a 23  TER(pBuilder);.#
18280 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
18290 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72  pLower || pUpper
182a0 20 29 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a   );.  /* TUNING:
182b0 20 20 45 61 63 68 20 69 6e 65 71 75 61 6c 69 74    Each inequalit
182c0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64  y constraint red
182d0 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20  uces the search 
182e0 73 70 61 63 65 20 34 2d 66 6f 6c 64 2e 0a 20 20  space 4-fold..  
182f0 2a 2a 20 41 20 42 45 54 57 45 45 4e 20 6f 70 65  ** A BETWEEN ope
18300 72 61 74 6f 72 2c 20 74 68 65 72 65 66 6f 72 65  rator, therefore
18310 2c 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  , reduces the se
18320 61 72 63 68 20 73 70 61 63 65 20 31 36 2d 66 6f  arch space 16-fo
18330 6c 64 20 2a 2f 0a 20 20 69 66 28 20 70 4c 6f 77  ld */.  if( pLow
18340 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77  er && (pLower->w
18350 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
18360 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  ULL)==0 ){.    n
18370 4f 75 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20  Out -= 20;      
18380 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 77 68    assert( 20==wh
18390 65 72 65 43 6f 73 74 28 34 29 20 29 3b 0a 20 20  ereCost(4) );.  
183a0 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 29  }.  if( pUpper )
183b0 7b 0a 20 20 20 20 6e 4f 75 74 20 2d 3d 20 32 30  {.    nOut -= 20
183c0 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  ;        assert(
183d0 20 32 30 3d 3d 77 68 65 72 65 43 6f 73 74 28 34   20==whereCost(4
183e0 29 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ) );.  }.  if( n
183f0 4f 75 74 3c 31 30 20 29 20 6e 4f 75 74 20 3d 20  Out<10 ) nOut = 
18400 31 30 3b 0a 20 20 2a 70 6e 4f 75 74 20 3d 20 28  10;.  *pnOut = (
18410 57 68 65 72 65 43 6f 73 74 29 6e 4f 75 74 3b 0a  WhereCost)nOut;.
18420 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18430 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
18440 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 29  TE_ENABLE_STAT4)
18450 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
18460 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29  TE_ENABLE_STAT3)
18470 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
18480 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
18490 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
184a0 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
184b0 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
184c0 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
184d0 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
184e0 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
184f0 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
18500 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
18510 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
18520 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
18530 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
18540 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
18550 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
18560 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
18570 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
18580 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
18590 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
185a0 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
185b0 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
185c0 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
185d0 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
185e0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
185f0 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
18600 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
18610 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18620 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
18630 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
18640 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
18650 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
18660 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
18670 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
18680 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
18690 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
186a0 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
186b0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
186c0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
186d0 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
186e0 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
186f0 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
18700 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
18710 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
18720 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
18730 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
18740 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
18750 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
18760 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
18770 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
18780 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
18790 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
187a0 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
187b0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
187c0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
187d0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
187e0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
187f0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
18800 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20  ssion for VALUE 
18810 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63  in the x=VALUE c
18820 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74  onstraint */.  t
18830 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
18840 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
18850 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
18860 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
18870 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42  .  Index *p = pB
18880 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
18890 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
188a0 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64  int nEq = pBuild
188b0 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
188c0 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65  e.nEq;.  Unpacke
188d0 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
188e0 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
188f0 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20    u8 aff;       
18900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
18910 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a  olumn affinity *
18920 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18940 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
18950 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52  urn code */.  tR
18960 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20  owcnt a[2];     
18970 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69          /* Stati
18980 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62  stics */.  int b
18990 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  Ok;..  assert( n
189a0 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  Eq>=1 );.  asser
189b0 74 28 20 6e 45 71 3c 3d 28 70 2d 3e 6e 43 6f 6c  t( nEq<=(p->nCol
189c0 75 6d 6e 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  umn+1) );.  asse
189d0 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d  rt( p->aSample!=
189e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
189f0 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
18a00 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
18a10 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71  r->nRecValid<nEq
18a20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c   );..  /* If val
18a30 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69  ues are not avai
18a40 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69  lable for all fi
18a50 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65  elds of the inde
18a60 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20  x to the left.  
18a70 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20  ** of this one, 
18a80 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20  no estimate can 
18a90 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20  be made. Return 
18aa0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e  SQLITE_NOTFOUND.
18ab0 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64   */.  if( pBuild
18ac0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e  er->nRecValid<(n
18ad0 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  Eq-1) ){.    ret
18ae0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
18af0 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  UND;.  }..  /* T
18b00 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
18b10 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65  zation only. The
18b20 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
18b30 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
18b40 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20  ue().  ** below 
18b50 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65  would return the
18b60 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f   same value.  */
18b70 0a 20 20 69 66 28 20 6e 45 71 3e 70 2d 3e 6e 43  .  if( nEq>p->nC
18b80 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e  olumn ){.    *pn
18b90 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Row = 1;.    ret
18ba0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18bb0 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70   }..  aff = p->p
18bc0 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
18bd0 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e  iColumn[nEq-1]].
18be0 61 66 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d  affinity;.  rc =
18bf0 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
18c00 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
18c10 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
18c20 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20  pr, aff, nEq-1, 
18c30 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65  &bOk);.  pBuilde
18c40 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a  r->pRec = pRec;.
18c50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18c60 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
18c70 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20  .  if( bOk==0 ) 
18c80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
18c90 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64  TFOUND;.  pBuild
18ca0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
18cb0 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79  nEq;..  whereKey
18cc0 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
18cd0 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
18ce0 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 30  WHERETRACE(0x100
18cf0 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e  ,("equality scan
18d00 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c   regions: %d\n",
18d10 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20   (int)a[1]));.  
18d20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20  *pnRow = a[1];. 
18d30 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
18d40 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
18d50 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
18d60 5f 53 54 41 54 34 29 20 2a 2f 0a 0a 23 69 66 20  _STAT4) */..#if 
18d70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
18d80 4e 41 42 4c 45 5f 53 54 41 54 34 29 20 7c 7c 20  NABLE_STAT4) || 
18d90 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
18da0 4e 41 42 4c 45 5f 53 54 41 54 33 29 0a 2f 2a 0a  NABLE_STAT3)./*.
18db0 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
18dc0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
18dd0 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
18de0 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
18df0 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
18e00 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68  t where the righ
18e10 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
18e20 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
18e30 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76  * is a list of v
18e40 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a  alues.  Example:
18e50 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48  .**.**        WH
18e60 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c  ERE x IN (1,2,3,
18e70 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  4).**.** Write t
18e80 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
18e90 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
18ea0 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
18eb0 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
18ec0 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
18ed0 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
18ee0 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
18ef0 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
18f00 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
18f10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
18f20 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
18f30 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
18f40 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
18f50 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
18f60 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
18f70 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
18f80 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
18f90 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
18fa0 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
18fb0 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
18fc0 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
18fd0 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
18fe0 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
18ff0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
19000 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63  ic int whereInSc
19010 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
19020 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
19030 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
19040 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
19050 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
19060 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
19070 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  er,.  ExprList *
19080 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68  pList,     /* Th
19090 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20  e value list on 
190a0 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e  the RHS of "x IN
190b0 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22   (v1,v2,v3,...)"
190c0 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
190d0 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
190e0 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
190f0 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
19100 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
19110 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  *p = pBuilder->p
19120 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
19130 64 65 78 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56  dex;.  int nRecV
19140 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d  alid = pBuilder-
19150 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e  >nRecValid;.  in
19160 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
19170 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63  ;     /* Subfunc
19180 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65  tion return code
19190 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45   */.  tRowcnt nE
191a0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
191b0 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
191c0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72  for a single ter
191d0 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  m */.  tRowcnt n
191e0 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f  RowEst = 0;    /
191f0 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f  * New estimate o
19200 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
19210 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rows */.  int i;
19220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19230 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
19240 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
19250 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b  p->aSample!=0 );
19260 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
19270 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
19280 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
19290 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70 2d  ){.    nEst = p-
192a0 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20  >aiRowEst[0];.  
192b0 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
192c0 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
192d0 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74   pBuilder, pList
192e0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e  ->a[i].pExpr, &n
192f0 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73  Est);.    nRowEs
19300 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70  t += nEst;.    p
19310 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
19320 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
19330 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
19340 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19350 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d  if( nRowEst > p-
19360 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e  >aiRowEst[0] ) n
19370 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f  RowEst = p->aiRo
19380 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e  wEst[0];.    *pn
19390 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20  Row = nRowEst;. 
193a0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
193b0 31 30 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74  100,("IN row est
193c0 69 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22  imate: est=%g\n"
193d0 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d  , nRowEst));.  }
193e0 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
193f0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d  der->nRecValid==
19400 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72  nRecValid );.  r
19410 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
19420 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
19430 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
19440 34 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  4) */../*.** Dis
19450 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74  able a term in t
19460 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
19470 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74    Except, do not
19480 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72   disable the ter
19490 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72  m.** if it contr
194a0 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52  ols a LEFT OUTER
194b0 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64   JOIN and it did
194c0 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69   not originate i
194d0 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55  n the ON.** or U
194e0 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74  SING clause of t
194f0 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  hat join..**.** 
19500 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72  Consider the ter
19510 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74  m t2.z='ok' in t
19520 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
19530 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  ries:.**.**   (1
19540 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
19550 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
19560 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48   ON t1.a=t2.x WH
19570 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  ERE t2.z='ok'.**
19580 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a     (2)  SELECT *
19590 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
195a0 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
195b0 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
195c0 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43  .**   (3)  SELEC
195d0 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20  T * FROM t1, t2 
195e0 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20  WHERE t1.a=t2.x 
195f0 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
19600 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b  .** The t2.z='ok
19610 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  ' is disabled in
19620 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61   the in (2) beca
19630 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65  use it originate
19640 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63  s.** in the ON c
19650 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d  lause.  The term
19660 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
19670 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69  (3) because it i
19680 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66  s not part.** of
19690 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
196a0 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65  IN.  In (1), the
196b0 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73   term is not dis
196c0 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73  abled..**.** Dis
196d0 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61  abling a term ca
196e0 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74  uses that term t
196f0 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  o not be tested 
19700 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  in the inner loo
19710 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e  p.** of the join
19720 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20  .  Disabling is 
19730 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
19740 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65    When terms are
19750 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79   satisfied.** by
19760 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73   indices, we dis
19770 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65  able them to pre
19780 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74  vent redundant t
19790 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65  ests in the inne
197a0 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77  r.** loop.  We w
197b0 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72  ould get the cor
197c0 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20  rect results if 
197d0 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65  nothing were eve
197e0 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62  r disabled,.** b
197f0 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72  ut joins might r
19800 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
19810 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69  er.  The trick i
19820 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20  s to disable as 
19830 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61  much.** as we ca
19840 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c  n without disabl
19850 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49  ing too much.  I
19860 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e  f we disabled in
19870 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a   (1), we'd get.*
19880 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77  * the wrong answ
19890 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  er.  See ticket 
198a0 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  #813..*/.static 
198b0 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d  void disableTerm
198c0 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65  (WhereLevel *pLe
198d0 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a  vel, WhereTerm *
198e0 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54  pTerm){.  if( pT
198f0 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54  erm.      && (pT
19900 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
19910 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20  ERM_CODED)==0.  
19920 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e      && (pLevel->
19930 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20  iLeftJoin==0 || 
19940 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
19950 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
19960 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b  _FromJoin)).  ){
19970 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  .    pTerm->wtFl
19980 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
19990 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  D;.    if( pTerm
199a0 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a  ->iParent>=0 ){.
199b0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
199c0 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d  *pOther = &pTerm
199d0 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e  ->pWC->a[pTerm->
199e0 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
199f0 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e  if( (--pOther->n
19a00 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20  Child)==0 ){.   
19a10 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
19a20 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29  (pLevel, pOther)
19a30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19a40 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
19a50 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79  e an OP_Affinity
19a60 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79   opcode to apply
19a70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
19a80 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66  nity string zAff
19a90 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67  .** to the n reg
19aa0 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
19ab0 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  at base. .**.** 
19ac0 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  As an optimizati
19ad0 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  on, SQLITE_AFF_N
19ae0 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69  ONE entries (whi
19af0 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61  ch are no-ops) a
19b00 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69  t the.** beginni
19b10 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41  ng and end of zA
19b20 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20  ff are ignored. 
19b30 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   If all entries 
19b40 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53  in zAff are.** S
19b50 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20  QLITE_AFF_NONE, 
19b60 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74  then no code get
19b70 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a  s generated..**.
19b80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19b90 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f  makes its own co
19ba0 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68  py of zAff so th
19bb0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  at the caller is
19bc0 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69   free.** to modi
19bd0 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68  fy zAff after th
19be0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
19bf0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
19c00 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69  id codeApplyAffi
19c10 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72  nity(Parse *pPar
19c20 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e  se, int base, in
19c30 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29  t n, char *zAff)
19c40 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
19c50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
19c60 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20  f( zAff==0 ){.  
19c70 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
19c80 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
19c90 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
19ca0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
19cb0 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  v!=0 );..  /* Ad
19cc0 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20  just base and n 
19cd0 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c  to skip over SQL
19ce0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74  ITE_AFF_NONE ent
19cf0 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69  ries at the begi
19d00 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65  nning.  ** and e
19d10 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69  nd of the affini
19d20 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a  ty string..  */.
19d30 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
19d40 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f  zAff[0]==SQLITE_
19d50 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
19d60 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b  n--;.    base++;
19d70 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d  .    zAff++;.  }
19d80 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26  .  while( n>1 &&
19d90 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49   zAff[n-1]==SQLI
19da0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
19db0 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f     n--;.  }..  /
19dc0 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66  * Code the OP_Af
19dd0 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66  finity opcode if
19de0 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69   there is anythi
19df0 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a  ng left to do. *
19e00 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  /.  if( n>0 ){. 
19e10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19e20 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp2(v, OP_Affin
19e30 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  ity, base, n);. 
19e40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
19e50 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41  angeP4(v, -1, zA
19e60 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ff, n);.    sqli
19e70 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
19e80 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
19e90 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d  e, base, n);.  }
19ea0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
19eb0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73  ate code for a s
19ec0 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74  ingle equality t
19ed0 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
19ee0 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75   clause.  An equ
19ef0 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61  ality.** term ca
19f00 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78  n be either X=ex
19f10 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29  pr or X IN (...)
19f20 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65  .   pTerm is the
19f30 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20   term to be .** 
19f40 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  coded..**.** The
19f50 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66   current value f
19f60 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  or the constrain
19f70 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  t is left in reg
19f80 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a  ister iReg..**.*
19f90 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  * For a constrai
19fa0 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  nt of the form X
19fb0 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65  =expr, the expre
19fc0 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74  ssion is evaluat
19fd0 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65  ed and its.** re
19fe0 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  sult is left on 
19ff0 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20  the stack.  For 
1a000 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74  constraints of t
1a010 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e  he form X IN (..
1a020 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  .).** this routi
1a030 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f  ne sets up a loo
1a040 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72  p that will iter
1a050 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  ate over all val
1a060 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61  ues of X..*/.sta
1a070 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61  tic int codeEqua
1a080 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73  lityTerm(.  Pars
1a090 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1a0a0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
1a0b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
1a0c0 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
1a0d0 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74  /* The term of t
1a0e0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1a0f0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
1a100 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1a110 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65  vel, /* The leve
1a120 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
1a130 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
1a140 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ing on */.  int 
1a150 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  iEq,            
1a160 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1a170 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69  equality term wi
1a180 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20  thin this level 
1a190 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
1a1a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1a1b0 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64   for reverse-ord
1a1c0 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73  er IN operations
1a1d0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65   */.  int iTarge
1a1e0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74  t         /* Att
1a1f0 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65  empt to leave re
1a200 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65  sults in this re
1a210 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
1a220 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
1a230 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a  >pExpr;.  Vdbe *
1a240 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1a250 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20  e;.  int iReg;  
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a270 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
1a280 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ing results */..
1a290 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65    assert( iTarge
1a2a0 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d  t>0 );.  if( pX-
1a2b0 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
1a2c0 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
1a2d0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1a2e0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
1a2f0 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d  t, iTarget);.  }
1a300 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d  else if( pX->op=
1a310 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
1a320 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
1a330 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a340 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1a350 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69  ll, 0, iReg);.#i
1a360 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a370 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
1a380 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70  se{.    int eTyp
1a390 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e;.    int iTab;
1a3a0 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f  .    struct InLo
1a3b0 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65  op *pIn;.    Whe
1a3c0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
1a3d0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1a3e0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
1a3f0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1a400 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
1a410 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70  0.      && pLoop
1a420 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1a430 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f  !=0.      && pLo
1a440 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1a450 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
1a460 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq].    ){.     
1a470 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d   testcase( iEq==
1a480 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1a490 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20  ase( bRev );.   
1a4a0 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b     bRev = !bRev;
1a4b0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1a4c0 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
1a4d0 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   );.    iReg = i
1a4e0 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70  Target;.    eTyp
1a4f0 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
1a500 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
1a510 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65  X, 0);.    if( e
1a520 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type==IN_INDEX_I
1a530 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20  NDEX_DESC ){.   
1a540 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65     testcase( bRe
1a550 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20  v );.      bRev 
1a560 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20  = !bRev;.    }. 
1a570 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54     iTab = pX->iT
1a580 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  able;.    sqlite
1a590 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
1a5a0 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
1a5b0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
1a5c0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1a5d0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1a5e0 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
1a5f0 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f  R)==0 );.    pLo
1a600 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
1a610 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20  HERE_IN_ABLE;.  
1a620 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e    if( pLevel->u.
1a630 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20  in.nIn==0 ){.   
1a640 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e     pLevel->addrN
1a650 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
1a660 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1a670 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1a680 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20  u.in.nIn++;.    
1a690 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
1a6a0 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71  Loop =.       sq
1a6b0 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
1a6c0 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
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 2c 0a 20 20 20 20 20 20 20 20 20  nLoop,.         
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a700 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76       sizeof(pLev
1a710 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
1a720 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69  [0])*pLevel->u.i
1a730 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20  n.nIn);.    pIn 
1a740 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  = pLevel->u.in.a
1a750 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  InLoop;.    if( 
1a760 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  pIn ){.      pIn
1a770 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   += pLevel->u.in
1a780 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20  .nIn - 1;.      
1a790 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62  pIn->iCur = iTab
1a7a0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
1a7b0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
1a7c0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  D ){.        pIn
1a7d0 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
1a7e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a7f0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
1a800 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20  b, iReg);.      
1a810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1a820 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
1a830 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a840 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
1a850 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a  iTab, 0, iReg);.
1a860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
1a870 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20  n->eEndLoopOp = 
1a880 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
1a890 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
1a8a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a8b0 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
1a8c0 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iReg);.    }else
1a8d0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1a8e0 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20  u.in.nIn = 0;.  
1a8f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
1a900 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1a910 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72  vel, pTerm);.  r
1a920 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f  eturn iReg;.}../
1a930 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1a940 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
1a950 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64  luate all == and
1a960 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
1a970 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e  for an.** index.
1a980 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1a990 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62  le, consider tab
1a9a0 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c  le t1(a,b,c,d,e,
1a9b0 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31  f) with index i1
1a9c0 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70  (a,b,c)..** Supp
1a9d0 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ose the WHERE cl
1a9e0 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61  ause is this:  a
1a9f0 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c  ==5 AND b IN (1,
1aa00 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44  2,3) AND c>5 AND
1aa10 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64   c<10.** The ind
1aa20 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61  ex has as many a
1aa30 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79  s three equality
1aa40 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75   constraints, bu
1aa50 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61  t in this.** exa
1aa60 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20  mple, the third 
1aa70 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20  "c" value is an 
1aa80 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20  inequality.  So 
1aa90 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e  only two .** con
1aaa0 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64  straints are cod
1aab0 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
1aac0 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  e will generate 
1aad0 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
1aae0 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49  .** a==5 and b I
1aaf0 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20  N (1,2,3).  The 
1ab00 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
1ab10 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20  or a and b will 
1ab20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  be stored.** in 
1ab30 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
1ab40 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e  sters and the in
1ab50 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
1ab60 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74   register is ret
1ab70 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  urned..**.** In 
1ab80 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
1ab90 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74  e nEq==2.  But t
1aba0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77  his subroutine w
1abb0 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c  orks for any val
1abc0 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63  ue.** of nEq inc
1abd0 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45  luding 0.  If nE
1abe0 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69  q==0, this routi
1abf0 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e  ne is nearly a n
1ac00 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  o-op..** The onl
1ac10 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20  y thing it does 
1ac20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  is allocate the 
1ac30 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d  pLevel->iMem mem
1ac40 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20  ory cell and.** 
1ac50 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69  compute the affi
1ac60 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  nity string..**.
1ac70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ac80 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73  always allocates
1ac90 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65   at least one me
1aca0 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65  mory cell and re
1acb0 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64  turns.** the ind
1acc0 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72  ex of that memor
1acd0 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65  y cell. The code
1ace0 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74   that.** calls t
1acf0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1ad00 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79   use that memory
1ad10 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74   cell to store t
1ad20 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a  he termination.*
1ad30 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
1ad40 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
1ad50 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
1ad60 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
1ad70 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
1ad80 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
1ad90 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
1ada0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
1adb0 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
1adc0 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
1add0 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20  turning, *pzAff 
1ade0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1adf0 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
1ae00 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79  aining a.** copy
1ae10 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
1ae20 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f  ffinity string o
1ae30 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f  f the index allo
1ae40 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  cated using.** s
1ae50 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
1ae60 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65  . Except, entrie
1ae70 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66  s in the copy of
1ae80 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f   the string asso
1ae90 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65  ciated.** with e
1aea0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1aeb0 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e  nts that use NON
1aec0 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20 73  E affinity are s
1aed0 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f  et to.** SQLITE_
1aee0 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69  AFF_NONE. This i
1aef0 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  s to deal with S
1af00 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20 66  QL such as the f
1af10 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
1af20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1af30 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52 59  1(a TEXT PRIMARY
1af40 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53   KEY, b);.**   S
1af50 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
1af60 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45 52  1 AS t2, t1 WHER
1af70 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a  E t1.a = t2.b;.*
1af80 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d  *.** In the exam
1af90 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69  ple above, the i
1afa0 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61  ndex on t1(a) ha
1afb0 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e  s TEXT affinity.
1afc0 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68   But since.** th
1afd0 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69 64  e right hand sid
1afe0 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74  e of the equalit
1aff0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32  y constraint (t2
1b000 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66  .b) has NONE aff
1b010 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e  inity,.** no con
1b020 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62  version should b
1b030 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f  e attempted befo
1b040 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20  re using a t2.b 
1b050 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66  value as part of
1b060 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61  .** a key to sea
1b070 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48  rch the index. H
1b080 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 62  ence the first b
1b090 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75 72  yte in the retur
1b0a0 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20  ned affinity.** 
1b0b0 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65  string in this e
1b0c0 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20  xample would be 
1b0d0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46  set to SQLITE_AF
1b0e0 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69  F_NONE..*/.stati
1b0f0 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75  c int codeAllEqu
1b100 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61  alityTerms(.  Pa
1b110 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1b120 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1b130 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
1b140 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
1b150 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65    /* Which neste
1b160 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52  d loop of the FR
1b170 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  OM we are coding
1b180 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
1b190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b1a0 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72  everse the order
1b1b0 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   of IN operators
1b1c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
1b1d0 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Reg,        /* N
1b1e0 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
1b1f0 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
1b200 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cate */.  char *
1b210 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20 20  *pzAff          
1b220 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70  /* OUT: Set to p
1b230 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79  oint to affinity
1b240 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
1b250 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20  int nEq;        
1b260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b270 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
1b280 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69  = or IN constrai
1b290 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20  nts to code */. 
1b2a0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1b2b0 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
1b2c0 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63  * The vm under c
1b2d0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1b2e0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b300 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e  * The index bein
1b310 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  g used for this 
1b320 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54  loop */.  WhereT
1b330 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
1b340 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
1b350 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  gle constraint t
1b360 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  erm */.  WhereLo
1b370 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
1b380 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
1b390 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
1b3a0 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
1b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3c0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1b3d0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  r */.  int regBa
1b3e0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1b3f0 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
1b400 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  ister */.  int n
1b410 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
1b420 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b430 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  er of registers 
1b440 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
1b450 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20   char *zAff;    
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b470 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * Affinity strin
1b480 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  g to return */..
1b490 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65    /* This module
1b4a0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
1b4b0 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74  on query plans t
1b4c0 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  hat use an index
1b4d0 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  . */.  pLoop = p
1b4e0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
1b4f0 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
1b500 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1b510 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
1b520 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f  0 );.  nEq = pLo
1b530 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
1b540 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d  .  pIdx = pLoop-
1b550 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
1b560 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21  .  assert( pIdx!
1b570 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  =0 );..  /* Figu
1b580 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
1b590 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20  memory cells we 
1b5a0 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61  will need then a
1b5b0 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20  llocate them..  
1b5c0 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70  */.  regBase = p
1b5d0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
1b5e0 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d  .  nReg = pLoop-
1b5f0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e  >u.btree.nEq + n
1b600 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72  ExtraReg;.  pPar
1b610 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
1b620 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69  ;..  zAff = sqli
1b630 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72  te3DbStrDup(pPar
1b640 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49  se->db, sqlite3I
1b650 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28  ndexAffinityStr(
1b660 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28  v, pIdx));.  if(
1b670 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50   !zAff ){.    pP
1b680 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1b690 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
1b6a0 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74  .  /* Evaluate t
1b6b0 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  he equality cons
1b6c0 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  traints.  */.  a
1b6d0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
1b6e0 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66  lumn>=nEq );.  f
1b6f0 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a  or(j=0; j<nEq; j
1b700 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b  ++){.    int r1;
1b710 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
1b720 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
1b730 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
1b740 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  !=0 );.    /* Th
1b750 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65  e following true
1b760 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74   for indices wit
1b770 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  h redundant colu
1b780 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a  mns. .    ** Ex:
1b790 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
1b7a0 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53   ON t1(a,b,a); S
1b7b0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1b7c0 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d  WHERE a=0 AND b=
1b7d0 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61  0; */.    testca
1b7e0 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  se( (pTerm->wtFl
1b7f0 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
1b800 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )!=0 );.    test
1b810 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
1b820 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1b830 55 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d 20  UAL );.    r1 = 
1b840 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
1b850 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
1b860 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
1b870 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
1b880 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65   if( r1!=regBase
1b890 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  +j ){.      if( 
1b8a0 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nReg==1 ){.     
1b8b0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1b8c0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1b8d0 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20   regBase);.     
1b8e0 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b     regBase = r1;
1b8f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b900 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b910 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
1b920 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65  opy, r1, regBase
1b930 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
1b940 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
1b950 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1b960 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
1b970 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1b980 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1b990 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69  & WO_IN );.    i
1b9a0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1b9b0 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
1b9c0 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a  L|WO_IN))==0 ){.
1b9d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
1b9e0 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  ht = pTerm->pExp
1b9f0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
1ba00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ba10 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52  IsNullJump(v, pR
1ba20 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c  ight, regBase+j,
1ba30 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
1ba40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66  );.      if( zAf
1ba50 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  f ){.        if(
1ba60 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
1ba70 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
1ba80 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45  zAff[j])==SQLITE
1ba90 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
1baa0 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d         zAff[j] =
1bab0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1bac0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bad0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1bae0 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
1baf0 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
1bb00 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20   zAff[j]) ){.   
1bb10 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d         zAff[j] =
1bb20 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1bb30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bb40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1bb50 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20  *pzAff = zAff;. 
1bb60 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b   return regBase;
1bb70 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1bb80 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
1bb90 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1bba0 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72 20 66  ne is a helper f
1bbb0 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52  or explainIndexR
1bbc0 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a  ange() below.**.
1bbd0 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68  ** pStr holds th
1bbe0 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70  e text of an exp
1bbf0 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20  ression that we 
1bc00 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20  are building up 
1bc10 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61  one term.** at a
1bc20 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75   time.  This rou
1bc30 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20  tine adds a new 
1bc40 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20  term to the end 
1bc50 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1bc60 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20  n..** Terms are 
1bc70 73 65 70 61 72 61 74 65 64 20 62 79 20 41 4e 44  separated by AND
1bc80 20 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44   so add the "AND
1bc90 22 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e  " text for secon
1bca0 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
1bcb0 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a  .** terms only..
1bcc0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1bcd0 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
1bce0 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53  (.  StrAccum *pS
1bcf0 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
1bd00 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78 70 72  /* The text expr
1bd10 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69  ession being bui
1bd20 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72  lt */.  int iTer
1bd30 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
1bd40 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1bd50 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73  this term.  Firs
1bd60 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63  t is zero */.  c
1bd70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
1bd80 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  mn,        /* Na
1bd90 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
1bda0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1bdb0 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20   *zOp           
1bdc0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1bdd0 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a   operator */.){.
1bde0 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 73 71    if( iTerm ) sq
1bdf0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1be00 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20  end(pStr, " AND 
1be10 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", 5);.  sqlite3
1be20 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
1be30 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31  Str, zColumn, -1
1be40 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
1be50 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
1be60 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69   zOp, 1);.  sqli
1be70 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1be80 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b  d(pStr, "?", 1);
1be90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
1bea0 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69  nt pLevel descri
1beb0 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66  bes a strategy f
1bec0 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c  or scanning tabl
1bed0 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a  e pTab. This .**
1bee0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1bef0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1bf00 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 63   string buffer c
1bf10 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63  ontaining a desc
1bf20 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ription.** of th
1bf30 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c  e subset of tabl
1bf40 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62  e rows scanned b
1bf50 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69  y the strategy i
1bf60 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e  n the form of an
1bf70 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69  .** SQL expressi
1bf80 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72  on. Or, if all r
1bf90 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c  ows are scanned,
1bfa0 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
1bfb0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
1bfc0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65  mple, if the que
1bfd0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  ry:.**.**   SELE
1bfe0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
1bff0 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a  RE a=1 AND b>2;.
1c000 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64  **.** is run and
1c010 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64   there is an ind
1c020 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68  ex on (a, b), th
1c030 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1c040 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74   returns a.** st
1c050 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a  ring similar to:
1c060 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e  .**.**   "a=? AN
1c070 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65  D b>?".**.** The
1c080 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
1c090 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f  r points to memo
1c0a0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
1c0b0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1c0c0 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  ()..** It is the
1c0d0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1c0e0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
1c0f0 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72   free the buffer
1c100 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e   when it is.** n
1c110 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
1c120 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
1c130 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52  r *explainIndexR
1c140 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62  ange(sqlite3 *db
1c150 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f  , WhereLoop *pLo
1c160 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  op, Table *pTab)
1c170 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
1c180 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
1c190 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  ee.pIndex;.  int
1c1a0 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
1c1b0 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 69 6e 74  btree.nEq;.  int
1c1c0 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20   i, j;.  Column 
1c1d0 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  *aCol = pTab->aC
1c1e0 6f 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c  ol;.  int *aiCol
1c1f0 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69  umn = pIndex->ai
1c200 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63  Column;.  StrAcc
1c210 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e  um txt;..  if( n
1c220 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d  Eq==0 && (pLoop-
1c230 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
1c240 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
1c250 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30  E_TOP_LIMIT))==0
1c260 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1c270 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
1c280 74 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74  trAccumInit(&txt
1c290 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d  , 0, 0, SQLITE_M
1c2a0 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78  AX_LENGTH);.  tx
1c2b0 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c  t.db = db;.  sql
1c2c0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1c2d0 6e 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32  nd(&txt, " (", 2
1c2e0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1c2f0 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65  nEq; i++){.    e
1c300 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
1c310 28 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61  (&txt, i, aCol[a
1c320 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d  iColumn[i]].zNam
1c330 65 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20  e, "=");.  }..  
1c340 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f  j = i;.  if( pLo
1c350 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  op->wsFlags&WHER
1c360 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
1c370 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d     char *z = (j=
1c380 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  =pIndex->nColumn
1c390 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61   ) ? "rowid" : a
1c3a0 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  Col[aiColumn[j]]
1c3b0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c  .zName;.    expl
1c3c0 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74  ainAppendTerm(&t
1c3d0 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29  xt, i++, z, ">")
1c3e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  ;.  }.  if( pLoo
1c3f0 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45  p->wsFlags&WHERE
1c400 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _TOP_LIMIT ){.  
1c410 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d    char *z = (j==
1c420 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
1c430 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43  ) ? "rowid" : aC
1c440 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  ol[aiColumn[j]].
1c450 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61  zName;.    expla
1c460 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78  inAppendTerm(&tx
1c470 74 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20  t, i, z, "<");. 
1c480 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41   }.  sqlite3StrA
1c490 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c  ccumAppend(&txt,
1c4a0 20 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75   ")", 1);.  retu
1c4b0 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  rn sqlite3StrAcc
1c4c0 75 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a  umFinish(&txt);.
1c4d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1c4e0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1c4f0 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74  p unless current
1c500 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  ly processing an
1c510 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
1c520 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20  LAN.** command. 
1c530 49 66 20 74 68 65 20 71 75 65 72 79 20 62 65 69  If the query bei
1c540 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61  ng compiled is a
1c550 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
1c560 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a  PLAN, a single.*
1c570 2a 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65  * record is adde
1c580 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
1c590 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
1c5a0 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74  table scan strat
1c5b0 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65  egy in .** pLeve
1c5c0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
1c5d0 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e  d explainOneScan
1c5e0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1c5f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1c600 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
1c610 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
1c620 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
1c630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1c640 6c 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f  le list this loo
1c650 70 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20  p refers to */. 
1c660 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1c670 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
1c680 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74   /* Scan to writ
1c690 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63  e OP_Explain opc
1c6a0 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ode for */.  int
1c6b0 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c6d0 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c  Value for "level
1c6e0 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70  " column of outp
1c6f0 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  ut */.  int iFro
1c700 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
1c710 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1c720 20 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75   for "from" colu
1c730 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a  mn of output */.
1c740 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
1c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c760 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
1c770 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
1c780 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20  eBegin() */.){. 
1c790 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
1c7a0 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 73  lain==2 ){.    s
1c7b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1c7c0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
1c7d0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
1c7e0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62  >iFrom];.    Vdb
1c7f0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1c800 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d  Vdbe;      /* VM
1c810 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
1c820 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
1c830 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1c840 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62  db;     /* Datab
1c850 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
1c860 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20    char *zMsg;   
1c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c880 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 74  /* Text to add t
1c890 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a  o EQP output */.
1c8a0 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50      int iId = pP
1c8b0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b  arse->iSelectId;
1c8c0 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28    /* Select id (
1c8d0 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74  left-most output
1c8e0 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20   column) */.    
1c8f0 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20 20  int isSearch;   
1c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c910 20 54 72 75 65 20 66 6f 72 20 61 20 53 45 41 52   True for a SEAR
1c920 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43  CH. False for SC
1c930 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  AN. */.    Where
1c940 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
1c950 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c960 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72  controlling Wher
1c970 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
1c980 20 20 20 20 75 33 32 20 66 6c 61 67 73 3b 20 20      u32 flags;  
1c990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9a0 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20    /* Flags that 
1c9b0 64 65 73 63 72 69 62 65 20 74 68 69 73 20 6c 6f  describe this lo
1c9c0 6f 70 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70  op */..    pLoop
1c9d0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
1c9e0 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70  p;.    flags = p
1c9f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
1ca00 20 20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48     if( (flags&WH
1ca10 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c  ERE_MULTI_OR) ||
1ca20 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
1ca30 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
1ca40 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  ) ) return;..   
1ca50 20 69 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61   isSearch = (fla
1ca60 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49  gs&(WHERE_BTM_LI
1ca70 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  MIT|WHERE_TOP_LI
1ca80 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20  MIT))!=0.       
1ca90 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26       || ((flags&
1caa0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1cab0 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70  LE)==0 && (pLoop
1cac0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29  ->u.btree.nEq>0)
1cad0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ).            ||
1cae0 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48   (wctrlFlags&(WH
1caf0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c  ERE_ORDERBY_MIN|
1cb00 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
1cb10 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d  X));..    zMsg =
1cb20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1cb30 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72  db, "%s", isSear
1cb40 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41  ch?"SEARCH":"SCA
1cb50 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  N");.    if( pIt
1cb60 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
1cb70 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1cb80 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1cb90 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51 55 45  zMsg, "%s SUBQUE
1cba0 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74  RY %d", zMsg,pIt
1cbb0 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a  em->iSelectId);.
1cbc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cbd0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1cbe0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1cbf0 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c  , "%s TABLE %s",
1cc00 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e   zMsg, pItem->zN
1cc10 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ame);.    }..   
1cc20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
1cc30 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  as ){.      zMsg
1cc40 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1cc50 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1cc60 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70   AS %s", zMsg, p
1cc70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
1cc80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
1cc90 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b  ags & (WHERE_IPK
1cca0 7c 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41  |WHERE_VIRTUALTA
1ccb0 42 4c 45 29 29 3d 3d 30 0a 20 20 20 20 20 26 26  BLE))==0.     &&
1ccc0 20 41 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 75   ALWAYS(pLoop->u
1ccd0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30  .btree.pIndex!=0
1cce0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63  ).    ){.      c
1ccf0 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78  har *zWhere = ex
1cd00 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28  plainIndexRange(
1cd10 64 62 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d  db, pLoop, pItem
1cd20 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a  ->pTab);.      z
1cd30 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1cd40 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 0a  pendf(db, zMsg,.
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1cd60 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  (flags & WHERE_A
1cd70 55 54 4f 5f 49 4e 44 45 58 29 20 3f 20 0a 20 20  UTO_INDEX) ? .  
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd90 20 22 25 73 20 55 53 49 4e 47 20 41 55 54 4f 4d   "%s USING AUTOM
1cda0 41 54 49 43 20 25 73 49 4e 44 45 58 25 2e 30 73  ATIC %sINDEX%.0s
1cdb0 25 73 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20  %s" :.          
1cdc0 20 20 20 20 20 20 20 20 20 22 25 73 20 55 53 49           "%s USI
1cdd0 4e 47 20 25 73 49 4e 44 45 58 20 25 73 25 73 22  NG %sINDEX %s%s"
1cde0 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ), .            
1cdf0 20 20 20 7a 4d 73 67 2c 20 28 28 66 6c 61 67 73     zMsg, ((flags
1ce00 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
1ce10 59 29 20 3f 20 22 43 4f 56 45 52 49 4e 47 20 22  Y) ? "COVERING "
1ce20 20 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 20 20   : ""),.        
1ce30 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e         pLoop->u.
1ce40 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
1ce50 61 6d 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  ame, zWhere);.  
1ce60 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1ce70 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20  e(db, zWhere);. 
1ce80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
1ce90 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29  ags & WHERE_IPK)
1cea0 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26 20  !=0 && (flags & 
1ceb0 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54  WHERE_CONSTRAINT
1cec0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d  )!=0 ){.      zM
1ced0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1cee0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1cef0 25 73 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52  %s USING INTEGER
1cf00 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a   PRIMARY KEY", z
1cf10 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  Msg);..      if(
1cf20 20 66 6c 61 67 73 26 28 57 48 45 52 45 5f 43 4f   flags&(WHERE_CO
1cf30 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f  LUMN_EQ|WHERE_CO
1cf40 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20  LUMN_IN) ){.    
1cf50 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1cf60 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1cf70 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d  Msg, "%s (rowid=
1cf80 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
1cf90 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
1cfa0 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49  gs&WHERE_BOTH_LI
1cfb0 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48  MIT)==WHERE_BOTH
1cfc0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
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 3e 3f 20  g, "%s (rowid>? 
1d000 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a  AND rowid<?)", z
1d010 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
1d020 65 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52  e if( flags&WHER
1d030 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
1d040 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
1d050 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1d060 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
1d070 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id>?)", zMsg);. 
1d080 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
1d090 4c 57 41 59 53 28 66 6c 61 67 73 26 57 48 45 52  LWAYS(flags&WHER
1d0a0 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a  E_TOP_LIMIT) ){.
1d0b0 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
1d0c0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1d0d0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f  b, zMsg, "%s (ro
1d0e0 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid<?)", zMsg);.
1d0f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
1d100 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d110 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1d120 20 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61     else if( (fla
1d130 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
1d140 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
1d150 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1d160 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1d170 7a 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55 41  zMsg, "%s VIRTUA
1d180 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64  L TABLE INDEX %d
1d190 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20  :%s", zMsg,.    
1d1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
1d1b0 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  oop->u.vtab.idxN
1d1c0 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  um, pLoop->u.vta
1d1d0 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d  b.idxStr);.    }
1d1e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67  .#endif.    zMsg
1d1f0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1d200 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1d210 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71  ", zMsg);.    sq
1d220 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1d230 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69  v, OP_Explain, i
1d240 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f  Id, iLevel, iFro
1d250 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  m, zMsg, P4_DYNA
1d260 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  MIC);.  }.}.#els
1d270 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  e.# define expla
1d280 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c  inOneScan(u,v,w,
1d290 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a  x,y,z).#endif /*
1d2a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
1d2b0 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  LAIN */.../*.** 
1d2c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1d2d0 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  r the start of t
1d2e0 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f  he iLevel-th loo
1d2f0 70 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  p in the WHERE c
1d300 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  lause.** impleme
1d310 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ntation describe
1d320 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a  d by pWInfo..*/.
1d330 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63  static Bitmask c
1d340 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
1d350 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
1d360 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c  Info,   /* Compl
1d370 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ete information 
1d380 61 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20  about the WHERE 
1d390 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
1d3a0 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
1d3b0 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20   /* Which level 
1d3c0 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73  of pWInfo->a[] s
1d3d0 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a  hould be coded *
1d3e0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
1d3f0 65 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63  eady     /* Whic
1d400 68 20 74 61 62 6c 65 73 20 61 72 65 20 63 75 72  h tables are cur
1d410 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
1d420 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20   */.){.  int j, 
1d430 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
1d440 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
1d450 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  /.  int iCur;   
1d460 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d470 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
1d480 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
1d490 6e 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20  nt addrNxt;     
1d4a0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
1d4b0 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65  jump to continue
1d4c0 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49   with the next I
1d4d0 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  N case */.  int 
1d4e0 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20  omitTable;      
1d4f0 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75   /* True if we u
1d500 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c  se the index onl
1d510 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b  y */.  int bRev;
1d520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d530 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  rue if we need t
1d540 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73  o scan in revers
1d550 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65  e order */.  Whe
1d560 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
1d570 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c    /* The where l
1d580 65 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64  evel to be coded
1d590 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
1d5a0 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68  *pLoop;    /* Th
1d5b0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
1d5c0 63 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  ct being coded *
1d5d0 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
1d5e0 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f  *pWC;    /* Deco
1d5f0 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65  mposition of the
1d600 20 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c   entire WHERE cl
1d610 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  ause */.  WhereT
1d620 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
1d630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
1d640 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
1d650 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
1d660 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
1d670 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1d680 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
1d690 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d6b0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
1d6c0 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
1d6d0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1d6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d6f0 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75   prepared stmt u
1d700 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1d710 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ns */.  struct S
1d720 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
1d730 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20  bItem;  /* FROM 
1d740 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e  clause term bein
1d750 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
1d760 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20   addrBrk;       
1d770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d780 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
1d790 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  ak out of the lo
1d7a0 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
1d7b0 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  Cont;           
1d7c0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
1d7d0 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
1d7e0 20 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65   with next cycle
1d7f0 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64   */.  int iRowid
1d800 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
1d810 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72  /* Rowid is stor
1d820 65 64 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ed in this regis
1d830 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f  ter, if not zero
1d840 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61   */.  int iRelea
1d850 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  seReg = 0;      
1d860 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72  /* Temp register
1d870 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20   to free before 
1d880 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 20 20 42  returning */.  B
1d890 69 74 6d 61 73 6b 20 6e 65 77 4e 6f 74 52 65 61  itmask newNotRea
1d8a0 64 79 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  dy;      /* Retu
1d8b0 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 70  rn value */..  p
1d8c0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
1d8d0 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50  pParse;.  v = pP
1d8e0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70  arse->pVdbe;.  p
1d8f0 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
1d900 43 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  C;.  db = pParse
1d910 2d 3e 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d  ->db;.  pLevel =
1d920 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76   &pWInfo->a[iLev
1d930 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  el];.  pLoop = p
1d940 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
1d950 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49   pTabItem = &pWI
1d960 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
1d970 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
1d980 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  .  iCur = pTabIt
1d990 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62  em->iCursor;.  b
1d9a0 52 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72  Rev = (pWInfo->r
1d9b0 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26  evMask>>iLevel)&
1d9c0 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d  1;.  omitTable =
1d9d0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1d9e0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
1d9f0 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  Y)!=0 .         
1da00 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
1da10 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1da20 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30  _FORCE_TABLE)==0
1da30 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
1da40 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 4a  ent((v, "Begin J
1da50 6f 69 6e 20 4c 6f 6f 70 20 25 64 22 2c 20 69 4c  oin Loop %d", iL
1da60 65 76 65 6c 29 29 3b 0a 0a 20 20 2f 2a 20 43 72  evel));..  /* Cr
1da70 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20  eate labels for 
1da80 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20  the "break" and 
1da90 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72  "continue" instr
1daa0 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72  uctions.  ** for
1dab0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
1dac0 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72  p.  Jump to addr
1dad0 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  Brk to break out
1dae0 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a   of a loop..  **
1daf0 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f   Jump to cont to
1db00 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   go immediately 
1db10 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
1db20 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  ation of the.  *
1db30 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a  * loop..  **.  *
1db40 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69 73 20  * When there is 
1db50 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  an IN operator, 
1db60 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22  we also have a "
1db70 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74  addrNxt" label t
1db80 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74  hat.  ** means t
1db90 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
1dba0 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75  the next IN valu
1dbb0 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20  e combination.  
1dbc0 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20  When.  ** there 
1dbd0 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74  are no IN operat
1dbe0 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  ors in the const
1dbf0 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64  raints, the "add
1dc00 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a  rNxt" label.  **
1dc10 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
1dc20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a  "addrBrk"..  */.
1dc30 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76    addrBrk = pLev
1dc40 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c  el->addrBrk = pL
1dc50 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
1dc60 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1dc70 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43  abel(v);.  addrC
1dc80 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  ont = pLevel->ad
1dc90 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
1dca0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1dcb0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1dcc0 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
1dcd0 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  le of a LEFT OUT
1dce0 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74  ER JOIN, allocat
1dcf0 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69  e and.  ** initi
1dd00 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63  alize a memory c
1dd10 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73  ell that records
1dd20 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d   if this table m
1dd30 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20  atches any.  ** 
1dd40 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20  row of the left 
1dd50 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
1dd60 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  n..  */.  if( pL
1dd70 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26  evel->iFrom>0 &&
1dd80 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f   (pTabItem[0].jo
1dd90 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
1dda0 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76  )!=0 ){.    pLev
1ddb0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20  el->iLeftJoin = 
1ddc0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1ddd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1dde0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1ddf0 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  ger, 0, pLevel->
1de00 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
1de10 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1de20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20  "init LEFT JOIN 
1de30 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29  no-match flag"))
1de40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  ;.  }..  /* Spec
1de50 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 46 52  ial case of a FR
1de60 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM clause subque
1de70 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  ry implemented a
1de80 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a  s a co-routine *
1de90 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d  /.  if( pTabItem
1dea0 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  ->viaCoroutine )
1deb0 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69 65  {.    int regYie
1dec0 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72  ld = pTabItem->r
1ded0 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  egReturn;.    sq
1dee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1def0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
1df00 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  TabItem->addrFil
1df10 6c 53 75 62 2d 31 2c 20 72 65 67 59 69 65 6c 64  lSub-1, regYield
1df20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  );.    pLevel->p
1df30 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65  2 =  sqlite3Vdbe
1df40 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
1df50 6c 64 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  ld, regYield);. 
1df60 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1df70 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20  v, "next row of 
1df80 63 6f 2d 72 6f 75 74 69 6e 65 20 25 73 22 2c 20  co-routine %s", 
1df90 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
1dfa0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c  zName));.    sql
1dfb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1dfc0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 59 69 65 6c  , OP_If, regYiel
1dfd0 64 2b 31 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20  d+1, addrBrk);. 
1dfe0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1dff0 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65  OP_Goto;.  }else
1e000 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e010 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1e020 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f 70  LE.  if(  (pLoop
1e030 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1e040 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
1e050 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  =0 ){.    /* Cas
1e060 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c 65 20  e 1:  The table 
1e070 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62  is a virtual-tab
1e080 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69  le.  Use the VFi
1e090 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20  lter and VNext. 
1e0a0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74     **          t
1e0b0 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
1e0c0 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  a..    */.    in
1e0d0 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20  t iReg;   /* P3 
1e0e0 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69  Value for OP_VFi
1e0f0 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lter */.    int 
1e100 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20  addrNotFound;.  
1e110 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
1e120 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72  t = pLoop->nLTer
1e130 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45  m;..    sqlite3E
1e140 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1e150 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d  rse);.    iReg =
1e160 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1e170 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
1e180 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
1e190 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20   addrNotFound = 
1e1a0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b  pLevel->addrBrk;
1e1b0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1e1c0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b  nConstraint; j++
1e1d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61  ){.      int iTa
1e1e0 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b  rget = iReg+j+2;
1e1f0 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70  .      pTerm = p
1e200 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b  Loop->aLTerm[j];
1e210 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
1e220 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1e230 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
1e240 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1e250 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  IN ){.        co
1e260 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
1e270 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
1e280 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69  evel, j, bRev, i
1e290 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  Target);.       
1e2a0 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20   addrNotFound = 
1e2b0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
1e2c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e2d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e2e0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54  rCode(pParse, pT
1e2f0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
1e300 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  ht, iTarget);.  
1e310 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1e320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e330 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1e340 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
1e350 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20  dxNum, iReg);.  
1e360 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e370 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1e380 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20  r, nConstraint, 
1e390 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c  iReg+1);.    sql
1e3a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1e3b0 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43  , OP_VFilter, iC
1e3c0 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64  ur, addrNotFound
1e3d0 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20 20 20  , iReg,.        
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
1e3f0 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  oop->u.vtab.idxS
1e400 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tr,.            
1e410 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
1e420 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1e430 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20   ? P4_MPRINTF : 
1e440 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
1e450 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65  pLoop->u.vtab.ne
1e460 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  edFree = 0;.    
1e470 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73  for(j=0; j<nCons
1e480 74 72 61 69 6e 74 20 26 26 20 6a 3c 31 36 3b 20  traint && j<16; 
1e490 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
1e4a0 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f  (pLoop->u.vtab.o
1e4b0 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29 7b  mitMask>>j)&1 ){
1e4c0 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
1e4d0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4c 6f  Term(pLevel, pLo
1e4e0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b 0a  op->aLTerm[j]);.
1e4f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e500 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
1e510 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  P_VNext;.    pLe
1e520 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
1e530 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
1e540 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1e550 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1e560 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1e570 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1e580 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  iReg, nConstrain
1e590 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t+2);.    sqlite
1e5a0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
1e5b0 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  arse, 1);.  }els
1e5c0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
1e5d0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1e5e0 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28  ABLE */..  if( (
1e5f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1e600 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20   WHERE_IPK)!=0. 
1e610 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
1e620 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
1e630 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f  LUMN_IN|WHERE_CO
1e640 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29  LUMN_EQ))!=0.  )
1e650 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a  {.    /* Case 2:
1e660 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c    We can directl
1e670 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69  y reference a si
1e680 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61  ngle row using a
1e690 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
1e6a0 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61    equality compa
1e6b0 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
1e6c0 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20  e ROWID field.  
1e6d0 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  Or.    **       
1e6e0 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20     we reference 
1e6f0 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73  multiple rows us
1e700 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20  ing a "rowid IN 
1e710 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20  (...)".    **   
1e720 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74         construct
1e730 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1e740 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ert( pLoop->u.bt
1e750 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20  ree.nEq==1 );.  
1e760 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20    iReleaseReg = 
1e770 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1e780 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  g(pParse);.    p
1e790 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
1e7a0 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73  Term[0];.    ass
1e7b0 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
1e7c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
1e7d0 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a  rm->pExpr!=0 );.
1e7e0 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
1e7f0 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
1e800 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1e810 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1e820 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 69  VIRTUAL );.    i
1e830 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45  RowidReg = codeE
1e840 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
1e850 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
1e860 6c 2c 20 30 2c 20 62 52 65 76 2c 20 69 52 65 6c  l, 0, bRev, iRel
1e870 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64  easeReg);.    ad
1e880 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  drNxt = pLevel->
1e890 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c  addrNxt;.    sql
1e8a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e8b0 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
1e8c0 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e  iRowidReg, addrN
1e8d0 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  xt);.    sqlite3
1e8e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1e8f0 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72  _NotExists, iCur
1e900 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69  , addrNxt, iRowi
1e910 64 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  dReg);.    sqlit
1e920 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1e930 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
1e940 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 31 29 3b  , iRowidReg, 1);
1e950 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1e960 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
1e970 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
1e980 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62  widReg);.    Vdb
1e990 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
1e9a0 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  "));.    pLevel-
1e9b0 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  >op = OP_Noop;. 
1e9c0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f   }else if( (pLoo
1e9d0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1e9e0 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20 20  RE_IPK)!=0.     
1e9f0 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77      && (pLoop->w
1ea00 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
1ea10 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a  OLUMN_RANGE)!=0.
1ea20 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65    ){.    /* Case
1ea30 20 33 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20   3:  We have an 
1ea40 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61  inequality compa
1ea50 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
1ea60 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20  e ROWID field.. 
1ea70 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65     */.    int te
1ea80 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  stOp = OP_Noop;.
1ea90 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20      int start;. 
1eaa0 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c     int memEndVal
1eab0 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72  ue = 0;.    Wher
1eac0 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a  eTerm *pStart, *
1ead0 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72  pEnd;..    asser
1eae0 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
1eaf0 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  );.    j = 0;.  
1eb00 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 20    pStart = pEnd 
1eb10 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  = 0;.    if( pLo
1eb20 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1eb30 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20  ERE_BTM_LIMIT ) 
1eb40 70 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e  pStart = pLoop->
1eb50 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20  aLTerm[j++];.   
1eb60 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1eb70 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
1eb80 4c 49 4d 49 54 20 29 20 70 45 6e 64 20 3d 20 70  LIMIT ) pEnd = p
1eb90 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b  Loop->aLTerm[j++
1eba0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1ebb0 53 74 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64  Start!=0 || pEnd
1ebc0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62  !=0 );.    if( b
1ebd0 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65  Rev ){.      pTe
1ebe0 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20  rm = pStart;.   
1ebf0 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64     pStart = pEnd
1ec00 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70  ;.      pEnd = p
1ec10 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Term;.    }.    
1ec20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
1ec30 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
1ec40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ec50 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
1ec60 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74 61   defines the sta
1ec70 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  rt bound */.    
1ec80 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b    int r1, rTemp;
1ec90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1eca0 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67  ters for holding
1ecb0 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
1ecc0 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ary */..      /*
1ecd0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
1ece0 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f  onstant maps TK_
1ecf0 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f  xx codes into co
1ed00 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20  rresponding .   
1ed10 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64     ** seek opcod
1ed20 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20  es.  It depends 
1ed30 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
1ed40 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78  ordering of TK_x
1ed50 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  x.      */.     
1ed60 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f   const u8 aMoveO
1ed70 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  p[] = {.        
1ed80 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20     /* TK_GT */  
1ed90 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20 20  OP_SeekGt,.     
1eda0 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a        /* TK_LE *
1edb0 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20  /  OP_SeekLe,.  
1edc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
1edd0 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c  T */  OP_SeekLt,
1ede0 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
1edf0 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_GE */  OP_Seek
1ee00 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  Ge.      };.    
1ee10 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
1ee20 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20  =TK_GT+1 );     
1ee30 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
1ee40 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a  e ordering.. */.
1ee50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1ee60 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20  _LT==TK_GT+2 ); 
1ee70 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20       /*  ... of 
1ee80 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73  the TK_xx values
1ee90 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ... */.      ass
1eea0 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47  ert( TK_GE==TK_G
1eeb0 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20  T+3 );      /*  
1eec0 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e  ... is correcct.
1eed0 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
1eee0 74 28 20 28 70 53 74 61 72 74 2d 3e 77 74 46 6c  t( (pStart->wtFl
1eef0 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
1ef00 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  )==0 );.      te
1ef10 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e  stcase( pStart->
1ef20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1ef30 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
1ef40 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78  pX = pStart->pEx
1ef50 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
1ef60 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
1ef70 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72   testcase( pStar
1ef80 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  t->leftCursor!=i
1ef90 43 75 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69  Cur ); /* transi
1efa0 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  tive constraints
1efb0 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73   */.      r1 = s
1efc0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1efd0 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  mp(pParse, pX->p
1efe0 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a  Right, &rTemp);.
1eff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f000 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65  eAddOp3(v, aMove
1f010 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d  Op[pX->op-TK_GT]
1f020 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c  , iCur, addrBrk,
1f030 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65   r1);.      Vdbe
1f040 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
1f050 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
1f060 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1f070 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1f080 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73   r1, 1);.      s
1f090 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1f0a0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54 65  pReg(pParse, rTe
1f0b0 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62  mp);.      disab
1f0c0 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1f0d0 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73  Start);.    }els
1f0e0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1f0f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
1f100 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
1f110 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20  P_Rewind, iCur, 
1f120 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a  addrBrk);.    }.
1f130 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a      if( pEnd ){.
1f140 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
1f150 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d        pX = pEnd-
1f160 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
1f170 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
1f180 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
1f190 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1f1a0 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
1f1b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f1c0 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pEnd->leftCursor
1f1d0 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61  !=iCur ); /* Tra
1f1e0 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
1f1f0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  nts */.      tes
1f200 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46  tcase( pEnd->wtF
1f210 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1f220 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  UAL );.      mem
1f230 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61  EndValue = ++pPa
1f240 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1f250 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f260 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
1f270 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65  ght, memEndValue
1f280 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  );.      if( pX-
1f290 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58  >op==TK_LT || pX
1f2a0 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op==TK_GT ){. 
1f2b0 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
1f2c0 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f  bRev ? OP_Le : O
1f2d0 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  P_Ge;.      }els
1f2e0 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  e{.        testO
1f2f0 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74  p = bRev ? OP_Lt
1f300 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20   : OP_Gt;.      
1f310 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54  }.      disableT
1f320 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64  erm(pLevel, pEnd
1f330 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  );.    }.    sta
1f340 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
1f350 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1f360 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1f370 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
1f380 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70  : OP_Next;.    p
1f390 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
1f3a0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
1f3b0 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73   = start;.    as
1f3c0 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
1f3d0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74  ==0 );.    if( t
1f3e0 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
1f3f0 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
1f400 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20  g = iReleaseReg 
1f410 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1f420 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1f430 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f440 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
1f450 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65  , iCur, iRowidRe
1f460 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1f470 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
1f480 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
1f490 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1f4a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f4b0 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c  ddOp3(v, testOp,
1f4c0 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64   memEndValue, ad
1f4d0 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67  drBrk, iRowidReg
1f4e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f4f0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1f500 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
1f510 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  IC | SQLITE_JUMP
1f520 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20  IFNULL);.    }. 
1f530 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70   }else if( pLoop
1f540 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1f550 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
1f560 20 2f 2a 20 43 61 73 65 20 34 3a 20 41 20 73 63   /* Case 4: A sc
1f570 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  an using an inde
1f580 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
1f590 20 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45           The WHE
1f5a0 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f  RE clause may co
1f5b0 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f  ntain zero or mo
1f5c0 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20  re equality .   
1f5d0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d   **         term
1f5e0 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20  s ("==" or "IN" 
1f5f0 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20  operators) that 
1f600 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20  refer to the N. 
1f610 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65     **         le
1f620 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20  ft-most columns 
1f630 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74  of the index. It
1f640 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
1f650 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
1f660 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1f670 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e  traints (>, <, >
1f680 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20  = or <=) on the 
1f690 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20  indexed.    **  
1f6a0 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68         column th
1f6b0 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  at immediately f
1f6c0 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75  ollows the N equ
1f6d0 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20  alities. Only . 
1f6e0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68     **         th
1f6f0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c  e right-most col
1f700 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e  umn can be an in
1f710 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72  equality - the r
1f720 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  est must.    ** 
1f730 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20          use the 
1f740 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70  "==" and "IN" op
1f750 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61  erators. For exa
1f760 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20  mple, if the .  
1f770 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64    **         ind
1f780 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29  ex is on (x,y,z)
1f790 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f  , then the follo
1f7a0 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65  wing clauses are
1f7b0 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20   all .    **    
1f7c0 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a       optimized:.
1f7d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1f7e0 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20           x=5.   
1f7f0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1f800 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20  =5 AND y=10.    
1f810 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1f820 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a  5 AND y<10.    *
1f830 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1f840 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31   AND y>5 AND y<1
1f850 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1f860 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20      x=5 AND y=5 
1f870 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a  AND z<=10.    **
1f880 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f890 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66  The z<10 term of
1f8a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
1f8b0 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f  annot be used, o
1f8c0 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  nly.    **      
1f8d0 20 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a     the x=5 term:
1f8e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1f8f0 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1f900 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20  D z<10.    **.  
1f910 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d    **         N m
1f920 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68  ay be zero if th
1f930 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69  ere are inequali
1f940 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ty constraints..
1f950 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49      **         I
1f960 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69  f there are no i
1f970 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1f980 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73  aints, then N is
1f990 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   at.    **      
1f9a0 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20     least one..  
1f9b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1f9c0 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73      This case is
1f9d0 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20   also used when 
1f9e0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45  there are no WHE
1f9f0 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a  RE clause.    **
1fa00 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61           constra
1fa10 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65  ints but an inde
1fa20 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e  x is selected an
1fa30 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20  yway, in order. 
1fa40 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f     **         to
1fa50 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75   force the outpu
1fa60 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f  t order to confo
1fa70 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42  rm to an ORDER B
1fa80 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20  Y..    */  .    
1fa90 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
1faa0 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20  aStartOp[] = {. 
1fab0 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c       0,.      0,
1fac0 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64  .      OP_Rewind
1fad0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32  ,           /* 2
1fae0 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72  : (!start_constr
1faf0 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71  aints && startEq
1fb00 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20   &&  !bRev) */. 
1fb10 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20       OP_Last,   
1fb20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20            /* 3: 
1fb30 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  (!start_constrai
1fb40 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26  nts && startEq &
1fb50 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &   bRev) */.   
1fb60 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20     OP_SeekGt,   
1fb70 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73          /* 4: (s
1fb80 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1fb90 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26    && !startEq &&
1fba0 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1fbb0 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20   OP_SeekLt,     
1fbc0 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61        /* 5: (sta
1fbd0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1fbe0 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20  && !startEq &&  
1fbf0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1fc00 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20  P_SeekGe,       
1fc10 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74      /* 6: (start
1fc20 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1fc30 20 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52    startEq && !bR
1fc40 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1fc50 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20  SeekLe          
1fc60 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63    /* 7: (start_c
1fc70 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20  onstraints  &&  
1fc80 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76  startEq &&  bRev
1fc90 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ) */.    };.    
1fca0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
1fcb0 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  aEndOp[] = {.   
1fcc0 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20     OP_Noop,     
1fcd0 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21          /* 0: (!
1fce0 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29  end_constraints)
1fcf0 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78   */.      OP_Idx
1fd00 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  GE,            /
1fd10 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 1: (end_constr
1fd20 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 29 20  aints && !bRev) 
1fd30 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c  */.      OP_IdxL
1fd40 54 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  T             /*
1fd50 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   2: (end_constra
1fd60 69 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f  ints && bRev) */
1fd70 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
1fd80 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
1fd90 74 72 65 65 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75  tree.nEq;  /* Nu
1fda0 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
1fdb0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e   terms */.    in
1fdc0 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30  t isMinQuery = 0
1fdd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1fde0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70  If this is an op
1fdf0 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d  timized SELECT m
1fe00 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69  in(x).. */.    i
1fe10 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1fe30 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  ase register hol
1fe40 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20  ding constraint 
1fe50 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e  values */.    in
1fe60 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  t r1;           
1fe70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1fe80 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  mp register */. 
1fe90 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
1fea0 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20  angeStart = 0;  
1feb0 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
1fec0 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
1fed0 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57  e start */.    W
1fee0 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
1fef0 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  End = 0;    /* I
1ff00 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1ff10 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e  aint at range en
1ff20 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61  d */.    int sta
1ff30 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rtEq;           
1ff40 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1ff50 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65   range start use
1ff60 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
1ff70 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b  /.    int endEq;
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff90 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61     /* True if ra
1ffa0 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c  nge end uses ==,
1ffb0 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
1ffc0 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74   int start_const
1ffd0 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a  raints;       /*
1ffe0 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   Start of range 
1fff0 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a  is constrained *
20000 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  /.    int nConst
20010 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  raint;          
20020 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20030 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
20040 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
20050 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
20060 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
20070 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  x we will be usi
20080 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  ng */.    int iI
20090 64 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20  dxCur;          
200a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
200b0 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
200c0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  e index */.    i
200d0 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30  nt nExtraReg = 0
200e0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
200f0 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
20100 65 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20  egisters needed 
20110 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20  */.    int op;  
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20130 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69      /* Instructi
20140 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  on opcode */.   
20150 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66   char *zStartAff
20160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
20170 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74   Affinity for st
20180 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  art of range con
20190 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63  straint */.    c
201a0 68 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20  har *zEndAff;   
201b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
201c0 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20  ffinity for end 
201d0 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  of range constra
201e0 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78  int */..    pIdx
201f0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
20200 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 49  e.pIndex;.    iI
20210 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  dxCur = pLevel->
20220 69 49 64 78 43 75 72 3b 0a 0a 20 20 20 20 2f 2a  iIdxCur;..    /*
20230 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61   If this loop sa
20240 74 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f  tisfies a sort o
20250 72 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20  rder (pOrderBy) 
20260 72 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20  request that .  
20270 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20    ** was passed 
20280 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
20290 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
202a0 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e  "SELECT min(x) .
202b0 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72  .." .    ** quer
202c0 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  y, then the call
202d0 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c  er will only all
202e0 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72  ow the loop to r
202f0 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20  un for.    ** a 
20300 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e  single iteration
20310 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
20320 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  t the first row 
20330 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20  returned.    ** 
20340 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20  should not have 
20350 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f  a NULL value sto
20360 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63  red in 'x'. If c
20370 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20  olumn 'x' is.   
20380 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e   ** the first on
20390 65 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20  e after the nEq 
203a0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
203b0 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ints in the inde
203c0 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72  x,.    ** this r
203d0 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65  equires some spe
203e0 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20  cial handling.. 
203f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
20400 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
20410 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  s&WHERE_ORDERBY_
20420 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20  MIN)!=0.     && 
20430 28 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 21  (pWInfo->bOBSat!
20440 3d 30 29 0a 20 20 20 20 20 26 26 20 28 70 49 64  =0).     && (pId
20450 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a  x->nColumn>nEq).
20460 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
20470 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
20480 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a 2f  ->nExpr==1 ); */
20490 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74  .      /* assert
204a0 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d  ( pOrderBy->a[0]
204b0 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  .pExpr->iColumn=
204c0 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
204d0 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20 20  nEq] ); */.     
204e0 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b   isMinQuery = 1;
204f0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
20500 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
20510 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65   /* Find any ine
20520 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
20530 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65  nt terms for the
20540 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a   start and end .
20550 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61      ** of the ra
20560 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nge. .    */.   
20570 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66   j = nEq;.    if
20580 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
20590 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
205a0 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
205b0 67 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d  geStart = pLoop-
205c0 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
205d0 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
205e0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
205f0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
20600 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
20610 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67  T ){.      pRang
20620 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  eEnd = pLoop->aL
20630 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20  Term[j++];.     
20640 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a   nExtraReg = 1;.
20650 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
20660 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
20670 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
20680 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
20690 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
206a0 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
206b0 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65   values of those
206c0 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72   terms in an arr
206d0 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ay of registers.
206e0 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
206f0 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20  at regBase..    
20700 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  */.    regBase =
20710 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
20720 54 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65  Terms(pParse,pLe
20730 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52  vel,bRev,nExtraR
20740 65 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a  eg,&zStartAff);.
20750 20 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71      zEndAff = sq
20760 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
20770 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
20780 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76    addrNxt = pLev
20790 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20  el->addrNxt;..  
207a0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
207b0 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f  oing a reverse o
207c0 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20  rder scan on an 
207d0 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c  ascending index,
207e0 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72   or.    ** a for
207f0 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20  ward order scan 
20800 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20  on a descending 
20810 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e  index, interchan
20820 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  ge the .    ** s
20830 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72  tart and end ter
20840 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20  ms (pRangeStart 
20850 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a  and pRangeEnd)..
20860 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
20870 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  nEq<pIdx->nColum
20880 6e 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78  n && bRev==(pIdx
20890 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
208a0 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  ]==SQLITE_SO_ASC
208b0 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76  )).     || (bRev
208c0 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   && pIdx->nColum
208d0 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  n==nEq).    ){. 
208e0 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54       SWAP(WhereT
208f0 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64  erm *, pRangeEnd
20900 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
20910 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63      }..    testc
20920 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
20930 20 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74   && (pRangeStart
20940 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
20950 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  _LE)!=0 );.    t
20960 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
20970 74 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53  tart && (pRangeS
20980 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
20990 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20  & WO_GE)!=0 );. 
209a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
209b0 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67  ngeEnd && (pRang
209c0 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
209d0 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20  & WO_LE)!=0 );. 
209e0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
209f0 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67  ngeEnd && (pRang
20a00 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
20a10 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20  & WO_GE)!=0 );. 
20a20 20 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52     startEq = !pR
20a30 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61  angeStart || pRa
20a40 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
20a50 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
20a60 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d  GE);.    endEq =
20a70 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c     !pRangeEnd ||
20a80 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65   pRangeEnd->eOpe
20a90 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
20aa0 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74  O_GE);.    start
20ab0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70  _constraints = p
20ac0 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45  RangeStart || nE
20ad0 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65  q>0;..    /* See
20ae0 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73  k the index curs
20af0 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
20b00 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  of the range. */
20b10 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
20b20 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
20b30 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20  pRangeStart ){. 
20b40 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
20b50 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d  t = pRangeStart-
20b60 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
20b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20b80 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
20b90 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
20ba0 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  q);.      if( (p
20bb0 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c  RangeStart->wtFl
20bc0 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
20bd0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
20be0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
20bf0 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69  sNullJump(v, pRi
20c00 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
20c10 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
20c20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53    }.      if( zS
20c30 74 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20  tartAff ){.     
20c40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
20c50 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
20c60 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b  ight, zStartAff[
20c70 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  nEq])==SQLITE_AF
20c80 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20  F_NONE){.       
20c90 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20     /* Since the 
20ca0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f  comparison is to
20cb0 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69   be performed wi
20cc0 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  th no conversion
20cd0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
20ce0 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70  pplied to the op
20cf0 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20  erands, set the 
20d00 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c  affinity to appl
20d10 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a  y to pRight to .
20d20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
20d30 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a  ITE_AFF_NONE.  *
20d40 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61  /.          zSta
20d50 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c  rtAff[nEq] = SQL
20d60 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
20d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20d80 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e  if( sqlite3ExprN
20d90 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
20da0 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74  ange(pRight, zSt
20db0 61 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a  artAff[nEq]) ){.
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 7d 20 20 0a      }.      }  .
20e00 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
20e10 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t++;.      testc
20e20 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
20e30 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
20e40 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
20e50 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e 51  }else if( isMinQ
20e60 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71  uery ){.      sq
20e70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20e80 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
20e90 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
20ea0 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
20eb0 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20  ;.      startEq 
20ec0 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74  = 0;.      start
20ed0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31  _constraints = 1
20ee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65  ;.    }.    code
20ef0 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
20f00 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
20f10 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53 74 61  Constraint, zSta
20f20 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d  rtAff);.    op =
20f30 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74   aStartOp[(start
20f40 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29  _constraints<<2)
20f50 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20   + (startEq<<1) 
20f60 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73  + bRev];.    ass
20f70 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20  ert( op!=0 );.  
20f80 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
20f90 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20  OP_Rewind );.   
20fa0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
20fb0 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 74 65  P_Last );.    te
20fc0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
20fd0 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74 65 73  eekGt );.    tes
20fe0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
20ff0 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65 73 74  ekGe );.    test
21000 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
21010 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63  kLe );.    testc
21020 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
21030 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Lt );.    sqlite
21040 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
21050 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
21060 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
21070 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a   nConstraint);..
21080 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20      /* Load the 
21090 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e  value for the in
210a0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
210b0 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  int at the end o
210c0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e  f the.    ** ran
210d0 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  ge (if any)..   
210e0 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
210f0 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
21100 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a  f( pRangeEnd ){.
21110 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
21120 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e  ht = pRangeEnd->
21130 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
21140 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21150 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
21160 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  se, regBase+nEq,
21170 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
21180 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
21190 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  e, pRight, regBa
211a0 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69  se+nEq);.      i
211b0 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77  f( (pRangeEnd->w
211c0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
211d0 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
211e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
211f0 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20  deIsNullJump(v, 
21200 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
21210 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
21220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
21230 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20 20 20   zEndAff ){.    
21240 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
21250 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
21260 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e  Right, zEndAff[n
21270 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  Eq])==SQLITE_AFF
21280 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20  _NONE){.        
21290 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63    /* Since the c
212a0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20  omparison is to 
212b0 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
212c0 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73  h no conversions
212d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70  .          ** ap
212e0 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65  plied to the ope
212f0 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61  rands, set the a
21300 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79  ffinity to apply
21310 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20   to pRight to . 
21320 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
21330 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f  TE_AFF_NONE.  */
21340 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41  .          zEndA
21350 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
21360 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
21370 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
21380 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
21390 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
213a0 65 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66  e(pRight, zEndAf
213b0 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20  f[nEq]) ){.     
213c0 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71       zEndAff[nEq
213d0 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
213e0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
213f0 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 63       }  .      c
21400 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
21410 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
21420 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41 66 66  , nEq+1, zEndAff
21430 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
21440 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65  aint++;.      te
21450 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
21460 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
21470 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
21480 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
21490 46 72 65 65 28 64 62 2c 20 7a 53 74 61 72 74 41  Free(db, zStartA
214a0 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ff);.    sqlite3
214b0 44 62 46 72 65 65 28 64 62 2c 20 7a 45 6e 64 41  DbFree(db, zEndA
214c0 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70  ff);..    /* Top
214d0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64   of the loop bod
214e0 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d  y */.    pLevel-
214f0 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  >p2 = sqlite3Vdb
21500 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
21510 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
21520 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73  f the index curs
21530 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20 65  or is past the e
21540 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  nd of the range.
21550 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e   */.    op = aEn
21560 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c  dOp[(pRangeEnd |
21570 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52  | nEq) * (1 + bR
21580 65 76 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61  ev)];.    testca
21590 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20  se( op==OP_Noop 
215a0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
215b0 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b   op==OP_IdxGE );
215c0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
215d0 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20  p==OP_IdxLT );. 
215e0 20 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f     if( op!=OP_No
215f0 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  op ){.      sqli
21600 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
21610 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
21620 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73   addrNxt, regBas
21630 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  e, nConstraint);
21640 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21650 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e  beChangeP5(v, en
21660 64 45 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b  dEq!=bRev ?1:0);
21670 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
21680 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71  f there are ineq
21690 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
216a0 74 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  ts, check that t
216b0 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  he value.    ** 
216c0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
216d0 75 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65  umn that the ine
216e0 71 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e  quality contrain
216f0 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20  s is not NULL.. 
21700 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20     ** If it is, 
21710 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74  jump to the next
21720 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
21730 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  e loop..    */. 
21740 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
21750 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
21760 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
21770 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
21780 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
21790 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  T );.    testcas
217a0 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  e( pLoop->wsFlag
217b0 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
217c0 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20 28  MIT );.    if( (
217d0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
217e0 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49   (WHERE_BTM_LIMI
217f0 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
21800 54 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  T))!=0 ){.      
21810 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21820 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
21830 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31  iIdxCur, nEq, r1
21840 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21850 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21860 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64  _IsNull, r1, add
21870 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  rCont);.    }.  
21880 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
21890 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
218a0 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65  r1);..    /* See
218b0 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  k the table curs
218c0 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20  or, if required 
218d0 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  */.    disableTe
218e0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
218f0 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73  eStart);.    dis
21900 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
21910 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20   pRangeEnd);.   
21920 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20   if( !omitTable 
21930 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
21940 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67  eg = iReleaseReg
21950 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
21960 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
21970 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21980 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
21990 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69  owid, iIdxCur, i
219a0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
219b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
219c0 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
219d0 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
219e0 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
219f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21a00 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69  OP_Seek, iCur, i
21a10 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44  RowidReg);  /* D
21a20 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a  eferred seek */.
21a30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
21a40 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63  cord the instruc
21a50 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72  tion used to ter
21a60 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
21a70 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a   Disable .    **
21a80 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
21a90 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61  rms made redunda
21aa0 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20  nt by the index 
21ab0 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20  range scan..    
21ac0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  */.    if( pLoop
21ad0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
21ae0 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20  E_ONEROW ){.    
21af0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
21b00 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73  P_Noop;.    }els
21b10 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20  e if( bRev ){.  
21b20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
21b30 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65   OP_Prev;.    }e
21b40 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
21b50 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b  l->op = OP_Next;
21b60 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
21b70 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b  l->p1 = iIdxCur;
21b80 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
21b90 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
21ba0 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d 30 20  _CONSTRAINT)==0 
21bb0 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
21bc0 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d  >p5 = SQLITE_STM
21bd0 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
21be0 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65  _STEP;.    }else
21bf0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21c00 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b  pLevel->p5==0 );
21c10 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
21c20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21c30 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
21c40 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ION.  if( pLoop-
21c50 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
21c60 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20  _MULTI_OR ){.   
21c70 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 77 6f   /* Case 5:  Two
21c80 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
21c90 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ely indexed term
21ca0 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f  s connected by O
21cb0 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  R.    **.    ** 
21cc0 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
21cd0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
21ce0 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64  TABLE t1(a,b,c,d
21cf0 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
21d00 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
21d10 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(a);.    **   C
21d20 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f  REATE INDEX i2 O
21d30 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20  N t1(b);.    ** 
21d40 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
21d50 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20  3 ON t1(c);.    
21d60 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  **.    **   SELE
21d70 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
21d80 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52  RE a=5 OR b=7 OR
21d90 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29   (c=11 AND d=13)
21da0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
21db0 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74  n the example, t
21dc0 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 69  here are three i
21dd0 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e  ndexed terms con
21de0 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20  nected by OR..  
21df0 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20    ** The top of 
21e00 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c  the loop looks l
21e10 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a  ike this:.    **
21e20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
21e30 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20   Null       1   
21e40 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a               # Z
21e50 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69  ero the rowset i
21e60 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20  n reg 1.    **. 
21e70 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20     ** Then, for 
21e80 65 61 63 68 20 69 6e 64 65 78 65 64 20 74 65 72  each indexed ter
21e90 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  m, the following
21ea0 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20  . The arguments 
21eb0 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74  to.    ** RowSet
21ec0 54 65 73 74 20 61 72 65 20 73 75 63 68 20 74 68  Test are such th
21ed0 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  at the rowid of 
21ee0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
21ef0 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20  is inserted.    
21f00 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53  ** into the RowS
21f10 65 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72  et. If it is alr
21f20 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f  eady present, co
21f30 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a  ntrol skips the.
21f40 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63      ** Gosub opc
21f50 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74  ode and jumps st
21f60 72 61 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f  raight to the co
21f70 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
21f80 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20  WhereEnd()..    
21f90 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
21fa0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
21fb0 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a  in(<term>).    *
21fc0 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77 53 65  *          RowSe
21fd0 74 54 65 73 74 20 20 20 20 20 20 20 20 20 20 20  tTest           
21fe0 20 20 20 20 20 20 20 23 20 49 6e 73 65 72 74 20         # Insert 
21ff0 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65  rowid into rowse
22000 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
22010 20 20 47 6f 73 75 62 20 20 20 20 20 20 32 20 41    Gosub      2 A
22020 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73  .    **        s
22030 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
22040 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
22050 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f  ollowing the abo
22060 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d  ve, code to term
22070 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
22080 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72  Label A, the tar
22090 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  get.    ** of th
220a0 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a  e Gosub above, j
220b0 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74  umps to the inst
220c0 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66  ruction right af
220d0 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20  ter the Goto..  
220e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
220f0 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20       Null       
22100 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
22110 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73   # Zero the rows
22120 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20  et in reg 1.    
22130 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f  **          Goto
22140 20 20 20 20 20 20 20 42 20 20 20 20 20 20 20 20         B        
22150 20 20 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f          # The lo
22160 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a  op is finished..
22170 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
22180 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64      A: <loop bod
22190 79 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y>              
221a0 20 20 20 23 20 52 65 74 75 72 6e 20 64 61 74 61     # Return data
221b0 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20  , whatever..    
221c0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
221d0 20 20 20 52 65 74 75 72 6e 20 20 20 20 20 32 20     Return     2 
221e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
221f0 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68   Jump back to th
22200 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20  e Gosub.    **. 
22210 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c     **       B: <
22220 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a  after the loop>.
22230 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20      **.    */.  
22240 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
22250 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20  OrWc;    /* The 
22260 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e  OR-clause broken
22270 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72   out into subter
22280 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73  ms */.    SrcLis
22290 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20  t *pOrTab;      
222a0 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61   /* Shortened ta
222b0 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63  ble list or OR-c
222c0 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e  lause generation
222d0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
222e0 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Cov = 0;        
222f0 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61       /* Potentia
22300 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  l covering index
22310 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
22320 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20    int iCovCur = 
22330 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
22340 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20   /* Cursor used 
22350 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20  for index scans 
22360 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20  (if any) */..   
22370 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d   int regReturn =
22380 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
22390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
223a0 67 69 73 74 65 72 20 75 73 65 64 20 77 69 74 68  gister used with
223b0 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20   OP_Gosub */.   
223c0 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d   int regRowset =
223d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
223e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
223f0 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65  gister for RowSe
22400 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  t object */.    
22410 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30  int regRowid = 0
22420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
22440 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f  ister holding ro
22450 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  wid */.    int i
22460 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74  LoopBody = sqlit
22470 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
22480 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  v);  /* Start of
22490 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20   loop body */.  
224a0 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20    int iRetInit; 
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
224d0 64 64 72 65 73 73 20 6f 66 20 72 65 67 52 65 74  ddress of regRet
224e0 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20  urn init */.    
224f0 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d  int untestedTerm
22500 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
22510 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73     /* Some terms
22520 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
22530 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e  tested */.    in
22540 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22560 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22570 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41   */.    Expr *pA
22580 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20  ndExpr = 0;     
22590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
225a0 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20   ".. AND (...)" 
225b0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
225c0 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c   .    pTerm = pL
225d0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a  oop->aLTerm[0];.
225e0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
225f0 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
22600 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
22610 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a  ator & WO_OR );.
22620 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
22630 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
22640 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b  RM_ORINFO)!=0 );
22650 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54  .    pOrWc = &pT
22660 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
22670 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  wc;.    pLevel->
22680 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a  op = OP_Return;.
22690 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
226a0 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20   regReturn;..   
226b0 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77   /* Set up a new
226c0 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54   SrcList in pOrT
226d0 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ab containing th
226e0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63  e table being sc
226f0 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  anned.    ** by 
22700 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65  this loop in the
22710 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61   a[0] slot and a
22720 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  ll notReady tabl
22730 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f  es in a[1..] slo
22740 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  ts..    ** This 
22750 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c  becomes the SrcL
22760 69 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72  ist in the recur
22770 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c  sive call to sql
22780 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
22790 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
227a0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
227b0 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  1 ){.      int n
227c0 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  NotReady;       
227d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
227e0 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65   number of notRe
227f0 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ady tables */.  
22800 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
22810 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63  st_item *origSrc
22820 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
22830 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  l list of tables
22840 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65   */.      nNotRe
22850 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  ady = pWInfo->nL
22860 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20  evel - iLevel - 
22870 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20  1;.      pOrTab 
22880 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c  = sqlite3StackAl
22890 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20 20 20 20  locRaw(db,.     
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228b0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
228c0 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64  OrTab)+ nNotRead
228d0 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d  y*sizeof(pOrTab-
228e0 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69  >a[0]));.      i
228f0 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72  f( pOrTab==0 ) r
22900 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a  eturn notReady;.
22910 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41        pOrTab->nA
22920 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f 74  lloc = (u8)(nNot
22930 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20  Ready + 1);.    
22940 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d    pOrTab->nSrc =
22950 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b   pOrTab->nAlloc;
22960 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  .      memcpy(pO
22970 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65  rTab->a, pTabIte
22980 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49  m, sizeof(*pTabI
22990 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69  tem));.      ori
229a0 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  gSrc = pWInfo->p
229b0 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  TabList->a;.    
229c0 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e    for(k=1; k<=nN
229d0 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20  otReady; k++){. 
229e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
229f0 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72  OrTab->a[k], &or
22a00 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e  igSrc[pLevel[k].
22a10 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70  iFrom], sizeof(p
22a20 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20  OrTab->a[k]));. 
22a30 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
22a40 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d  {.      pOrTab =
22a50 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
22a60 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
22a70 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
22a80 72 6f 77 73 65 74 20 72 65 67 69 73 74 65 72 20  rowset register 
22a90 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e  to contain NULL.
22aa0 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20   An SQL NULL is 
22ab0 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65  .    ** equivale
22ac0 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72  nt to an empty r
22ad0 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  owset..    **.  
22ae0 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61    ** Also initia
22af0 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74  lize regReturn t
22b00 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64  o contain the ad
22b10 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73  dress of the ins
22b20 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a  truction .    **
22b30 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
22b40 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65  lowing the OP_Re
22b50 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74  turn at the bott
22b60 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  om of the loop. 
22b70 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72  This.    ** is r
22b80 65 71 75 69 72 65 64 20 69 6e 20 61 20 66 65 77  equired in a few
22b90 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f   obscure LEFT JO
22ba0 49 4e 20 63 61 73 65 73 20 77 68 65 72 65 20 63  IN cases where c
22bb0 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20  ontrol jumps.   
22bc0 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70   ** over the top
22bd0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74   of the loop int
22be0 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74  o the body of it
22bf0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
22c00 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65  he .    ** corre
22c10 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20  ct response for 
22c20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20  the end-of-loop 
22c30 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74  code (the OP_Ret
22c40 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20  urn) is to .    
22c50 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  ** fall through 
22c60 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
22c70 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73  ruction, just as
22c80 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73   an OP_Next does
22c90 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65   if.    ** calle
22ca0 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61  d on an uninitia
22cb0 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20  lized cursor..  
22cc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57    */.    if( (pW
22cd0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
22ce0 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41   & WHERE_DUPLICA
22cf0 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20  TES_OK)==0 ){.  
22d00 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20      regRowset = 
22d10 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
22d20 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d        regRowid =
22d30 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
22d40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22d50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
22d60 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65  ull, 0, regRowse
22d70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52  t);.    }.    iR
22d80 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  etInit = sqlite3
22d90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22da0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
22db0 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a  Return);..    /*
22dc0 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
22dd0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
22de0 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20   z of the form: 
22df0 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e   (x1 OR x2 OR ..
22e00 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20  .) AND y.    ** 
22e10 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74  Then for every t
22e20 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65  erm xN, evaluate
22e30 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72 65   as the subexpre
22e40 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a  ssion: xN AND z.
22e50 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c      ** That way,
22e60 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74   terms in y that
22e70 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e   are factored in
22e80 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69  to the disjuncti
22e90 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  on will.    ** b
22ea0 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20 74  e picked up by t
22eb0 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
22ec0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ls to sqlite3Whe
22ed0 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e  reBegin() below.
22ee0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
22ef0 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75  ctually, each su
22f00 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63  bexpression is c
22f10 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20  onverted to "xN 
22f20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20 69  AND w" where w i
22f30 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e  s.    ** the "in
22f40 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73  teresting" terms
22f50 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68   of z - terms th
22f60 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  at did not origi
22f70 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20  nate in the.    
22f80 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ** ON or USING c
22f90 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
22fa0 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20  JOIN, and terms 
22fb0 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65 20  that are usable 
22fc0 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  as .    ** indic
22fd0 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es..    **.    *
22fe0 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  * This optimizat
22ff0 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70  ion also only ap
23000 70 6c 69 65 73 20 69 66 20 74 68 65 20 28 78 31  plies if the (x1
23010 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74   OR x2 OR ...) t
23020 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  erm.    ** is no
23030 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
23040 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20  he ON clause of 
23050 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20  a LEFT JOIN..   
23060 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68   ** See ticket h
23070 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  ttp://www.sqlite
23080 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32  .org/src/info/f2
23090 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a  369304e4.    */.
230a0 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65      if( pWC->nTe
230b0 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  rm>1 ){.      in
230c0 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66  t iTerm;.      f
230d0 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72  or(iTerm=0; iTer
230e0 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54  m<pWC->nTerm; iT
230f0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
23100 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57  Expr *pExpr = pW
23110 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70  C->a[iTerm].pExp
23120 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 26  r;.        if( &
23130 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d  pWC->a[iTerm] ==
23140 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75   pTerm ) continu
23150 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45  e;.        if( E
23160 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
23170 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
23180 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  n) ) continue;. 
23190 20 20 20 20 20 20 20 69 66 28 20 70 57 43 2d 3e         if( pWC->
231a0 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73  a[iTerm].wtFlags
231b0 20 26 20 28 54 45 52 4d 5f 4f 52 49 4e 46 4f 29   & (TERM_ORINFO)
231c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
231d0 20 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61       if( (pWC->a
231e0 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f  [iTerm].eOperato
231f0 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29  r & WO_ALL)==0 )
23200 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
23210 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
23220 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
23230 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
23240 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69   pAndExpr = sqli
23250 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
23260 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b  AndExpr, pExpr);
23270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23280 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20  f( pAndExpr ){. 
23290 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20         pAndExpr 
232a0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
232b0 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30  Parse, TK_AND, 0
232c0 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a  , pAndExpr, 0);.
232d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
232e0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
232f0 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69  pOrWc->nTerm; ii
23300 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  ++){.      Where
23310 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20  Term *pOrTerm = 
23320 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20  &pOrWc->a[ii];. 
23330 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
23340 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
23350 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e  ur || (pOrTerm->
23360 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
23370 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ND)!=0 ){.      
23380 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75    WhereInfo *pSu
23390 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  bWInfo;         
233a0 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e   /* Info for sin
233b0 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e  gle OR-term scan
233c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
233d0 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54   *pOrExpr = pOrT
233e0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
233f0 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72      if( pAndExpr
23400 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
23410 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20 45 50  erty(pOrExpr, EP
23420 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
23430 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
23440 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70  ->pLeft = pOrExp
23450 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  r;.          pOr
23460 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b  Expr = pAndExpr;
23470 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23480 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
23490 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
234a0 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
234b0 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
234c0 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d       pSubWInfo =
234d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
234e0 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61  in(pParse, pOrTa
234f0 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30  b, pOrExpr, 0, 0
23500 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23510 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
23520 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20  OMIT_OPEN_CLOSE 
23530 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59  | WHERE_AND_ONLY
23540 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
23550 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
23560 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57  _FORCE_TABLE | W
23570 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
23580 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20  LY, iCovCur);.  
23590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
235a0 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73  ubWInfo || pPars
235b0 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
235c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
235d0 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
235e0 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
235f0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75    WhereLoop *pSu
23600 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  bLoop;.         
23610 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
23620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
23630 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26  Parse, pOrTab, &
23640 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c  pSubWInfo->a[0],
23650 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d   iLevel, pLevel-
23660 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20  >iFrom, 0.      
23670 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
23680 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
23690 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
236a0 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d  _DUPLICATES_OK)=
236b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
236c0 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69    int iSet = ((i
236d0 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  i==pOrWc->nTerm-
236e0 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20  1)?-1:ii);.     
236f0 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20         int r;.  
23700 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71            r = sq
23710 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
23720 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
23730 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d  TabItem->pTab, -
23740 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20 20  1, iCur, .      
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23770 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b     regRowid, 0);
23780 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
23790 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
237a0 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65  t(v, OP_RowSetTe
237b0 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20  st, regRowset,. 
237c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
237f0 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20  ntAddr(v)+2, r, 
23800 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  iSet);.         
23810 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
23820 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23830 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
23840 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79  eturn, iLoopBody
23850 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  );..          /*
23860 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e   The pSubWInfo->
23870 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c  untestedTerms fl
23880 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ag means that th
23890 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20  is OR term.     
238a0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65       ** containe
238b0 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e  d one or more AN
238c0 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f  D term from a no
238d0 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54  tReady table.  T
238e0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
238f0 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e  terms from the n
23900 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f  otReady table co
23910 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65  uld not be teste
23920 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20  d and will.     
23930 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20       ** need to 
23940 62 65 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e  be tested later.
23950 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
23960 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
23970 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
23980 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54  erms ) untestedT
23990 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20  erms = 1;..     
239a0 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f       /* If all o
239b0 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74  f the OR-connect
239c0 65 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74  ed terms are opt
239d0 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65  imized using the
239e0 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20   same.          
239f0 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68  ** index, and th
23a00 65 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65  e index is opene
23a10 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
23a20 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20   cursor number. 
23a30 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65           ** by e
23a40 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ach call to sqli
23a50 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
23a60 6d 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f  made by this loo
23a70 70 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20  p, it may.      
23a80 20 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62      ** be possib
23a90 6c 65 20 74 6f 20 75 73 65 20 74 68 61 74 20 69  le to use that i
23aa0 6e 64 65 78 20 61 73 20 61 20 63 6f 76 65 72 69  ndex as a coveri
23ab0 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ng index..      
23ac0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
23ad0 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20   ** If the call 
23ae0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
23af0 65 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73  egin() above res
23b00 75 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20  ulted in a scan 
23b10 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
23b20 2a 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c  * uses an index,
23b30 20 61 6e 64 20 74 68 69 73 20 69 73 20 65 69 74   and this is eit
23b40 68 65 72 20 74 68 65 20 66 69 72 73 74 20 4f 52  her the first OR
23b50 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a  -connected term.
23b60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
23b70 63 65 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e  cessed or the in
23b80 64 65 78 20 69 73 20 74 68 65 20 73 61 6d 65 20  dex is the same 
23b90 61 73 20 74 68 61 74 20 75 73 65 64 20 62 79 20  as that used by 
23ba0 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20  all previous.   
23bb0 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c         ** terms,
23bc0 20 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65   set pCov to the
23bd0 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72   candidate cover
23be0 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72  ing index. Other
23bf0 77 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20  wise, set .     
23c00 20 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20       ** pCov to 
23c10 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65  NULL to indicate
23c20 20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61   that no candida
23c30 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  te covering inde
23c40 78 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20  x will .        
23c50 20 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c    ** be availabl
23c60 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
23c70 20 20 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f            pSubLo
23c80 6f 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e  op = pSubWInfo->
23c90 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20  a[0].pWLoop;.   
23ca0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
23cb0 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  pSubLoop->wsFlag
23cc0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
23cd0 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NDEX)==0 );.    
23ce0 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62 4c        if( (pSubL
23cf0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
23d00 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
23d10 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
23d20 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f  ii==0 || pSubLoo
23d30 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
23d40 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20  x==pCov).       
23d50 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
23d60 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49    assert( pSubWI
23d70 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75  nfo->a[0].iIdxCu
23d80 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20  r==iCovCur );.  
23d90 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d            pCov =
23da0 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72   pSubLoop->u.btr
23db0 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  ee.pIndex;.     
23dc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23dd0 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30          pCov = 0
23de0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
23df0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69           /* Fini
23e00 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f  sh the loop thro
23e10 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ugh table entrie
23e20 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72  s that match ter
23e30 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20  m pOrTerm. */.  
23e40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
23e50 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66  hereEnd(pSubWInf
23e60 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  o);.        }.  
23e70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23e80 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64  pLevel->u.pCovid
23e90 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66  x = pCov;.    if
23ea0 28 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d  ( pCov ) pLevel-
23eb0 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43  >iIdxCur = iCovC
23ec0 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64  ur;.    if( pAnd
23ed0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41  Expr ){.      pA
23ee0 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ndExpr->pLeft = 
23ef0 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
23f00 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
23f10 41 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  AndExpr);.    }.
23f20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
23f30 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49  hangeP1(v, iRetI
23f40 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65  nit, sqlite3Vdbe
23f50 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b  CurrentAddr(v));
23f60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
23f70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
23f80 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  o, 0, pLevel->ad
23f90 64 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69  drBrk);.    sqli
23fa0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
23fb0 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79  bel(v, iLoopBody
23fc0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e  );..    if( pWIn
23fd0 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73  fo->nLevel>1 ) s
23fe0 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28  qlite3StackFree(
23ff0 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20  db, pOrTab);.   
24000 20 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65   if( !untestedTe
24010 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72  rms ) disableTer
24020 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
24030 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
24040 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
24050 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
24060 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43  */..  {.    /* C
24070 61 73 65 20 36 3a 20 20 54 68 65 72 65 20 69 73  ase 6:  There is
24080 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78   no usable index
24090 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20  .  We must do a 
240a0 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20  complete.    ** 
240b0 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66           scan of
240c0 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
240d0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
240e0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
240f0 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78  tep[] = { OP_Nex
24100 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20  t, OP_Prev };.  
24110 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
24120 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f  8 aStart[] = { O
24130 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73  P_Rewind, OP_Las
24140 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t };.    assert(
24150 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76   bRev==0 || bRev
24160 3d 3d 31 20 29 3b 0a 20 20 20 20 70 4c 65 76 65  ==1 );.    pLeve
24170 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52  l->op = aStep[bR
24180 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ev];.    pLevel-
24190 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
241a0 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b  pLevel->p2 = 1 +
241b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
241c0 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65  p2(v, aStart[bRe
241d0 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  v], iCur, addrBr
241e0 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  k);.    pLevel->
241f0 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
24200 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
24210 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 65 77 4e  STEP;.  }.  newN
24220 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65 61  otReady = notRea
24230 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28 26 70  dy & ~getMask(&p
24240 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
24250 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e   iCur);..  /* In
24260 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73  sert code to tes
24270 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65  t every subexpre
24280 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62  ssion that can b
24290 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a  e completely.  *
242a0 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67  * computed using
242b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
242c0 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f   of tables..  */
242d0 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
242e0 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72  ->a, j=pWC->nTer
242f0 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65  m; j>0; j--, pTe
24300 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
24310 2a 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73  *pE;.    testcas
24320 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
24330 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
24340 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
24350 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
24360 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
24370 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
24380 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
24390 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
243a0 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
243b0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
243c0 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 65 77 4e  prereqAll & newN
243d0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
243e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
243f0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
24400 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20  erms==0.        
24410 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
24420 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
24430 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
24440 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  NLY)!=0 );.     
24450 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
24460 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20  dTerms = 1;.    
24470 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
24480 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d  }.    pE = pTerm
24490 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->pExpr;.    ass
244a0 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20  ert( pE!=0 );.  
244b0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
244c0 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72  eftJoin && !Expr
244d0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
244e0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
244f0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
24500 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
24510 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
24520 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e  rse, pE, addrCon
24530 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
24540 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d  NULL);.    pTerm
24550 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
24560 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20  M_CODED;.  }..  
24570 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74  /* Insert code t
24580 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70 6c 69  o test for impli
24590 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62  ed constraints b
245a0 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69 74 69  ased on transiti
245b0 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65  vity.  ** of the
245c0 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a   "==" operator..
245d0 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c    **.  ** Exampl
245e0 65 3a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  e: If the WHERE 
245f0 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
24600 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20  "t1.a=t2.b" and 
24610 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20  "t2.b=123".  ** 
24620 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64 69 6e  and we are codin
24630 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  g the t1 loop an
24640 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 68 61  d the t2 loop ha
24650 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 2c  s not yet coded,
24660 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20 63 61  .  ** then we ca
24670 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22 74 31  nnot use the "t1
24680 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74 72 61  .a=t2.b" constra
24690 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61 6e 20  int, but we can 
246a0 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d  code.  ** the im
246b0 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32 33 22  plied "t1.a=123"
246c0 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a   constraint..  *
246d0 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  /.  for(pTerm=pW
246e0 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65  C->a, j=pWC->nTe
246f0 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54  rm; j>0; j--, pT
24700 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  erm++){.    Expr
24710 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a 20 20   *pE, *pEAlt;.  
24720 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6c    WhereTerm *pAl
24730 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  t;.    if( pTerm
24740 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
24750 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
24760 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
24770 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
24780 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f  >eOperator!=(WO_
24790 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29 20 63  EQUIV|WO_EQ) ) c
247a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
247b0 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
247c0 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  or!=iCur ) conti
247d0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  nue;.    if( pLe
247e0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
247f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
24800 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
24810 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
24820 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
24830 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
24840 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
24850 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
24860 68 74 20 26 20 6e 65 77 4e 6f 74 52 65 61 64 79  ht & newNotReady
24870 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74  )!=0 );.    pAlt
24880 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
24890 20 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e   iCur, pTerm->u.
248a0 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52  leftColumn, notR
248b0 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
248c0 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  N, 0);.    if( p
248d0 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Alt==0 ) continu
248e0 65 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d  e;.    if( pAlt-
248f0 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
24900 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
24910 75 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ue;.    testcase
24920 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
24930 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
24940 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d   testcase( pAlt-
24950 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
24960 49 4e 20 29 3b 0a 20 20 20 20 56 64 62 65 4e 6f  IN );.    VdbeNo
24970 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
24980 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76 65 20  egin transitive 
24990 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a 20  constraint"));. 
249a0 20 20 20 70 45 41 6c 74 20 3d 20 73 71 6c 69 74     pEAlt = sqlit
249b0 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28  e3StackAllocRaw(
249c0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c  db, sizeof(*pEAl
249d0 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70 45 41  t));.    if( pEA
249e0 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 41  lt ){.      *pEA
249f0 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70  lt = *pAlt->pExp
24a00 72 3b 0a 20 20 20 20 20 20 70 45 41 6c 74 2d 3e  r;.      pEAlt->
24a10 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66  pLeft = pE->pLef
24a20 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
24a30 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
24a40 73 65 2c 20 70 45 41 6c 74 2c 20 61 64 64 72 43  se, pEAlt, addrC
24a50 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
24a60 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
24a70 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28  qlite3StackFree(
24a80 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20 20  db, pEAlt);.    
24a90 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  }.  }..  /* For 
24aa0 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
24ab0 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  N, generate code
24ac0 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72   that will recor
24ad0 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a  d the fact that.
24ae0 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
24af0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67  e row of the rig
24b00 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74  ht table has mat
24b10 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61  ched the left ta
24b20 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  ble.  .  */.  if
24b30 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
24b40 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65  oin ){.    pLeve
24b50 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73  l->addrFirst = s
24b60 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
24b70 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
24b80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24b90 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
24ba0 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
24bb0 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
24bc0 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72  mment((v, "recor
24bd0 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22  d LEFT JOIN hit"
24be0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ));.    sqlite3E
24bf0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
24c00 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70  arse);.    for(p
24c10 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30  Term=pWC->a, j=0
24c20 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; j<pWC->nTerm; 
24c30 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
24c40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
24c50 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
24c60 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
24c70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24c80 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
24c90 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
24ca0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
24cb0 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
24cc0 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
24cd0 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
24ce0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
24cf0 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 65  ->prereqAll & ne
24d00 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  wNotReady)!=0 ){
24d10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
24d20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
24d30 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20  dTerms );.      
24d40 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
24d50 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
24d60 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  ( pTerm->pExpr )
24d70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
24d80 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
24d90 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  e, pTerm->pExpr,
24da0 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
24db0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
24dc0 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
24dd0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
24de0 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  D;.    }.  }.  s
24df0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
24e00 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65  pReg(pParse, iRe
24e10 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65  leaseReg);..  re
24e20 74 75 72 6e 20 6e 65 77 4e 6f 74 52 65 61 64 79  turn newNotReady
24e30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52  ;.}..#ifdef WHER
24e40 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
24e50 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65  *.** Print a Whe
24e60 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f  reLoop object fo
24e70 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70  r debugging purp
24e80 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oses.*/.static v
24e90 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69  oid whereLoopPri
24ea0 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  nt(WhereLoop *p,
24eb0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
24ec0 73 74 29 7b 0a 20 20 69 6e 74 20 6e 62 20 3d 20  st){.  int nb = 
24ed0 31 2b 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  1+(pTabList->nSr
24ee0 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74  c+7)/8;.  struct
24ef0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24f00 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d  Item = pTabList-
24f10 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20  >a + p->iTab;.  
24f20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
24f30 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c  tem->pTab;.  sql
24f40 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24f50 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30  "%c%2d.%0*llx.%0
24f60 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20  *llx", p->cId,. 
24f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f80 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c      p->iTab, nb,
24f90 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62   p->maskSelf, nb
24fa0 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20  , p->prereq);.  
24fb0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24fc0 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20  tf(" %12s",.    
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fe0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f   pItem->zAlias ?
24ff0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a   pItem->zAlias :
25000 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
25010 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
25020 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
25030 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  TABLE)==0 ){.   
25040 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e   if( p->u.btree.
25050 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
25060 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
25070 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  e = p->u.btree.p
25080 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  Index->zName;.  
25090 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
250a0 20 29 20 7a 4e 61 6d 65 20 3d 20 22 69 70 6b 22   ) zName = "ipk"
250b0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  ;.      if( strn
250c0 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  cmp(zName, "sqli
250d0 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20  te_autoindex_", 
250e0 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  17)==0 ){.      
250f0 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65    int i = sqlite
25100 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
25110 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68   - 1;.        wh
25120 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27  ile( zName[i]!='
25130 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20  _' ) i--;.      
25140 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20    zName += i;.  
25150 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
25160 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25170 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61  .%-16s %2d", zNa
25180 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  me, p->u.btree.n
25190 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Eq);.    }else{.
251a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
251b0 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c  ugPrintf("%20s",
251c0 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  "");.    }.  }el
251d0 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  se{.    char *z;
251e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74  .    if( p->u.vt
251f0 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20  ab.idxStr ){.   
25200 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
25210 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73  printf("(%d,\"%s
25220 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20  \",%x)",.       
25230 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74           p->u.vt
25240 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
25250 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e  vtab.idxStr, p->
25260 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29  u.vtab.omitMask)
25270 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25280 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
25290 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22  printf("(%d,%x)"
252a0 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  , p->u.vtab.idxN
252b0 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  um, p->u.vtab.om
252c0 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20  itMask);.    }. 
252d0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
252e0 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20  rintf(" %-19s", 
252f0 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  z);.    sqlite3_
25300 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 73  free(z);.  }.  s
25310 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25320 66 28 22 20 66 20 25 30 34 78 20 4e 20 25 64 22  f(" f %04x N %d"
25330 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
25340 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69  >nLTerm);.  sqli
25350 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25360 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e   cost %d,%d,%d\n
25370 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d  ", p->rSetup, p-
25380 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b  >rRun, p->nOut);
25390 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
253a0 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65   Convert bulk me
253b0 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69  mory into a vali
253c0 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  d WhereLoop that
253d0 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a   can be passed.*
253e0 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c  * to whereLoopCl
253f0 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a  ear harmlessly..
25400 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
25410 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65  hereLoopInit(Whe
25420 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d  reLoop *p){.  p-
25430 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54  >aLTerm = p->aLT
25440 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e  ermSpace;.  p->n
25450 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e  LTerm = 0;.  p->
25460 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69  nLSlot = ArraySi
25470 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  ze(p->aLTermSpac
25480 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73  e);.  p->wsFlags
25490 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
254a0 6c 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f  lear the WhereLo
254b0 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61  op.u union.  Lea
254c0 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54  ve WhereLoop.pLT
254d0 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73  erm intact..*/.s
254e0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
254f0 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73  LoopClearUnion(s
25500 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
25510 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
25520 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57   p->wsFlags & (W
25530 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
25540 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  E|WHERE_AUTO_IND
25550 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  EX) ){.    if( (
25560 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
25570 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
25580 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62  !=0 && p->u.vtab
25590 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
255a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
255b0 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
255c0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74  );.      p->u.vt
255d0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
255e0 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
255f0 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  .idxStr = 0;.   
25600 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77   }else if( (p->w
25610 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
25620 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26  UTO_INDEX)!=0 &&
25630 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
25640 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex!=0 ){.      s
25650 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
25660 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
25670 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  ex->zColAff);.  
25680 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
25690 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  e(db, p->u.btree
256a0 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  .pIndex);.      
256b0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
256c0 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
256d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
256e0 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65  cate internal me
256f0 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20 57  mory used by a W
25700 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a  hereLoop object.
25710 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
25720 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71  hereLoopClear(sq
25730 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
25740 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
25750 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c  p->aLTerm!=p->aL
25760 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69  TermSpace ) sqli
25770 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
25780 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72  >aLTerm);.  wher
25790 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
257a0 64 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c  db, p);.  whereL
257b0 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f  oopInit(p);.}../
257c0 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68  *.** Increase th
257d0 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
257e0 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61  ion for pLoop->a
257f0 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74  LTerm[] to be at
25800 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61   least n..*/.sta
25810 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
25820 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20  pResize(sqlite3 
25830 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
25840 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65  p, int n){.  Whe
25850 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a  reTerm **paNew;.
25860 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e    if( p->nLSlot>
25870 3d 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =n ) return SQLI
25880 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b  TE_OK;.  n = (n+
25890 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d  7)&~7;.  paNew =
258a0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
258b0 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  Raw(db, sizeof(p
258c0 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b  ->aLTerm[0])*n);
258d0 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20  .  if( paNew==0 
258e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
258f0 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28  NOMEM;.  memcpy(
25900 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d  paNew, p->aLTerm
25910 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65  , sizeof(p->aLTe
25920 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74  rm[0])*p->nLSlot
25930 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65  );.  if( p->aLTe
25940 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61  rm!=p->aLTermSpa
25950 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ce ) sqlite3DbFr
25960 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d  ee(db, p->aLTerm
25970 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d  );.  p->aLTerm =
25980 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53   paNew;.  p->nLS
25990 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72  lot = n;.  retur
259a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
259b0 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63  /*.** Transfer c
259c0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
259d0 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74  second pLoop int
259e0 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a  o the first..*/.
259f0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
25a00 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33  LoopXfer(sqlite3
25a10 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
25a20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20  *pTo, WhereLoop 
25a30 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 77  *pFrom){.  if( w
25a40 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
25a50 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e  b, pTo, pFrom->n
25a60 4c 54 65 72 6d 29 20 29 20 72 65 74 75 72 6e 20  LTerm) ) return 
25a70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
25a80 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
25a90 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20  ion(db, pTo);.  
25aa0 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f  memcpy(pTo, pFro
25ab0 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46  m, WHERE_LOOP_XF
25ac0 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79  ER_SZ);.  memcpy
25ad0 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46  (pTo->aLTerm, pF
25ae0 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f  rom->aLTerm, pTo
25af0 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28  ->nLTerm*sizeof(
25b00 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29  pTo->aLTerm[0]))
25b10 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77  ;.  if( pFrom->w
25b20 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
25b30 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
25b40 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62     pFrom->u.vtab
25b50 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
25b60 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f   }else if( (pFro
25b70 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  m->wsFlags & WHE
25b80 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
25b90 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  0 ){.    pFrom->
25ba0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
25bb0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
25bc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
25bd0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68  *.** Delete a Wh
25be0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
25bf0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
25c00 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71  ereLoopDelete(sq
25c10 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
25c20 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72  Loop *p){.  wher
25c30 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
25c40 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
25c50 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
25c60 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65  .** Free a Where
25c70 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
25c80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
25c90 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69  ereInfoFree(sqli
25ca0 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e  te3 *db, WhereIn
25cb0 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69  fo *pWInfo){.  i
25cc0 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f  f( ALWAYS(pWInfo
25cd0 29 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  ) ){.    whereCl
25ce0 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66  auseClear(&pWInf
25cf0 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69  o->sWC);.    whi
25d00 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  le( pWInfo->pLoo
25d10 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  ps ){.      Wher
25d20 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66  eLoop *p = pWInf
25d30 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20  o->pLoops;.     
25d40 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
25d50 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
25d60 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44        whereLoopD
25d70 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20  elete(db, p);.  
25d80 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
25d90 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
25da0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
25db0 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63  Insert or replac
25dc0 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  e a WhereLoop en
25dd0 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65  try using the te
25de0 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e  mplate supplied.
25df0 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
25e00 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74  ng WhereLoop ent
25e10 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72  ry might be over
25e20 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e  written if the n
25e30 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69  ew template.** i
25e40 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73  s better and has
25e50 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
25e60 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d  ies.  Or the tem
25e70 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67  plate will be ig
25e80 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20  nored.** and no 
25e90 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75  insert will occu
25ea0 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  r if an existing
25eb0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61   WhereLoop is fa
25ec0 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20  ster and has.** 
25ed0 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
25ee0 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70  es than the temp
25ef0 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65  late.  Otherwise
25f00 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70   a new WhereLoop
25f10 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73   is.** added bas
25f20 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61  ed on the templa
25f30 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75  te..**.** If pBu
25f40 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
25f50 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77   not NULL then w
25f60 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
25f70 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72  t only the.** pr
25f80 65 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20  erequisites and 
25f90 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f  rRun and nOut co
25fa0 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73  sts of the N bes
25fb0 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a  t loops.  That.*
25fc0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  * information is
25fd0 20 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65   gathered in the
25fe0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
25ff0 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  t object.  This 
26000 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65  special.** proce
26010 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  ssing mode is us
26020 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63  ed only for OR c
26030 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
26040 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63  ..**.** When acc
26050 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70  umulating multip
26060 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70  le loops (when p
26070 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
26080 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73  is NULL) we.** s
26090 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77  till might overw
260a0 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f  rite similar loo
260b0 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ps with the new 
260c0 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a  template if the.
260d0 2a 2a 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62  ** template is b
260e0 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61  etter.  Loops ma
260f0 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  y be overwritten
26100 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
26110 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  g .** conditions
26120 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
26130 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76     (1)  They hav
26140 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e  e the same iTab.
26150 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79  .**    (2)  They
26160 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
26170 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28  SortIdx..**    (
26180 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  3)  The template
26190 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77   has same or few
261a0 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
261b0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
261c0 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20   loop.**    (4) 
261d0 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
261e0 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
261f0 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68  wer cost than th
26200 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
26210 2a 20 20 20 20 28 35 29 20 20 54 68 65 20 74 65  *    (5)  The te
26220 6d 70 6c 61 74 65 20 75 73 65 73 20 6d 6f 72 65  mplate uses more
26230 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 73 61   terms of the sa
26240 6d 65 20 69 6e 64 65 78 20 62 75 74 20 68 61 73  me index but has
26250 20 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a   no additional.*
26260 2a 20 20 20 20 20 20 20 20 20 64 65 70 65 6e 64  *         depend
26270 65 6e 63 69 65 73 20 20 20 20 20 20 20 20 20 20  encies          
26280 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
26290 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57  hereLoopInsert(W
262a0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
262b0 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65  *pBuilder, Where
262c0 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
262d0 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  {.  WhereLoop **
262e0 70 70 50 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65  ppPrev, *p, *pNe
262f0 78 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 49  xt = 0;.  WhereI
26300 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
26310 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
26320 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
26330 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
26340 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75  db;..  /* If pBu
26350 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
26360 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f   defined, then o
26370 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f  nly keep track o
26380 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a  f the costs.  **
26390 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20   and prereqs..  
263a0 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
263b0 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a  r->pOrSet!=0 ){.
263c0 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
263d0 4e 41 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e  NABLED.    u16 n
263e0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72   = pBuilder->pOr
263f0 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20  Set->n;.    int 
26400 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77  x =.#endif.    w
26410 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75  hereOrInsert(pBu
26420 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70  ilder->pOrSet, p
26430 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
26440 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  , pTemplate->rRu
26450 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
26460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26470 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
26480 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45  ->nOut);.#if WHE
26490 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
264a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
264b0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
264c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
264d0 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20  DebugPrintf(x?" 
264e0 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20    or-%d:  ":"   
264f0 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20  or-X:  ", n);.  
26500 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
26510 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57  nt(pTemplate, pW
26520 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b  Info->pTabList);
26530 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
26540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26550 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  OK;.  }..  /* Se
26560 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
26570 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74  ting WhereLoop t
26580 6f 20 6f 76 65 72 77 72 69 74 65 2c 20 6f 72 20  o overwrite, or 
26590 77 68 69 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a  which takes.  **
265a0 20 70 72 69 6f 72 69 74 79 20 6f 76 65 72 20 70   priority over p
265b0 54 65 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20  Template..  */. 
265c0 20 66 6f 72 28 70 70 50 72 65 76 3d 26 70 57 49   for(ppPrev=&pWI
265d0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a  nfo->pLoops, p=*
265e0 70 70 50 72 65 76 3b 20 70 3b 20 70 70 50 72 65  ppPrev; p; ppPre
265f0 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c  v=&p->pNextLoop,
26600 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20   p=*ppPrev){.   
26610 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
26620 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c  emplate->iTab ||
26630 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54   p->iSortIdx!=pT
26640 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64  emplate->iSortId
26650 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  x ){.      /* If
26660 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61 62   either the iTab
26670 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c   or iSortIdx val
26680 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72  ues for two Wher
26690 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72  eLoop are differ
266a0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ent.      ** the
266b0 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f  n those WhereLoo
266c0 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  ps need to be co
266d0 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61 74  nsidered separat
266e0 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73  ely.  Neither is
266f0 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64  .      ** a cand
26700 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65  idate to replace
26710 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20   the other. */. 
26720 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
26730 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74     }.    /* In t
26740 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
26750 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72  mentation, the r
26760 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20 65  Setup value is e
26770 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a  ither zero.    *
26780 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66  * or the cost of
26790 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74   building an aut
267a0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c  omatic index (Nl
267b0 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f  ogN) and the Nlo
267c0 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  gN.    ** is the
267d0 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74   same for compat
267e0 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e  ible WhereLoops.
267f0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
26800 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20  p->rSetup==0 || 
26810 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
26820 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  p==0 .          
26830 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65         || p->rSe
26840 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup==pTemplate->
26850 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f  rSetup );..    /
26860 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  * whereLoopAddBt
26870 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e  ree() always gen
26880 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72  erates and inser
26890 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ts the automatic
268a0 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61   index.    ** ca
268b0 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65  se first.  Hence
268c0 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64   compatible cand
268d0 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73  idate WhereLoops
268e0 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c 61   never have a la
268f0 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74  rger.    ** rSet
26900 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45  up. Call this SE
26910 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f  TUP-INVARIANT */
26920 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
26930 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74  rSetup>=pTemplat
26940 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
26950 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
26960 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
26970 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71  ereq)==p->prereq
26980 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74  .     && p->rSet
26990 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up<=pTemplate->r
269a0 53 65 74 75 70 0a 20 20 20 20 20 26 26 20 70 2d  Setup.     && p-
269b0 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65  >rRun<=pTemplate
269c0 2d 3e 72 52 75 6e 0a 20 20 20 20 29 7b 0a 20 20  ->rRun.    ){.  
269d0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
269e0 63 68 20 74 61 6b 65 6e 20 77 68 65 6e 20 70 20  ch taken when p 
269f0 69 73 20 65 71 75 61 6c 20 6f 72 20 62 65 74 74  is equal or bett
26a00 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  er than pTemplat
26a10 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61  e in .      ** a
26a20 6c 6c 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64  ll of (1) depend
26a30 65 6e 63 65 73 20 28 32 29 20 73 65 74 75 70 2d  ences (2) setup-
26a40 63 6f 73 74 2c 20 61 6e 64 20 28 33 29 20 72 75  cost, and (3) ru
26a50 6e 2d 63 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20  n-cost. */.     
26a60 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
26a70 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up==pTemplate->r
26a80 53 65 74 75 70 20 29 3b 0a 20 20 20 20 20 20 69  Setup );.      i
26a90 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 3c 70 54 65  f( p->nLTerm<pTe
26aa0 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 0a 20  mplate->nLTerm. 
26ab0 20 20 20 20 20 20 26 26 20 28 70 2d 3e 77 73 46        && (p->wsF
26ac0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
26ad0 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
26ae0 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  && (pTemplate->w
26af0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
26b00 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
26b10 20 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e    && p->u.btree.
26b20 70 49 6e 64 65 78 3d 3d 70 54 65 6d 70 6c 61 74  pIndex==pTemplat
26b30 65 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  e->u.btree.pInde
26b40 78 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e 70  x.       && p->p
26b50 72 65 72 65 71 3d 3d 70 54 65 6d 70 6c 61 74 65  rereq==pTemplate
26b60 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 20 29  ->prereq.      )
26b70 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65  {.        /* Ove
26b80 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69  rwrite an existi
26b90 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74  ng WhereLoop wit
26ba0 68 20 61 6e 20 73 69 6d 69 6c 61 72 20 6f 6e 65  h an similar one
26bb0 20 74 68 61 74 20 75 73 65 73 0a 20 20 20 20 20   that uses.     
26bc0 20 20 20 2a 2a 20 6d 6f 72 65 20 74 65 72 6d 73     ** more terms
26bd0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
26be0 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d  .        pNext =
26bf0 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
26c00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26c10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26c20 20 20 20 2f 2a 20 70 54 65 6d 70 6c 61 74 65 20     /* pTemplate 
26c30 69 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 2e 0a  is not helpful..
26c40 20 20 20 20 20 20 20 20 2a 2a 20 52 65 74 75 72          ** Retur
26c50 6e 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  n without changi
26c60 6e 67 20 6f 72 20 61 64 64 69 6e 67 20 61 6e 79  ng or adding any
26c70 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  thing */.       
26c80 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49   goto whereLoopI
26c90 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20  nsert_noop;.    
26ca0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
26cb0 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
26cc0 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
26cd0 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
26ce0 65 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e  ereq.     && p->
26cf0 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  rRun>=pTemplate-
26d00 3e 72 52 75 6e 0a 20 20 20 20 20 26 26 20 41 4c  >rRun.     && AL
26d10 57 41 59 53 28 70 2d 3e 72 53 65 74 75 70 3e 3d  WAYS(p->rSetup>=
26d20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
26d30 70 29 20 2f 2a 20 53 65 65 20 53 45 54 55 50 2d  p) /* See SETUP-
26d40 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20  INVARIANT above 
26d50 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
26d60 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20  /* Overwrite an 
26d70 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
26d80 6f 70 20 77 69 74 68 20 61 20 62 65 74 74 65 72  op with a better
26d90 20 6f 6e 65 3a 20 6f 6e 65 20 74 68 61 74 20 69   one: one that i
26da0 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65  s.      ** bette
26db0 72 20 61 74 20 6f 6e 65 20 6f 66 20 28 31 29 20  r at one of (1) 
26dc0 64 65 70 65 6e 64 65 6e 63 65 73 2c 20 28 32 29  dependences, (2)
26dd0 20 73 65 74 75 70 2d 63 6f 73 74 2c 20 6f 72 20   setup-cost, or 
26de0 28 33 29 20 72 75 6e 2d 63 6f 73 74 0a 20 20 20  (3) run-cost.   
26df0 20 20 20 2a 2a 20 61 6e 64 20 69 73 20 6e 6f 20     ** and is no 
26e00 77 6f 72 73 65 20 69 6e 20 61 6e 79 20 6f 66 20  worse in any of 
26e10 74 68 6f 73 65 20 63 61 74 65 67 6f 72 69 65 73  those categories
26e20 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78 74  . */.      pNext
26e30 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b   = p->pNextLoop;
26e40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26e50 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
26e60 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
26e70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68  oint it means th
26e80 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68  at either p[] sh
26e90 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74  ould be overwrit
26ea0 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54  ten.  ** with pT
26eb0 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d  emplate[] if p[]
26ec0 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70   exists, or if p
26ed0 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f  ==NULL then allo
26ee0 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20  cate a new.  ** 
26ef0 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e  WhereLoop and in
26f00 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  sert it..  */.#i
26f10 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
26f20 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
26f30 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
26f40 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21  x8 ){.    if( p!
26f50 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
26f60 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
26f70 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20  ins-del:  ");.  
26f80 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
26f90 6e 74 28 70 2c 20 70 57 49 6e 66 6f 2d 3e 70 54  nt(p, pWInfo->pT
26fa0 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  abList);.    }. 
26fb0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
26fc0 72 69 6e 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20  rintf("ins-new: 
26fd0 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f   ");.    whereLo
26fe0 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
26ff0 65 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  e, pWInfo->pTabL
27000 69 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ist);.  }.#endif
27010 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
27020 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62     p = sqlite3Db
27030 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
27040 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
27050 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
27060 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
27070 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c  OMEM;.    whereL
27080 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a  oopInit(p);.  }.
27090 20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28    whereLoopXfer(
270a0 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65  db, p, pTemplate
270b0 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  );.  p->pNextLoo
270c0 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70  p = pNext;.  *pp
270d0 50 72 65 76 20 3d 20 70 3b 0a 20 20 69 66 28 20  Prev = p;.  if( 
270e0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
270f0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
27100 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65  )==0 ){.    Inde
27110 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75  x *pIndex = p->u
27120 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
27130 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26     if( pIndex &&
27140 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30   pIndex->tnum==0
27150 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62   ){.      p->u.b
27160 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
27170 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
27180 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
27190 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
271a0 66 20 74 68 65 20 69 6e 73 65 72 74 20 69 73 20  f the insert is 
271b0 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65  a no-op */.where
271c0 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a  LoopInsert_noop:
271d0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
271e0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
271f0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
27200 26 20 30 78 38 20 29 7b 0a 20 20 20 20 73 71 6c  & 0x8 ){.    sql
27210 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
27220 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20  "ins-noop: ");. 
27230 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
27240 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49  t(pTemplate, pWI
27250 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a  nfo->pTabList);.
27260 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
27270 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
27280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76  .}../*.** We hav
27290 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64  e so far matched
272a0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
272b0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72  >u.btree.nEq ter
272c0 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ms of the index 
272d0 70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72 79 20 74  pIndex..** Try t
272e0 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65  o match one more
272f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62  ..**.** If pProb
27300 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74  e->tnum==0, that
27310 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73   means pIndex is
27320 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73   a fake index us
27330 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e  ed for the.** IN
27340 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
27350 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
27360 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
27370 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  eeIndex(.  Where
27380 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
27390 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68  ilder,     /* Th
273a0 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74  e WhereLoop fact
273b0 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ory */.  struct 
273c0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
273d0 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d  rc,      /* FROM
273e0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
273f0 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  ng analyzed */. 
27400 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20   Index *pProbe, 
27410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27420 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20   /* An index on 
27430 70 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 43  pSrc */.  WhereC
27440 6f 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20  ost nInMul      
27450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67            /* log
27460 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61  (Number of itera
27470 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29  tions due to IN)
27480 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
27490 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
274a0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20  ilder->pWInfo;  
274b0 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65  /* WHERE analyse
274c0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
274d0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
274e0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20  Info->pParse;   
274f0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
27500 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
27510 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
27520 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20  e->db;       /* 
27530 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
27540 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65  ion malloc conte
27550 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
27560 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
27570 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
27580 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e  ate WhereLoop un
27590 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
275a0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
275b0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
275c0 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65        /* A Where
275d0 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69  Term under consi
275e0 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  deration */.  in
275f0 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20  t opMask;       
27600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27610 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73   Valid operators
27620 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   for constraints
27630 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20   */.  WhereScan 
27640 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20  scan;           
27650 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
27660 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d  r for WHERE term
27670 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73  s */.  Bitmask s
27680 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20  aved_prereq;    
27690 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
276a0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
276b0 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31  ->prereq */.  u1
276c0 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20  6 saved_nLTerm; 
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
276e0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
276f0 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  of pNew->nLTerm 
27700 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 5f 6e  */.  int saved_n
27710 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
27720 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
27730 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
27740 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20  u.btree.nEq */. 
27750 20 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61   u32 saved_wsFla
27760 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
27770 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
27780 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c  ue of pNew->wsFl
27790 61 67 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ags */.  WhereCo
277a0 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20  st saved_nOut;  
277b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
277c0 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
277d0 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e  ew->nOut */.  in
277e0 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t iCol;         
277f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27800 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   Index of the co
27810 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
27820 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
27830 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
27840 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
27850 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65 72 65   code */.  Where
27860 43 6f 73 74 20 6e 52 6f 77 45 73 74 3b 20 20 20  Cost nRowEst;   
27870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73             /* Es
27880 74 69 6d 61 74 65 64 20 69 6e 64 65 78 20 73 65  timated index se
27890 6c 65 63 74 69 76 69 74 79 20 2a 2f 0a 20 20 57  lectivity */.  W
278a0 68 65 72 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a  hereCost rLogSiz
278b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
278c0 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  * Logarithm of t
278d0 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57  able size */.  W
278e0 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d  hereTerm *pTop =
278f0 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f   0, *pBtm = 0; /
27900 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d  * Top and bottom
27910 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
27920 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20  ts */..  pNew = 
27930 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
27940 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
27950 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
27960 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20  SQLITE_NOMEM;.. 
27970 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
27980 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27990 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
279a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
279b0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
279c0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d  HERE_TOP_LIMIT)=
279d0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  =0 );.  if( pNew
279e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
279f0 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
27a00 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c     opMask = WO_L
27a10 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65  T|WO_LE;.  }else
27a20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75   if( pProbe->tnu
27a30 6d 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a  m<=0 || (pSrc->j
27a40 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
27a50 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d  T)!=0 ){.    opM
27a60 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
27a70 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  N|WO_GT|WO_GE|WO
27a80 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c  _LT|WO_LE;.  }el
27a90 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d  se{.    opMask =
27aa0 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
27ab0 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f  ISNULL|WO_GT|WO_
27ac0 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a  GE|WO_LT|WO_LE;.
27ad0 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65    }.  if( pProbe
27ae0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f  ->bUnordered ) o
27af0 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54  pMask &= ~(WO_GT
27b00 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
27b10 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  LE);..  assert( 
27b20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
27b30 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  q<=pProbe->nColu
27b40 6d 6e 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  mn );.  if( pNew
27b50 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3c 20  ->u.btree.nEq < 
27b60 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
27b70 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 50  ){.    iCol = pP
27b80 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  robe->aiColumn[p
27b90 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27ba0 5d 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d  ];.    nRowEst =
27bb0 20 77 68 65 72 65 43 6f 73 74 28 70 50 72 6f 62   whereCost(pProb
27bc0 65 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4e 65 77  e->aiRowEst[pNew
27bd0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 31 5d  ->u.btree.nEq+1]
27be0 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45  );.    if( nRowE
27bf0 73 74 3d 3d 30 20 26 26 20 70 50 72 6f 62 65 2d  st==0 && pProbe-
27c00 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
27c10 65 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 31 3b  e ) nRowEst = 1;
27c20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43  .  }else{.    iC
27c30 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 6e 52 6f  ol = -1;.    nRo
27c40 77 45 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  wEst = 0;.  }.  
27c50 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
27c60 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75  nInit(&scan, pBu
27c70 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63  ilder->pWC, pSrc
27c80 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c  ->iCursor, iCol,
27c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27ca0 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c           opMask,
27cb0 20 70 50 72 6f 62 65 29 3b 0a 20 20 73 61 76 65   pProbe);.  save
27cc0 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e  d_nEq = pNew->u.
27cd0 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76  btree.nEq;.  sav
27ce0 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77  ed_nLTerm = pNew
27cf0 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65  ->nLTerm;.  save
27d00 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77  d_wsFlags = pNew
27d10 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76  ->wsFlags;.  sav
27d20 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77  ed_prereq = pNew
27d30 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65  ->prereq;.  save
27d40 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e  d_nOut = pNew->n
27d50 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65  Out;.  pNew->rSe
27d60 74 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53  tup = 0;.  rLogS
27d70 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 77 68 65  ize = estLog(whe
27d80 72 65 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e 61  reCost(pProbe->a
27d90 69 52 6f 77 45 73 74 5b 30 5d 29 29 3b 0a 20 20  iRowEst[0]));.  
27da0 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45  for(; rc==SQLITE
27db0 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b  _OK && pTerm!=0;
27dc0 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63   pTerm = whereSc
27dd0 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a  anNext(&scan)){.
27de0 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b      int nIn = 0;
27df0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
27e00 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
27e10 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
27e20 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
27e30 29 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61  ).    int nRecVa
27e40 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  lid = pBuilder->
27e50 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 61  nRecValid;.    a
27e60 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
27e70 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
27e80 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
27e90 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
27ea0 56 4e 55 4c 4c 29 21 3d 30 20 26 26 20 70 53 72  VNULL)!=0 && pSr
27eb0 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  c->pTab->aCol[iC
27ec0 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20  ol].notNull ){. 
27ed0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f       continue; /
27ee0 2a 20 73 6b 69 70 20 49 53 20 4e 4f 54 20 4e 55  * skip IS NOT NU
27ef0 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
27f00 6e 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c  n a NOT NULL col
27f10 75 6d 6e 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e  umn */.    }.#en
27f20 64 69 66 0a 20 20 20 20 69 66 28 20 70 54 65 72  dif.    if( pTer
27f30 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
27f40 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
27f50 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
27f60 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
27f70 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20  Out==saved_nOut 
27f80 29 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73  );..    pNew->ws
27f90 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
27fa0 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d  Flags;.    pNew-
27fb0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
27fc0 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e  aved_nEq;.    pN
27fd0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76  ew->nLTerm = sav
27fe0 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69  ed_nLTerm;.    i
27ff0 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
28000 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
28010 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62  w->nLTerm+1) ) b
28020 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a  reak; /* OOM */.
28030 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
28040 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
28050 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e   = pTerm;.    pN
28060 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61  ew->prereq = (sa
28070 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65  ved_prereq | pTe
28080 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29  rm->prereqRight)
28090 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   & ~pNew->maskSe
280a0 6c 66 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52  lf;.    pNew->rR
280b0 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 3b 20 2f  un = rLogSize; /
280c0 2a 20 42 61 73 65 6c 69 6e 65 20 63 6f 73 74 20  * Baseline cost 
280d0 69 73 20 6c 6f 67 32 28 4e 29 2e 20 20 41 64 6a  is log2(N).  Adj
280e0 75 73 74 6d 65 6e 74 73 20 62 65 6c 6f 77 20 2a  ustments below *
280f0 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  /.    if( pTerm-
28100 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
28110 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  IN ){.      Expr
28120 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
28130 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  >pExpr;.      pN
28140 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
28150 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a  HERE_COLUMN_IN;.
28160 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
28170 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
28180 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
28190 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
281a0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
281b0 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53  :  TUNING: the S
281c0 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35  ELECT returns 25
281d0 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20   rows */.       
281e0 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65   nIn = 46;  asse
281f0 72 74 28 20 34 36 3d 3d 77 68 65 72 65 43 6f 73  rt( 46==whereCos
28200 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d  t(25) );.      }
28210 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
28220 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26  pExpr->x.pList &
28230 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
28240 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
28250 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61      /* "x IN (va
28260 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
28270 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  " */.        nIn
28280 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70 45 78   = whereCost(pEx
28290 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
282a0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
282b0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d     pNew->rRun +=
282c0 20 6e 49 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77   nIn;.      pNew
282d0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
282e0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
282f0 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49  t = nRowEst + nI
28300 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20  nMul + nIn;.    
28310 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
28320 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
28330 5f 45 51 29 20 29 7b 0a 20 20 20 20 20 20 61 73  _EQ) ){.      as
28340 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
28350 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
28360 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f  LUMN_NULL|WHERE_
28370 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 30 0a 20  COLUMN_IN))!=0. 
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28390 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30 20 29 3b   || nInMul==0 );
283a0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
283b0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
283c0 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69  LUMN_EQ;.      i
283d0 66 28 20 69 43 6f 6c 3c 30 20 20 0a 20 20 20 20  f( iCol<0  .    
283e0 20 20 20 7c 7c 20 28 70 50 72 6f 62 65 2d 3e 6f     || (pProbe->o
283f0 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
28400 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20  && nInMul==0.   
28410 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d          && pNew-
28420 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50  >u.btree.nEq==pP
28430 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 29  robe->nColumn-1)
28440 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
28450 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
28460 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
28470 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 7c  _COLUMN_IN)==0 |
28480 7c 20 69 43 6f 6c 3c 30 20 29 3b 0a 20 20 20 20  | iCol<0 );.    
28490 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
284a0 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f  s |= WHERE_ONERO
284b0 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  W;.      }.     
284c0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
284d0 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77  Eq++;.      pNew
284e0 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74  ->nOut = nRowEst
284f0 20 2b 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20 7d   + nInMul;.    }
28500 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
28510 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
28520 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ISNULL) ){.     
28530 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
28540 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  = WHERE_COLUMN_N
28550 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ULL;.      pNew-
28560 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
28570 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
28580 20 49 53 20 4e 55 4c 4c 20 73 65 6c 65 63 74 73   IS NULL selects
28590 20 32 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20   2 rows */.     
285a0 20 6e 49 6e 20 3d 20 31 30 3b 20 20 61 73 73 65   nIn = 10;  asse
285b0 72 74 28 20 31 30 3d 3d 77 68 65 72 65 43 6f 73  rt( 10==whereCos
285c0 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20 70 4e  t(2) );.      pN
285d0 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45  ew->nOut = nRowE
285e0 73 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49  st + nInMul + nI
285f0 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  n;.    }else if(
28600 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
28610 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  r & (WO_GT|WO_GE
28620 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
28630 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
28640 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 20 29 3b  rator & WO_GT );
28650 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28660 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
28670 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20  r & WO_GE );.   
28680 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
28690 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
286a0 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d  _RANGE|WHERE_BTM
286b0 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 42  _LIMIT;.      pB
286c0 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  tm = pTerm;.    
286d0 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20    pTop = 0;.    
286e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
286f0 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
28700 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57  rator & (WO_LT|W
28710 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74  O_LE) );.      t
28720 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
28730 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
28740 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
28750 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
28760 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b  rator & WO_LE );
28770 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
28780 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
28790 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
287a0 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _TOP_LIMIT;.    
287b0 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a    pTop = pTerm;.
287c0 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e        pBtm = (pN
287d0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
287e0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d  ERE_BTM_LIMIT)!=
287f0 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 ?.            
28800 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
28810 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
28820 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d  rm-2] : 0;.    }
28830 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  .    if( pNew->w
28840 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
28850 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
28860 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e       /* Adjust n
28870 4f 75 74 20 61 6e 64 20 72 52 75 6e 20 66 6f 72  Out and rRun for
28880 20 53 54 41 54 33 20 72 61 6e 67 65 20 76 61 6c   STAT3 range val
28890 75 65 73 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ues */.      ass
288a0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
288b0 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
288c0 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53       whereRangeS
288d0 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
288e0 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70  Builder, pBtm, p
288f0 54 6f 70 2c 20 26 70 4e 65 77 2d 3e 6e 4f 75 74  Top, &pNew->nOut
28900 29 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66  );.    }.#if def
28910 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
28920 4c 45 5f 53 54 41 54 34 29 20 7c 7c 20 64 65 66  LE_STAT4) || def
28930 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
28940 4c 45 5f 53 54 41 54 33 29 0a 20 20 20 20 69 66  LE_STAT3).    if
28950 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20  ( nInMul==0 .   
28960 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61    && pProbe->nSa
28970 6d 70 6c 65 20 0a 20 20 20 20 20 26 26 20 70 4e  mple .     && pN
28980 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
28990 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65  =pProbe->nSample
289a0 43 6f 6c 0a 20 20 20 20 20 26 26 20 4f 70 74 69  Col.     && Opti
289b0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
289c0 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33  db, SQLITE_Stat3
289d0 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
289e0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
289f0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
28a00 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d    tRowcnt nOut =
28a10 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   0;.      if( (p
28a20 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
28a30 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  & (WO_EQ|WO_ISNU
28a40 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  LL))!=0 ){.     
28a50 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
28a60 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28a70 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
28a80 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
28a90 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
28aa0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
28ab0 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
28ac0 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
28ad0 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70  , pBuilder, pExp
28ae0 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74  r->pRight, &nOut
28af0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
28b00 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
28b10 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 0a 20 20  ator & WO_IN).  
28b20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 20 21             &&  !
28b30 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
28b40 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
28b50 65 63 74 29 20 20 29 7b 0a 20 20 20 20 20 20 20  ect)  ){.       
28b60 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61   rc = whereInSca
28b70 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
28b80 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e  ilder, pExpr->x.
28b90 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20  pList, &nOut);. 
28ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
28bb0 65 72 74 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20  ert( nOut==0 || 
28bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
28bd0 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20  .      if( nOut 
28be0 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20  ){.        nOut 
28bf0 3d 20 77 68 65 72 65 43 6f 73 74 28 6e 4f 75 74  = whereCost(nOut
28c00 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
28c10 3e 6e 4f 75 74 20 3d 20 4d 49 4e 28 6e 4f 75 74  >nOut = MIN(nOut
28c20 2c 20 73 61 76 65 64 5f 6e 4f 75 74 29 3b 0a 20  , saved_nOut);. 
28c30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
28c40 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4e 65  dif.    if( (pNe
28c50 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  w->wsFlags & (WH
28c60 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45  ERE_IDX_ONLY|WHE
28c70 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20  RE_IPK))==0 ){. 
28c80 20 20 20 20 20 2f 2a 20 45 61 63 68 20 72 6f 77       /* Each row
28c90 20 69 6e 76 6f 6c 76 65 73 20 61 20 73 74 65 70   involves a step
28ca0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 74   of the index, t
28cb0 68 65 6e 20 61 20 62 69 6e 61 72 79 20 73 65 61  hen a binary sea
28cc0 72 63 68 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  rch of.      ** 
28cd0 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 2a  the main table *
28ce0 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  /.      pNew->rR
28cf0 75 6e 20 3d 20 20 77 68 65 72 65 43 6f 73 74 41  un =  whereCostA
28d00 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72  dd(pNew->rRun, r
28d10 4c 6f 67 53 69 7a 65 3e 32 37 20 3f 20 72 4c 6f  LogSize>27 ? rLo
28d20 67 53 69 7a 65 2d 31 37 20 3a 20 31 30 29 3b 0a  gSize-17 : 10);.
28d30 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 53 74 65      }.    /* Ste
28d40 70 20 63 6f 73 74 20 66 6f 72 20 65 61 63 68 20  p cost for each 
28d50 6f 75 74 70 75 74 20 72 6f 77 20 2a 2f 0a 20 20  output row */.  
28d60 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77    pNew->rRun = w
28d70 68 65 72 65 43 6f 73 74 41 64 64 28 70 4e 65 77  hereCostAdd(pNew
28d80 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f  ->rRun, pNew->nO
28d90 75 74 29 3b 0a 20 20 20 20 2f 2a 20 54 42 44 3a  ut);.    /* TBD:
28da0 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 66 6f 72   Adjust nOut for
28db0 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73   additional cons
28dc0 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 72  traints */.    r
28dd0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
28de0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
28df0 65 77 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e  ew);.    if( (pN
28e00 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
28e10 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
28e20 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e  0.     && pNew->
28e30 75 2e 62 74 72 65 65 2e 6e 45 71 3c 28 70 50 72  u.btree.nEq<(pPr
28e40 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 28  obe->nColumn + (
28e50 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 21 3d 30  pProbe->zName!=0
28e60 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
28e70 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
28e80 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c  eIndex(pBuilder,
28e90 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e   pSrc, pProbe, n
28ea0 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20  InMul+nIn);.    
28eb0 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  }.    pNew->nOut
28ec0 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23   = saved_nOut;.#
28ed0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
28ee0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 29 20  E_ENABLE_STAT4) 
28ef0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
28f00 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 0a  E_ENABLE_STAT3).
28f10 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
28f20 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61  ecValid = nRecVa
28f30 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  lid;.#endif.  }.
28f40 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
28f50 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20   saved_prereq;. 
28f60 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
28f70 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
28f80 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
28f90 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  = saved_wsFlags;
28fa0 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20  .  pNew->nOut = 
28fb0 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e  saved_nOut;.  pN
28fc0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76  ew->nLTerm = sav
28fd0 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74  ed_nLTerm;.  ret
28fe0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28ff0 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20   Return True if 
29000 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
29010 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74  hat pIndex might
29020 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a   be useful in.**
29030 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
29040 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
29050 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a  e in pBuilder..*
29060 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73  *.** Return Fals
29070 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f  e if pBuilder do
29080 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
29090 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
290a0 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  e or.** if there
290b0 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70   is no way for p
290c0 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66  Index to be usef
290d0 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69  ul in implementi
290e0 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52  ng that.** ORDER
290f0 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73   BY clause..*/.s
29100 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d  tatic int indexM
29110 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65  ightHelpWithOrde
29120 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  rBy(.  WhereLoop
29130 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
29140 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  r,.  Index *pInd
29150 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f  ex,.  int iCurso
29160 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  r.){.  ExprList 
29170 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20  *pOB;.  int ii, 
29180 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65  jj;..  if( pInde
29190 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20  x->bUnordered ) 
291a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
291b0 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d  (pOB = pBuilder-
291c0 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  >pWInfo->pOrderB
291d0 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  y)==0 ) return 0
291e0 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
291f0 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  <pOB->nExpr; ii+
29200 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
29210 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
29220 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42  rSkipCollate(pOB
29230 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a  ->a[ii].pExpr);.
29240 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
29250 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
29260 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
29270 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
29280 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
29290 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49   for(jj=0; jj<pI
292a0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a  ndex->nColumn; j
292b0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
292c0 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
292d0 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ==pIndex->aiColu
292e0 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20  mn[jj] ) return 
292f0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
29300 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
29310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
29320 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65   a bitmask where
29330 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68 61   1s indicate tha
29340 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
29350 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  ing column of.**
29360 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75 73   the table is us
29370 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20  ed by an index. 
29380 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
29390 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63  63 columns are c
293a0 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74  onsidered..*/.st
293b0 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c  atic Bitmask col
293c0 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65  umnsInIndex(Inde
293d0 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d  x *pIdx){.  Bitm
293e0 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74  ask m = 0;.  int
293f0 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78   j;.  for(j=pIdx
29400 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d  ->nColumn-1; j>=
29410 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; j--){.    int
29420 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
29430 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 74 65 73 74  umn[j];.    test
29440 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29  case( x==BMS-1 )
29450 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
29460 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20  x==BMS-2 );.    
29470 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20  if( x<BMS-1 ) m 
29480 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20  |= MASKBIT(x);. 
29490 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d   }.  return m;.}
294a0 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  ../* Check to se
294b0 65 20 69 66 20 61 20 70 61 72 74 69 61 6c 20 69  e if a partial i
294c0 6e 64 65 78 20 77 69 74 68 20 70 50 61 72 74 49  ndex with pPartI
294d0 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20 62 65  ndexWhere can be
294e0 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20   used.** in the 
294f0 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20  current query.  
29500 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
29510 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c  t can be and fal
29520 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  se if not..*/.st
29530 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 55 73  atic int whereUs
29540 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78  ablePartialIndex
29550 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65  (int iTab, Where
29560 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70  Clause *pWC, Exp
29570 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e  r *pWhere){.  in
29580 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  t i;.  WhereTerm
29590 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f 72 28 69   *pTerm;.  for(i
295a0 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
295b0 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
295c0 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
295d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
295e0 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 54  prImpliesExpr(pT
295f0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70 57 68 65  erm->pExpr, pWhe
29600 72 65 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  re, iTab) ) retu
29610 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
29620 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
29630 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
29640 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73   objects for a s
29650 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74  ingle table of t
29660 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68  he join where th
29670 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64  e table.** is id
29680 65 6e 66 69 65 64 20 62 79 20 70 42 75 69 6c 64  enfied by pBuild
29690 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20  er->pNew->iTab. 
296a0 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67   That table is g
296b0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a  uaranteed to be.
296c0 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c  ** a b-tree tabl
296d0 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  e, not a virtual
296e0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
296f0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
29700 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72 65  ddBtree(.  Where
29710 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
29720 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20  ilder, /* WHERE 
29730 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
29740 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
29750 6d 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  mExtra          
29760 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65      /* Extra pre
29770 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20 75  requesites for u
29780 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20  sing this table 
29790 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
297a0 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
297b0 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
297c0 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
297d0 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
297e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
297f0 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72  * An index we ar
29800 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a  e evaluating */.
29810 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20    Index sPk;    
29820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29830 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62   A fake index ob
29840 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69  ject for the pri
29850 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 74 52  mary key */.  tR
29860 6f 77 63 6e 74 20 61 69 52 6f 77 45 73 74 50 6b  owcnt aiRowEstPk
29870 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  [2];      /* The
29880 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75   aiRowEst[] valu
29890 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
298a0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43  dex */.  int aiC
298b0 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20  olumnPk = -1;   
298c0 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c       /* The aCol
298d0 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20  umn[] value for 
298e0 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f  the sPk index */
298f0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
29900 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  List;          /
29910 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
29920 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
29930 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
29940 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ;  /* The FROM c
29950 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72 6d  lause btree term
29960 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65   to add */.  Whe
29970 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20  reLoop *pNew;   
29980 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
29990 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f  late WhereLoop o
299a0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
299b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
299c0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
299d0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
299e0 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20  SortIdx = 1;    
299f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
29a00 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
29a10 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
29a20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f          /* A boo
29a30 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  lean value */.  
29a40 57 68 65 72 65 43 6f 73 74 20 72 53 69 7a 65 3b  WhereCost rSize;
29a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e              /* n
29a60 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
29a70 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
29a80 57 68 65 72 65 43 6f 73 74 20 72 4c 6f 67 53 69  WhereCost rLogSi
29a90 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ze;         /* L
29aa0 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20  ogarithm of the 
29ab0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
29ac0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
29ad0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
29ae0 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C;           /* 
29af0 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52 45  The parsed WHERE
29b00 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 0a 20 20   clause */.  .  
29b10 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
29b20 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20  >pNew;.  pWInfo 
29b30 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
29b40 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  fo;.  pTabList =
29b50 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
29b60 74 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62  t;.  pSrc = pTab
29b70 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e  List->a + pNew->
29b80 69 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42  iTab;.  pWC = pB
29b90 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61  uilder->pWC;.  a
29ba0 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61  ssert( !IsVirtua
29bb0 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
29bc0 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49  ..  if( pSrc->pI
29bd0 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
29be0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
29bf0 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
29c00 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
29c10 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
29c20 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
29c30 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ndex;.  }else{. 
29c40 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
29c50 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  o INDEXED BY cla
29c60 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66  use.  Create a f
29c70 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  ake Index object
29c80 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a   in local.    **
29c90 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f   variable sPk to
29ca0 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72   represent the r
29cb0 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  owid primary key
29cc0 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68   index.  Make th
29cd0 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69  is.    ** fake i
29ce0 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69  ndex the first i
29cf0 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64  n a chain of Ind
29d00 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20  ex objects with 
29d10 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a  all of the real.
29d20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74      ** indices t
29d30 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  o follow */.    
29d40 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20  Index *pFirst;  
29d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d60 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c  /* First of real
29d70 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
29d80 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d  table */.    mem
29d90 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a  set(&sPk, 0, siz
29da0 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
29db0 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31   sPk.nColumn = 1
29dc0 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75  ;.    sPk.aiColu
29dd0 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b  mn = &aiColumnPk
29de0 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45  ;.    sPk.aiRowE
29df0 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b  st = aiRowEstPk;
29e00 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72  .    sPk.onError
29e10 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20   = OE_Replace;. 
29e20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20     sPk.pTable = 
29e30 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20  pSrc->pTab;.    
29e40 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20  aiRowEstPk[0] = 
29e50 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  pSrc->pTab->nRow
29e60 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Est;.    aiRowEs
29e70 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20  tPk[1] = 1;.    
29e80 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
29e90 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
29ea0 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
29eb0 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dexed==0 ){.    
29ec0 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e    /* The real in
29ed0 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62  dices of the tab
29ee0 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73  le are only cons
29ef0 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20  idered if the.  
29f00 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58      ** NOT INDEX
29f10 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  ED qualifier is 
29f20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
29f30 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
29f40 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
29f50 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
29f60 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50      pProbe = &sP
29f70 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d  k;.  }.  rSize =
29f80 20 77 68 65 72 65 43 6f 73 74 28 70 53 72 63 2d   whereCost(pSrc-
29f90 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 29 3b  >pTab->nRowEst);
29fa0 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
29fb0 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 20 20  tLog(rSize);..  
29fc0 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  /* Automatic ind
29fd0 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70  exes */.  if( !p
29fe0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 0a  Builder->pOrSet.
29ff0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70     && (pWInfo->p
2a000 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
2a010 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e   & SQLITE_AutoIn
2a020 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53  dex)!=0.   && pS
2a030 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20  rc->pIndex==0.  
2a040 20 26 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f   && !pSrc->viaCo
2a050 72 6f 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70  routine.   && !p
2a060 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a  Src->notIndexed.
2a070 20 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43     && !pSrc->isC
2a080 6f 72 72 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20  orrelated.  ){. 
2a090 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
2a0a0 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c  uto-index WhereL
2a0b0 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72  oops */.    Wher
2a0c0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
2a0d0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
2a0e0 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70  End = pWC->a + p
2a0f0 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66  WC->nTerm;.    f
2a100 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
2a110 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2a120 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  & pTerm<pWCEnd; 
2a130 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
2a140 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
2a150 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
2a160 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
2a170 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65  ue;.      if( te
2a180 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
2a190 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20  pTerm, pSrc, 0) 
2a1a0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
2a1b0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31  >u.btree.nEq = 1
2a1c0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2a1d0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
2a1e0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   0;.        pNew
2a1f0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
2a200 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
2a210 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[0] = pTerm;. 
2a220 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
2a230 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20  : One-time cost 
2a240 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68  for computing th
2a250 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
2a260 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  x is.        ** 
2a270 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 37 2a  approximately 7*
2a280 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20  N*log2(N) where 
2a290 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
2a2a0 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20  of rows in.     
2a2b0 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
2a2c0 62 65 69 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a  being indexed. *
2a2d0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
2a2e0 72 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a  rSetup = rLogSiz
2a2f0 65 20 2b 20 72 53 69 7a 65 20 2b 20 32 38 3b 20  e + rSize + 28; 
2a300 20 61 73 73 65 72 74 28 20 32 38 3d 3d 77 68 65   assert( 28==whe
2a310 72 65 43 6f 73 74 28 37 29 20 29 3b 0a 20 20 20  reCost(7) );.   
2a320 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
2a330 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  Each index looku
2a340 70 20 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73  p yields 20 rows
2a350 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
2a360 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  This.        ** 
2a370 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  is more than the
2a380 20 75 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20   usual guess of 
2a390 31 30 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77  10 rows, since w
2a3a0 65 20 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20  e have no way.  
2a3b0 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77        ** of know
2a3c0 6e 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69  ning how selecti
2a3d0 76 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  ve the index wil
2a3e0 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e  l ultimately be.
2a3f0 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20    It would.     
2a400 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72     ** not be unr
2a410 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  easonable to mak
2a420 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63  e this value muc
2a430 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20  h larger. */.   
2a440 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2a450 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28 20 34  = 43;  assert( 4
2a460 33 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 30 29  3==whereCost(20)
2a470 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
2a480 2d 3e 72 52 75 6e 20 3d 20 77 68 65 72 65 43 6f  ->rRun = whereCo
2a490 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70  stAdd(rLogSize,p
2a4a0 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20  New->nOut);.    
2a4b0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
2a4c0 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s = WHERE_AUTO_I
2a4d0 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e  NDEX;.        pN
2a4e0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78  ew->prereq = mEx
2a4f0 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  tra | pTerm->pre
2a500 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
2a510 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2a520 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
2a530 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
2a540 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2a550 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
2a560 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72  dices.  */.  for
2a570 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
2a580 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f   && pProbe; pPro
2a590 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74  be=pProbe->pNext
2a5a0 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20  , iSortIdx++){. 
2a5b0 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70     if( pProbe->p
2a5c0 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a  PartIdxWhere!=0.
2a5d0 20 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73       && !whereUs
2a5e0 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78  ablePartialIndex
2a5f0 28 70 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57 43  (pNew->iTab, pWC
2a600 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  , pProbe->pPartI
2a610 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20  dxWhere) ){.    
2a620 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
2a630 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e  Partial index in
2a640 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
2a650 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20  this query */.  
2a660 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e    }.    pNew->u.
2a670 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20  btree.nEq = 0;. 
2a680 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
2a690 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
2a6a0 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20  SortIdx = 0;.   
2a6b0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2a6c0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  0;.    pNew->pre
2a6d0 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20  req = mExtra;.  
2a6e0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
2a6f0 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Size;.    pNew->
2a700 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
2a710 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d   pProbe;.    b =
2a720 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
2a730 69 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c  ithOrderBy(pBuil
2a740 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72  der, pProbe, pSr
2a750 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  c->iCursor);.   
2a760 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f   /* The ONEPASS_
2a770 44 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65  DESIRED flags ne
2a780 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74  ver occurs toget
2a790 68 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42  her with ORDER B
2a7a0 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  Y */.    assert(
2a7b0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
2a7c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2a7d0 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
2a7e0 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20   || b==0 );.    
2a7f0 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
2a800 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  <=0 ){.      /* 
2a810 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  Integer primary 
2a820 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  key index */.   
2a830 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2a840 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20   = WHERE_IPK;.. 
2a850 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62       /* Full tab
2a860 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  le scan */.     
2a870 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
2a880 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
2a890 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e   0;.      /* TUN
2a8a0 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c  ING: Cost of ful
2a8b0 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20  l table scan is 
2a8c0 33 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e  3*(N + log2(N)).
2a8d0 0a 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68  .      **  +  Th
2a8e0 65 20 65 78 74 72 61 20 33 20 66 61 63 74 6f 72  e extra 3 factor
2a8f0 20 69 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65   is to encourage
2a900 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65   the use of inde
2a910 78 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20  xed lookups.    
2a920 20 20 2a 2a 20 20 20 20 20 6f 76 65 72 20 66 75    **     over fu
2a930 6c 6c 20 73 63 61 6e 73 2e 20 20 41 20 73 6d 61  ll scans.  A sma
2a940 6c 6c 65 72 20 63 6f 6e 73 74 61 6e 74 20 32 20  ller constant 2 
2a950 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65  is used for cove
2a960 72 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 20 20  ring.      **   
2a970 20 20 69 6e 64 65 78 20 73 63 61 6e 73 20 73 6f    index scans so
2a980 20 74 68 61 74 20 61 20 63 6f 76 65 72 69 6e 67   that a covering
2a990 20 69 6e 64 65 78 20 73 63 61 6e 20 77 69 6c 6c   index scan will
2a9a0 20 62 65 20 66 61 76 6f 72 65 64 20 6f 76 65 72   be favored over
2a9b0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 61 20  .      **     a 
2a9c0 74 61 62 6c 65 20 73 63 61 6e 2e 20 2a 2f 0a 20  table scan. */. 
2a9d0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2a9e0 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72  = whereCostAdd(r
2a9f0 53 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b  Size,rLogSize) +
2aa00 20 31 36 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   16;.      rc = 
2aa10 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
2aa20 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
2aa30 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2aa40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
2aa50 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
2aa60 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
2aa70 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
2aa80 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20  dex(pProbe);.   
2aa90 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2aaa0 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45   = (m==0) ? (WHE
2aab0 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52  RE_IDX_ONLY|WHER
2aac0 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45  E_INDEXED) : WHE
2aad0 52 45 5f 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20  RE_INDEXED;..   
2aae0 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20     /* Full scan 
2aaf0 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  via index */.   
2ab00 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20     if( b.       
2ab10 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20  || ( m==0.      
2ab20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55     && pProbe->bU
2ab30 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20  nordered==0.    
2ab40 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
2ab50 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2ab60 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
2ab70 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  RED)==0.        
2ab80 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
2ab90 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a  lConfig.bUseCis.
2aba0 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
2abb0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
2abc0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
2abd0 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72  db, SQLITE_Cover
2abe0 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20  IdxScan).       
2abf0 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20     ).      ){.  
2ac00 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
2ac10 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
2ac20 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  Idx : 0;.       
2ac30 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20   if( m==0 ){.   
2ac40 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
2ac50 3a 20 43 6f 73 74 20 6f 66 20 61 20 63 6f 76 65  : Cost of a cove
2ac60 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20  ring index scan 
2ac70 69 73 20 32 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e  is 2*(N + log2(N
2ac80 29 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ))..          **
2ac90 20 20 2b 20 20 54 68 65 20 65 78 74 72 61 20 32    +  The extra 2
2aca0 20 66 61 63 74 6f 72 20 69 73 20 74 6f 20 65 6e   factor is to en
2acb0 63 6f 75 72 61 67 65 20 74 68 65 20 75 73 65 20  courage the use 
2acc0 6f 66 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75  of indexed looku
2acd0 70 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ps.          ** 
2ace0 20 20 20 20 6f 76 65 72 20 69 6e 64 65 78 20 73      over index s
2acf0 63 61 6e 73 2e 20 20 41 20 74 61 62 6c 65 20 73  cans.  A table s
2ad00 63 61 6e 20 75 73 65 73 20 61 20 66 61 63 74 6f  can uses a facto
2ad10 72 20 6f 66 20 33 20 73 6f 20 74 68 61 74 0a 20  r of 3 so that. 
2ad20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20           **     
2ad30 69 6e 64 65 78 20 73 63 61 6e 73 20 61 72 65 20  index scans are 
2ad40 66 61 76 6f 72 65 64 20 6f 76 65 72 20 74 61 62  favored over tab
2ad50 6c 65 20 73 63 61 6e 73 2e 0a 20 20 20 20 20 20  le scans..      
2ad60 20 20 20 20 2a 2a 20 20 2b 20 20 49 66 20 74 68      **  +  If th
2ad70 69 73 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  is covering inde
2ad80 78 20 6d 69 67 68 74 20 61 6c 73 6f 20 68 65 6c  x might also hel
2ad90 70 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  p satisfy the OR
2ada0 44 45 52 20 42 59 0a 20 20 20 20 20 20 20 20 20  DER BY.         
2adb0 20 2a 2a 20 20 20 20 20 63 6c 61 75 73 65 2c 20   **     clause, 
2adc0 74 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73  then the cost is
2add0 20 66 75 64 67 65 64 20 64 6f 77 6e 20 73 6c 69   fudged down sli
2ade0 67 68 74 6c 79 20 73 6f 20 74 68 61 74 20 74 68  ghtly so that th
2adf0 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
2ae00 20 20 20 20 69 6e 64 65 78 20 69 73 20 66 61 76      index is fav
2ae10 6f 72 65 64 20 61 62 6f 76 65 20 6f 74 68 65 72  ored above other
2ae20 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 68 61   indices that ha
2ae30 76 65 20 6e 6f 20 68 6f 70 65 20 6f 66 0a 20 20  ve no hope of.  
2ae40 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 68          **     h
2ae50 65 6c 70 69 6e 67 20 77 69 74 68 20 74 68 65 20  elping with the 
2ae60 4f 52 44 45 52 20 42 59 2e 20 2a 2f 0a 20 20 20  ORDER BY. */.   
2ae70 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
2ae80 6e 20 3d 20 31 30 20 2b 20 77 68 65 72 65 43 6f  n = 10 + whereCo
2ae90 73 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67  stAdd(rSize,rLog
2aea0 53 69 7a 65 29 20 2d 20 62 3b 0a 20 20 20 20 20  Size) - b;.     
2aeb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2aec0 20 20 20 20 61 73 73 65 72 74 28 20 62 21 3d 30      assert( b!=0
2aed0 20 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20 2f   ); .          /
2aee0 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
2aef0 66 20 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f 6e  f scanning a non
2af00 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20  -covering index 
2af10 69 73 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e 29  is (N+1)*log2(N)
2af20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68  .          ** wh
2af30 69 63 68 20 77 65 20 77 69 6c 6c 20 73 69 6d 70  ich we will simp
2af40 6c 69 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a 6c  lify to just N*l
2af50 6f 67 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20 20  og2(N) */.      
2af60 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2af70 20 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a   rSize + rLogSiz
2af80 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2af90 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2afa0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
2afb0 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
2afc0 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
2afd0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2afe0 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ..    rc = where
2aff0 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
2b000 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
2b010 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69  , pProbe, 0);.#i
2b020 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2b030 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 29 20 7c  _ENABLE_STAT4) |
2b040 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
2b050 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 0a 20  _ENABLE_STAT3). 
2b060 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50     sqlite3Stat4P
2b070 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65  robeFree(pBuilde
2b080 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42  r->pRec);.    pB
2b090 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
2b0a0 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c  d = 0;.    pBuil
2b0b0 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23  der->pRec = 0;.#
2b0c0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
2b0d0 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
2b0e0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
2b0f0 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20   then only that 
2b100 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20  one index is.   
2b110 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   ** considered. 
2b120 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  */.    if( pSrc-
2b130 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b  >pIndex ) break;
2b140 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2b150 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
2b160 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2b170 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20  TABLE./*.** Add 
2b180 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
2b190 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c  jects for a tabl
2b1a0 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64  e of the join id
2b1b0 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70  entified by.** p
2b1c0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
2b1d0 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65  Tab.  That table
2b1e0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2b1f0 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74  o be a virtual t
2b200 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
2b210 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
2b220 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
2b230 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
2b240 69 6c 64 65 72 20 20 20 2f 2a 20 57 48 45 52 45  ilder   /* WHERE
2b250 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
2b260 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ion */.){.  Wher
2b270 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2b280 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
2b290 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65  E analysis conte
2b2a0 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  xt */.  Parse *p
2b2b0 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
2b2c0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2b2d0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
2b2e0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
2b2f0 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  C;            /*
2b300 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
2b310 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
2b320 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
2b330 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
2b340 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
2b350 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65  earch */.  Table
2b360 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65   *pTab;.  sqlite
2b370 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33  3 *db;.  sqlite3
2b380 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
2b390 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  xInfo;.  struct 
2b3a0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
2b3b0 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f  nstraint *pIdxCo
2b3c0 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  ns;.  struct sql
2b3d0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
2b3e0 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
2b3f0 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
2b400 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
2b410 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d  , j;.  int iTerm
2b420 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20  , mxTerm;.  int 
2b430 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  nConstraint;.  i
2b440 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20  nt seenIn = 0;  
2b450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2b460 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65  rue if an IN ope
2b470 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f  rator is seen */
2b480 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d  .  int seenVar =
2b490 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2b4a0 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e  /* True if a non
2b4b0 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72  -constant constr
2b4c0 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a  aint is seen */.
2b4d0 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20    int iPhase;   
2b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b4f0 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49  * 0: const w/o I
2b500 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20  N, 1: const, 2: 
2b510 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f  no IN,  2: IN */
2b520 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
2b530 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ew;.  int rc = S
2b540 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49  QLITE_OK;..  pWI
2b550 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
2b560 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65  pWInfo;.  pParse
2b570 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
2b580 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
2b590 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70 42  ->db;.  pWC = pB
2b5a0 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
2b5b0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
2b5c0 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26  pNew;.  pSrc = &
2b5d0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2b5e0 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b  ->a[pNew->iTab];
2b5f0 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
2b600 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  pTab;.  assert( 
2b610 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
2b620 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20  );.  pIdxInfo = 
2b630 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66  allocateIndexInf
2b640 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  o(pParse, pWC, p
2b650 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  Src, pBuilder->p
2b660 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
2b670 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65  pIdxInfo==0 ) re
2b680 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2b690 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  M;.  pNew->prere
2b6a0 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72  q = 0;.  pNew->r
2b6b0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65  Setup = 0;.  pNe
2b6c0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
2b6d0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
2b6e0 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
2b6f0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
2b700 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
2b710 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64  ;.  pUsage = pId
2b720 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
2b730 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73  ntUsage;.  nCons
2b740 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66  traint = pIdxInf
2b750 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->nConstraint;.
2b760 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
2b770 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
2b780 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a  nConstraint) ){.
2b790 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2b7a0 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  e(db, pIdxInfo);
2b7b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2b7c0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
2b7d0 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69   for(iPhase=0; i
2b7e0 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65  Phase<=3; iPhase
2b7f0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65  ++){.    if( !se
2b800 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26  enIn && (iPhase&
2b810 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  1)!=0 ){.      i
2b820 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Phase++;.      i
2b830 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72  f( iPhase>3 ) br
2b840 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
2b850 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69  f( !seenVar && i
2b860 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b  Phase>1 ) break;
2b870 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
2b880 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
2b890 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
2b8a0 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
2b8b0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
2b8c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
2b8d0 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
2b8e0 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
2b8f0 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49  +){.      j = pI
2b900 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
2b910 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  set;.      pTerm
2b920 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
2b930 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68       switch( iPh
2b940 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ase ){.        c
2b950 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e  ase 0:    /* Con
2b960 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49  stants without I
2b970 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
2b980 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2b990 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ->usable = 0;.  
2b9a0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
2b9b0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2b9c0 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
2b9d0 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20           seenIn 
2b9e0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
2b9f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2ba00 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
2ba10 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t!=0 ){.        
2ba20 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b      seenVar = 1;
2ba30 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2ba40 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
2ba50 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d  erator & WO_IN)=
2ba60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2ba70 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
2ba80 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  le = 1;.        
2ba90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
2baa0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
2bab0 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74  e 1:    /* Const
2bac0 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65  ants with IN ope
2bad0 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  rators */.      
2bae0 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
2baf0 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  In );.          
2bb00 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
2bb10 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65   = (pTerm->prere
2bb20 71 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20  qRight==0);.    
2bb30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2bb40 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 20 20       case 2:    
2bb50 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74  /* Variables wit
2bb60 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20  hout IN */.     
2bb70 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
2bb80 6e 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20 20  nVar );.        
2bb90 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
2bba0 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70  le = (pTerm->eOp
2bbb0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d  erator & WO_IN)=
2bbc0 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  =0;.          br
2bbd0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66  eak;.        def
2bbe0 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69 61  ault:   /* Varia
2bbf0 62 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a  bles with IN */.
2bc00 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2bc10 28 20 73 65 65 6e 56 61 72 20 26 26 20 73 65 65  ( seenVar && see
2bc20 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nIn );.         
2bc30 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
2bc40 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
2bc50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2bc60 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
2bc70 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65  (pUsage, 0, size
2bc80 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49  of(pUsage[0])*pI
2bc90 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
2bca0 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49  int);.    if( pI
2bcb0 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
2bcc0 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74  eeIdxStr ) sqlit
2bcd0 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f  e3_free(pIdxInfo
2bce0 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70  ->idxStr);.    p
2bcf0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20  IdxInfo->idxStr 
2bd00 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
2bd10 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20  o->idxNum = 0;. 
2bd20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65     pIdxInfo->nee
2bd30 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
2bd40 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
2bd50 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
2bd60 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
2bd70 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
2bd80 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
2bd90 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a  BL / (double)2;.
2bda0 20 20 20 20 72 63 20 3d 20 76 74 61 62 42 65 73      rc = vtabBes
2bdb0 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
2bdc0 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  Tab, pIdxInfo);.
2bdd0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2bde0 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
2bdf0 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64  ab_exit;.    pId
2be00 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
2be10 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
2be20 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
2be30 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
2be40 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  nt;.    pNew->pr
2be50 65 72 65 71 20 3d 20 30 3b 0a 20 20 20 20 6d 78  ereq = 0;.    mx
2be60 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 61  Term = -1;.    a
2be70 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53  ssert( pNew->nLS
2be80 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  lot>=nConstraint
2be90 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
2bea0 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
2beb0 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72  i++) pNew->aLTer
2bec0 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  m[i] = 0;.    pN
2bed0 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  ew->u.vtab.omitM
2bee0 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ask = 0;.    for
2bef0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
2bf00 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f  int; i++, pIdxCo
2bf10 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ns++){.      if(
2bf20 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65   (iTerm = pUsage
2bf30 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20  [i].argvIndex - 
2bf40 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)>=0 ){.       
2bf50 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69   j = pIdxCons->i
2bf60 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
2bf70 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e      if( iTerm>=n
2bf80 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20  Constraint.     
2bf90 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20      || j<0.     
2bfa0 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e      || j>=pWC->n
2bfb0 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c  Term.         ||
2bfc0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54   pNew->aLTerm[iT
2bfd0 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20 20  erm]!=0.        
2bfe0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2bff0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2c000 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2c010 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2c020 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78  , "%s.xBestIndex
2c030 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c  () malfunction",
2c040 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
2c050 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68           goto wh
2c060 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65  ereLoopAddVtab_e
2c070 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xit;.        }. 
2c080 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2c090 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61   iTerm==nConstra
2c0a0 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  int-1 );.       
2c0b0 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
2c0c0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2c0d0 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65  ase( j==pWC->nTe
2c0e0 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  rm-1 );.        
2c0f0 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
2c100 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  j];.        pNew
2c110 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72  ->prereq |= pTer
2c120 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
2c130 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c140 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c  iTerm<pNew->nLSl
2c150 6f 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ot );.        pN
2c160 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d  ew->aLTerm[iTerm
2c170 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
2c180 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54     if( iTerm>mxT
2c190 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69  erm ) mxTerm = i
2c1a0 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 74 65  Term;.        te
2c1b0 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31  stcase( iTerm==1
2c1c0 35 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  5 );.        tes
2c1d0 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 36  tcase( iTerm==16
2c1e0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2c1f0 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61  iTerm<16 && pUsa
2c200 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65  ge[i].omit ) pNe
2c210 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
2c220 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a  sk |= 1<<iTerm;.
2c230 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
2c240 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2c250 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
2c260 20 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67         if( pUsag
2c270 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a  e[i].omit==0 ){.
2c280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2c290 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
2c2a0 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74   use an IN const
2c2b0 72 61 69 6e 74 20 69 66 20 74 68 65 20 76 69 72  raint if the vir
2c2c0 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20  tual table.     
2c2d0 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20 74         ** says t
2c2e0 68 61 74 20 74 68 65 20 65 71 75 69 76 61 6c 65  hat the equivale
2c2f0 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e 74  nt EQ constraint
2c300 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c   cannot be safel
2c310 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20  y omitted..     
2c320 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20         ** If we 
2c330 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  do attempt to us
2c340 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61  e such a constra
2c350 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d  int, some rows m
2c360 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 20 20  ight be.        
2c370 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64 20      ** repeated 
2c380 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20 2a  in the output. *
2c390 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  /.            br
2c3a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2c3b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  .          /* A 
2c3c0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
2c3d0 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
2c3e0 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73  d by an IN claus
2c3f0 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20  e may not.      
2c400 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74      ** consume t
2c410 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2c420 73 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74  se because (1) t
2c430 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74  he order of IN t
2c440 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20 2a  erms.          *
2c450 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  * is not necessa
2c460 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20  rily related to 
2c470 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74  the order of out
2c480 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20  put terms and.  
2c490 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d          ** (2) M
2c4a0 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20  ultiple outputs 
2c4b0 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e  from a single IN
2c4c0 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20   value will not 
2c4d0 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20 20 20  merge.          
2c4e0 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f  ** together.  */
2c4f0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49  .          pIdxI
2c500 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
2c510 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  umed = 0;.      
2c520 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2c530 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f  }.    if( i>=nCo
2c540 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
2c550 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2c560 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20 20   mxTerm+1;.     
2c570 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
2c580 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53  LTerm<=pNew->nLS
2c590 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  lot );.      pNe
2c5a0 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  w->u.vtab.idxNum
2c5b0 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78   = pIdxInfo->idx
2c5c0 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  Num;.      pNew-
2c5d0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
2c5e0 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65   = pIdxInfo->nee
2c5f0 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20  dToFreeIdxStr;. 
2c600 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e       pIdxInfo->n
2c610 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
2c620 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 0;.      pNew-
2c630 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d  >u.vtab.idxStr =
2c640 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74   pIdxInfo->idxSt
2c650 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  r;.      pNew->u
2c660 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20  .vtab.isOrdered 
2c670 3d 20 28 75 38 29 28 28 70 49 64 78 49 6e 66 6f  = (u8)((pIdxInfo
2c680 2d 3e 6e 4f 72 64 65 72 42 79 21 3d 30 29 0a 20  ->nOrderBy!=0). 
2c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6b0 20 20 20 20 26 26 20 70 49 64 78 49 6e 66 6f 2d      && pIdxInfo-
2c6c0 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
2c6d0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  );.      pNew->r
2c6e0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
2c6f0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77 68   pNew->rRun = wh
2c700 65 72 65 43 6f 73 74 46 72 6f 6d 44 6f 75 62 6c  ereCostFromDoubl
2c710 65 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  e(pIdxInfo->esti
2c720 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 20 20  matedCost);.    
2c730 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 76 65    /* TUNING: Eve
2c740 72 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ry virtual table
2c750 20 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 32   query returns 2
2c760 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  5 rows */.      
2c770 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 36 3b  pNew->nOut = 46;
2c780 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 77 68    assert( 46==wh
2c790 65 72 65 43 6f 73 74 28 32 35 29 20 29 3b 0a 20  ereCost(25) );. 
2c7a0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e       whereLoopIn
2c7b0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
2c7c0 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20  New);.      if( 
2c7d0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
2c7e0 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  dFree ){.       
2c7f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
2c800 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  ew->u.vtab.idxSt
2c810 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  r);.        pNew
2c820 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
2c830 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
2c840 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72     }.  }  ..wher
2c850 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69  eLoopAddVtab_exi
2c860 74 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  t:.  if( pIdxInf
2c870 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2c880 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72  Str ) sqlite3_fr
2c890 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  ee(pIdxInfo->idx
2c8a0 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
2c8b0 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e  bFree(db, pIdxIn
2c8c0 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  fo);.  return rc
2c8d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2c8e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2c8f0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
2c900 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65   Add WhereLoop e
2c910 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65  ntries to handle
2c920 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73   OR terms.  This
2c930 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65   works for eithe
2c940 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76  r.** btrees or v
2c950 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a  irtual tables..*
2c960 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
2c970 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65 72  reLoopAddOr(Wher
2c980 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2c990 75 69 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b 20  uilder, Bitmask 
2c9a0 6d 45 78 74 72 61 29 7b 0a 20 20 57 68 65 72 65  mExtra){.  Where
2c9b0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
2c9c0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
2c9d0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2c9e0 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
2c9f0 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54   *pNew;.  WhereT
2ca00 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43  erm *pTerm, *pWC
2ca10 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  End;.  int rc = 
2ca20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
2ca30 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c   iCur;.  WhereCl
2ca40 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57  ause tempWC;.  W
2ca50 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2ca60 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65  sSubBuild;.  Whe
2ca70 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43  reOrSet sSum, sC
2ca80 75 72 2c 20 73 50 72 65 76 3b 0a 20 20 73 74 72  ur, sPrev;.  str
2ca90 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2caa0 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57   *pItem;.  .  pW
2cab0 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
2cac0 43 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  C;.  if( pWInfo-
2cad0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2cae0 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20 72  ERE_AND_ONLY ) r
2caf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2cb00 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d  .  pWCEnd = pWC-
2cb10 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b  >a + pWC->nTerm;
2cb20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
2cb30 65 72 2d 3e 70 4e 65 77 3b 0a 0a 20 20 66 6f 72  er->pNew;..  for
2cb40 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
2cb50 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72  Term<pWCEnd && r
2cb60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54  c==SQLITE_OK; pT
2cb70 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
2cb80 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2cb90 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20  r & WO_OR)!=0.  
2cba0 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e     && (pTerm->u.
2cbb0 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
2cbc0 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  le & pNew->maskS
2cbd0 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  elf)!=0 .    ){.
2cbe0 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
2cbf0 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20  e * const pOrWC 
2cc00 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  = &pTerm->u.pOrI
2cc10 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57  nfo->wc;.      W
2cc20 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74  hereTerm * const
2cc30 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72   pOrWCEnd = &pOr
2cc40 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65  WC->a[pOrWC->nTe
2cc50 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65  rm];.      Where
2cc60 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20  Term *pOrTerm;. 
2cc70 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20       int once = 
2cc80 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20  1;.      int i, 
2cc90 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 70 49  j;.    .      pI
2cca0 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
2ccb0 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77  abList->a + pNew
2ccc0 2d 3e 69 54 61 62 3b 0a 20 20 20 20 20 20 69 43  ->iTab;.      iC
2ccd0 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
2cce0 73 6f 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42  sor;.      sSubB
2ccf0 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72  uild = *pBuilder
2cd00 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
2cd10 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  d.pOrderBy = 0;.
2cd20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
2cd30 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a  pOrSet = &sCur;.
2cd40 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65  .      for(pOrTe
2cd50 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72  rm=pOrWC->a; pOr
2cd60 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70  Term<pOrWCEnd; p
2cd70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
2cd80 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
2cd90 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2cda0 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  AND)!=0 ){.     
2cdb0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
2cdc0 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75  WC = &pOrTerm->u
2cdd0 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20  .pAndInfo->wc;. 
2cde0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2cdf0 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
2ce00 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20  rsor==iCur ){.  
2ce10 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
2ce20 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
2ce30 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74  nfo;.          t
2ce40 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70  empWC.pOuter = p
2ce50 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  WC;.          te
2ce60 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  mpWC.op = TK_AND
2ce70 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
2ce80 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20  WC.nTerm = 1;.  
2ce90 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61          tempWC.a
2cea0 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20   = pOrTerm;.    
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 74 65 6d 70 57 43 3b 0a 20  pWC = &tempWC;. 
2ced0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2cee0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2cef0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2cf00 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a      sCur.n = 0;.
2cf10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2cf20 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2cf30 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
2cf40 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
2cf50 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
2cf60 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2cf70 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42  ddVirtual(&sSubB
2cf80 75 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 20  uild);.         
2cf90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 43 75 72   for(i=0; i<sCur
2cfa0 2e 6e 3b 20 69 2b 2b 29 20 73 43 75 72 2e 61 5b  .n; i++) sCur.a[
2cfb0 69 5d 2e 70 72 65 72 65 71 20 7c 3d 20 6d 45 78  i].prereq |= mEx
2cfc0 74 72 61 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  tra;.        }el
2cfd0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
2cfe0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63    {.          rc
2cff0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
2d000 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64 2c  tree(&sSubBuild,
2d010 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   mExtra);.      
2d020 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2d030 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2d040 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29  K || sCur.n==0 )
2d050 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 43  ;.        if( sC
2d060 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ur.n==0 ){.     
2d070 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b       sSum.n = 0;
2d080 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2d090 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2d0a0 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20  if( once ){.    
2d0b0 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
2d0c0 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29 3b  e(&sSum, &sCur);
2d0d0 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20  .          once 
2d0e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
2d0f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
2d100 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76  ereOrMove(&sPrev
2d110 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20  , &sSum);.      
2d120 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a      sSum.n = 0;.
2d130 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
2d140 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b  0; i<sPrev.n; i+
2d150 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2d160 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e  for(j=0; j<sCur.
2d170 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
2d180 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e         whereOrIn
2d190 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65  sert(&sSum, sPre
2d1a0 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20  v.a[i].prereq | 
2d1b0 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71  sCur.a[j].prereq
2d1c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
2d1e0 65 72 65 43 6f 73 74 41 64 64 28 73 50 72 65 76  ereCostAdd(sPrev
2d1f0 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72  .a[i].rRun, sCur
2d200 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20  .a[j].rRun),.   
2d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d220 20 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6f           whereCo
2d230 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
2d240 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d  .nOut, sCur.a[j]
2d250 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20  .nOut));.       
2d260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d270 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2d280 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
2d290 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
2d2a0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
2d2b0 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
2d2c0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2d2d0 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  = WHERE_MULTI_OR
2d2e0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53  ;.      pNew->rS
2d2f0 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  etup = 0;.      
2d300 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
2d310 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   0;.      memset
2d320 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69  (&pNew->u, 0, si
2d330 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a  zeof(pNew->u));.
2d340 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72        for(i=0; r
2d350 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2d360 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a  i<sSum.n; i++){.
2d370 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
2d380 47 3a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20 33  G: Multiple by 3
2d390 2e 35 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  .5 for the secon
2d3a0 64 61 72 79 20 74 61 62 6c 65 20 6c 6f 6f 6b 75  dary table looku
2d3b0 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  p */.        pNe
2d3c0 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61  w->rRun = sSum.a
2d3d0 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 38 3b 0a 20  [i].rRun + 18;. 
2d3e0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
2d3f0 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f  t = sSum.a[i].nO
2d400 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ut;.        pNew
2d410 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d 2e  ->prereq = sSum.
2d420 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20  a[i].prereq;.   
2d430 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2d440 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
2d450 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
2d460 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
2d470 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2d480 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
2d490 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
2d4a0 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a   all tables .*/.
2d4b0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
2d4c0 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65  LoopAddAll(Where
2d4d0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
2d4e0 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49  ilder){.  WhereI
2d4f0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
2d500 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
2d510 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
2d520 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20   = 0;.  Bitmask 
2d530 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e  mPrior = 0;.  in
2d540 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73  t iTab;.  SrcLis
2d550 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
2d560 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
2d570 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2d580 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
2d590 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
2d5a0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
2d5b0 3b 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74  ;.  int nTabList
2d5c0 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
2d5d0 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  l;.  int rc = SQ
2d5e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70 72  LITE_OK;.  u8 pr
2d5f0 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30 3b  iorJoinType = 0;
2d600 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
2d610 65 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f  ew;..  /* Loop o
2d620 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69  ver the tables i
2d630 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d  n the join, from
2d640 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a   left to right *
2d650 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  /.  pNew = pBuil
2d660 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65  der->pNew;.  whe
2d670 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29  reLoopInit(pNew)
2d680 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20  ;.  for(iTab=0, 
2d690 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pItem=pTabList->
2d6a0 61 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69 73 74  a; iTab<nTabList
2d6b0 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b  ; iTab++, pItem+
2d6c0 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54  +){.    pNew->iT
2d6d0 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  ab = iTab;.    p
2d6e0 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20  New->maskSelf = 
2d6f0 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
2d700 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d  >sMaskSet, pItem
2d710 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2d720 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f 69  if( ((pItem->joi
2d730 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 54  ntype|priorJoinT
2d740 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c  ype) & (JT_LEFT|
2d750 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b  JT_CROSS))!=0 ){
2d760 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20  .      mExtra = 
2d770 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  mPrior;.    }.  
2d780 20 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20    priorJoinType 
2d790 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  = pItem->jointyp
2d7a0 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  e;.    if( IsVir
2d7b0 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62  tual(pItem->pTab
2d7c0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2d7d0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
2d7e0 75 61 6c 28 70 42 75 69 6c 64 65 72 29 3b 0a 20  ual(pBuilder);. 
2d7f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d800 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2d810 64 42 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c  dBtree(pBuilder,
2d820 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a   mExtra);.    }.
2d830 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2d840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2d850 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2d860 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78  Or(pBuilder, mEx
2d870 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
2d880 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e  mPrior |= pNew->
2d890 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66  maskSelf;.    if
2d8a0 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  ( rc || db->mall
2d8b0 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b  ocFailed ) break
2d8c0 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f  ;.  }.  whereLoo
2d8d0 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77 29  pClear(db, pNew)
2d8e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2d8f0 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20  ../*.** Examine 
2d900 61 20 57 68 65 72 65 50 61 74 68 20 28 77 69 74  a WherePath (wit
2d910 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f  h the addition o
2d920 66 20 74 68 65 20 65 78 74 72 61 20 57 68 65 72  f the extra Wher
2d930 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74 68  eLoop of the 5th
2d940 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20  .** parameters) 
2d950 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75 74  to see if it out
2d960 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65  puts rows in the
2d970 20 72 65 71 75 65 73 74 65 64 20 4f 52 44 45 52   requested ORDER
2d980 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50   BY.** (or GROUP
2d990 20 42 59 29 20 77 69 74 68 6f 75 74 20 72 65 71   BY) without req
2d9a0 75 69 72 69 6e 67 20 61 20 73 65 70 61 72 61 74  uiring a separat
2d9b0 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e  e sort operation
2d9c0 2e 20 20 52 65 74 75 72 6e 3a 0a 2a 2a 20 0a 2a  .  Return:.** .*
2d9d0 2a 20 20 20 20 30 3a 20 20 4f 52 44 45 52 20 42  *    0:  ORDER B
2d9e0 59 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69  Y is not satisfi
2d9f0 65 64 2e 20 20 53 6f 72 74 69 6e 67 20 72 65 71  ed.  Sorting req
2da00 75 69 72 65 64 0a 2a 2a 20 20 20 20 31 3a 20 20  uired.**    1:  
2da10 4f 52 44 45 52 20 42 59 20 69 73 20 73 61 74 69  ORDER BY is sati
2da20 73 66 69 65 64 2e 20 20 20 20 20 20 4f 6d 69 74  sfied.      Omit
2da30 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 20 20 2d 31   sorting.**   -1
2da40 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61 74 20 74 68  :  Unknown at th
2da50 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 4e 6f  is time.**.** No
2da60 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73 69  te that processi
2da70 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f  ng for WHERE_GRO
2da80 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44  UPBY and WHERE_D
2da90 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74  ISTINCTBY is not
2daa0 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20   as.** strict.  
2dab0 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e  With GROUP BY an
2dac0 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f  d DISTINCT the o
2dad0 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20  nly requirement 
2dae0 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76  is that.** equiv
2daf0 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61  alent rows appea
2db00 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64  r immediately ad
2db10 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e  jacent to one an
2db20 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59  other.  GROUP BY
2db30 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 54 20  .** and DISTINT 
2db40 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 72  do not require r
2db50 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20 69 6e  ows to appear in
2db60 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
2db70 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a  order as long.**
2db80 20 61 73 20 65 71 75 69 76 65 6c 65 6e 74 20 72   as equivelent r
2db90 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65 64 20  ows are grouped 
2dba0 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73 20  together.  Thus 
2dbb0 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e 64  for GROUP BY and
2dbc0 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65   DISTINCT.** the
2dbd0 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20   pOrderBy terms 
2dbe0 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20 69  can be matched i
2dbf0 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57 69  n any order.  Wi
2dc00 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  th ORDER BY, the
2dc10 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74 65   .** pOrderBy te
2dc20 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74 63  rms must be matc
2dc30 68 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c 65  hed in strict le
2dc40 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64 65  ft-to-right orde
2dc50 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2dc60 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
2dc70 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68  iesOrderBy(.  Wh
2dc80 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
2dc90 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2dca0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
2dcb0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2dcc0 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f     /* ORDER BY o
2dcd0 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49  r GROUP BY or DI
2dce0 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f  STINCT clause to
2dcf0 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72   check */.  Wher
2dd00 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20  ePath *pPath,   
2dd10 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61    /* The WherePa
2dd20 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  th to check */. 
2dd30 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
2dd40 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20         /* Might 
2dd50 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47 52  contain WHERE_GR
2dd60 4f 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f 44  OUPBY or WHERE_D
2dd70 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75  ISTINCTBY */.  u
2dd80 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20  16 nLoop,       
2dd90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2dda0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61  f entries in pPa
2ddb0 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  th->aLoop[] */. 
2ddc0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
2ddd0 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  t,     /* Add th
2dde0 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  is WhereLoop to 
2ddf0 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68  the end of pPath
2de00 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42  ->aLoop[] */.  B
2de10 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b  itmask *pRevMask
2de20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73       /* OUT: Mas
2de30 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20  k of WhereLoops 
2de40 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73  to run in revers
2de50 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20  e order */.){.  
2de60 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20  u8 revSet;      
2de70 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2de80 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f   rev is known */
2de90 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20  .  u8 rev;      
2dea0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
2deb0 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72  osite sort order
2dec0 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b   */.  u8 revIdx;
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2dee0 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20  ndex sort order 
2def0 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44  */.  u8 isOrderD
2df00 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c  istinct;   /* Al
2df10 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f  l prior WhereLoo
2df20 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73  ps are order-dis
2df30 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69  tinct */.  u8 di
2df40 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20  stinctColumns;  
2df50 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
2df60 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20  loop has UNIQUE 
2df70 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
2df80 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68   */.  u8 isMatch
2df90 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
2dfa0 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61  Column matches a
2dfb0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
2dfc0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2dfd0 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20    u16 nColumn;  
2dfe0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2dff0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
2e000 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20  pIndex */.  u16 
2e010 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
2e020 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d    /* Number term
2e030 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
2e040 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
2e050 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t iLoop;        
2e060 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2e070 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61  WhereLoop in pPa
2e080 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  th being process
2e090 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  ed */.  int i, j
2e0a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2e0b0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2e0c0 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  /.  int iCur;   
2e0d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2e0e0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63  sor number for c
2e0f0 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
2e100 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
2e110 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  n;          /* A
2e120 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77   column number w
2e130 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72  ithin table iCur
2e140 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
2e150 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43  *pLoop = 0; /* C
2e160 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
2e170 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
2e180 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  . */.  WhereTerm
2e190 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20   *pTerm;     /* 
2e1a0 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
2e1b0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2e1c0 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42  e */.  Expr *pOB
2e1d0 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  Expr;        /* 
2e1e0 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  An expression fr
2e1f0 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  om the ORDER BY 
2e200 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c  clause */.  Coll
2e210 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
2e220 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e    /* COLLATE fun
2e230 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52  ction from an OR
2e240 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
2e250 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  rm */.  Index *p
2e260 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a  Index;        /*
2e270 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63   The index assoc
2e280 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70  iated with pLoop
2e290 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
2e2a0 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
2e2b0 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
2e2c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2e2d0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53  */.  Bitmask obS
2e2e0 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61  at = 0;    /* Ma
2e2f0 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  sk of ORDER BY t
2e300 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73  erms satisfied s
2e310 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61  o far */.  Bitma
2e320 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20  sk obDone;      
2e330 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
2e340 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
2e350 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65  /.  Bitmask orde
2e360 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20  rDistinctMask;  
2e370 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77  /* Mask of all w
2e380 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70  ell-ordered loop
2e390 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72  s */.  Bitmask r
2e3a0 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20  eady;           
2e3b0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e     /* Mask of in
2e3c0 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20  ner loops */..  
2e3d0 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74  /*.  ** We say t
2e3e0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  he WhereLoop is 
2e3f0 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20  "one-row" if it 
2e400 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72  generates no mor
2e410 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20  e than one.  ** 
2e420 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20  row of output.  
2e430 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f  A WhereLoop is o
2e440 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66  ne-row if all of
2e450 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
2e460 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28  re true:.  **  (
2e470 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c  a) All index col
2e480 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20  umns match with 
2e490 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e  WHERE_COLUMN_EQ.
2e4a0 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69  .  **  (b) The i
2e4b0 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20  ndex is unique. 
2e4c0 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f   ** Any WhereLoo
2e4d0 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f  p with an WHERE_
2e4e0 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72  COLUMN_EQ constr
2e4f0 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69  aint on the rowi
2e500 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20  d is one-row..  
2e510 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77  ** Every one-row
2e520 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20   WhereLoop will 
2e530 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f  have the WHERE_O
2e540 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e  NEROW bit set in
2e550 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20   wsFlags..  **. 
2e560 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57   ** We say the W
2e570 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64  hereLoop is "ord
2e580 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20  er-distinct" if 
2e590 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d  the set of colum
2e5a0 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61  ns from.  ** tha
2e5b0 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  t WhereLoop that
2e5c0 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45   are in the ORDE
2e5d0 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
2e5e0 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
2e5f0 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ery.  ** row of 
2e600 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20  the WhereLoop.  
2e610 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68  Every one-row Wh
2e620 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d  ereLoop is autom
2e630 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72  atically.  ** or
2e640 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20  der-distinct.   
2e650 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  A WhereLoop that
2e660 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20   has no columns 
2e670 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
2e680 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e  clause.  ** is n
2e690 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ot order-distinc
2e6a0 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  t. To be order-d
2e6b0 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71  istinct is not q
2e6c0 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73  uite the same as
2e6d0 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51   being.  ** UNIQ
2e6e0 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55  UE since a UNIQU
2e6f0 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65  E column or inde
2e700 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  x can have multi
2e710 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20  ple rows that . 
2e720 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64   ** are NULL and
2e730 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
2e740 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20   equivalent for 
2e750 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f  the purpose of o
2e760 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
2e770 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d   ** To be order-
2e780 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f  distinct, the co
2e790 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e  lumns must be UN
2e7a0 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
2e7b0 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  L..  **.  ** The
2e7c0 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62   rowid for a tab
2e7d0 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49  le is always UNI
2e7e0 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
2e7f0 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65   so whenever the
2e800 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65  .  ** rowid appe
2e810 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  ars in the ORDER
2e820 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20   BY clause, the 
2e830 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
2e840 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20  ereLoop is.  ** 
2e850 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72  automatically or
2e860 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
2e870 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  */..  assert( pO
2e880 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 0a 20 20  rderBy!=0 );..  
2e890 2f 2a 20 53 6f 72 74 61 62 69 6c 69 74 79 20 6f  /* Sortability o
2e8a0 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  f virtual tables
2e8b0 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
2e8c0 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
2e8d0 20 6d 65 74 68 6f 64 0a 20 20 2a 2a 20 6f 66 20   method.  ** of 
2e8e0 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
2e8f0 65 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 69 66  e itself */.  if
2e900 28 20 70 4c 61 73 74 2d 3e 77 73 46 6c 61 67 73  ( pLast->wsFlags
2e910 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
2e920 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 74 65 73  TABLE ){.    tes
2e930 74 63 61 73 65 28 20 6e 4c 6f 6f 70 3e 30 20 29  tcase( nLoop>0 )
2e940 3b 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20  ;  /* True when 
2e950 6f 75 74 65 72 20 6c 6f 6f 70 73 20 61 72 65 20  outer loops are 
2e960 6f 6e 65 2d 72 6f 77 20 61 6e 64 20 6d 61 74 63  one-row and matc
2e970 68 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h .             
2e980 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2e990 6e 6f 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  no ORDER BY term
2e9a0 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
2e9b0 70 4c 61 73 74 2d 3e 75 2e 76 74 61 62 2e 69 73  pLast->u.vtab.is
2e9c0 4f 72 64 65 72 65 64 3b 0a 20 20 7d 0a 20 20 69  Ordered;.  }.  i
2e9d0 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69  f( nLoop && Opti
2e9e0 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
2e9f0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65  (db, SQLITE_Orde
2ea00 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65  rByIdxJoin) ) re
2ea10 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65  turn 0;..  nOrde
2ea20 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  rBy = pOrderBy->
2ea30 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73  nExpr;.  testcas
2ea40 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53  e( nOrderBy==BMS
2ea50 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64  -1 );.  if( nOrd
2ea60 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74  erBy>BMS-1 ) ret
2ea70 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f  urn 0;  /* Canno
2ea80 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c  t optimize overl
2ea90 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59  y large ORDER BY
2eaa0 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69  s */.  isOrderDi
2eab0 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62  stinct = 1;.  ob
2eac0 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e  Done = MASKBIT(n
2ead0 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72  OrderBy)-1;.  or
2eae0 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20  derDistinctMask 
2eaf0 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30  = 0;.  ready = 0
2eb00 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  ;.  for(iLoop=0;
2eb10 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2eb20 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65   && obSat<obDone
2eb30 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70   && iLoop<=nLoop
2eb40 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
2eb50 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65  if( iLoop>0 ) re
2eb60 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61  ady |= pLoop->ma
2eb70 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f  skSelf;.    pLoo
2eb80 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20  p = iLoop<nLoop 
2eb90 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  ? pPath->aLoop[i
2eba0 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20  Loop] : pLast;. 
2ebb0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
2ebc0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2ebd0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
2ebe0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 43 75 72 20  ==0 );.    iCur 
2ebf0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2ec00 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61  st->a[pLoop->iTa
2ec10 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20  b].iCursor;..   
2ec20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
2ec30 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 58   ORDER BY term X
2ec40 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d   that is a colum
2ec50 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  n in the table o
2ec60 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  f.    ** the cur
2ec70 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68  rent loop for wh
2ec80 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65 72  ich there is ter
2ec90 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20  m in the WHERE. 
2eca0 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
2ecb0 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55  the form X IS NU
2ecc0 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72  LL or X=? that r
2ecd0 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75  eference only ou
2ece0 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73  ter.    ** loops
2ecf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
2ed00 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
2ed10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
2ed20 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
2ed30 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
2ed40 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d  .      pOBExpr =
2ed50 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
2ed60 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
2ed70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
2ed80 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
2ed90 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
2eda0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2edb0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
2edc0 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f  Table!=iCur ) co
2edd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54  ntinue;.      pT
2ede0 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26  erm = findTerm(&
2edf0 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75  pWInfo->sWC, iCu
2ee00 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  r, pOBExpr->iCol
2ee10 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  umn,.           
2ee20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65 61              ~rea
2ee30 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e  dy, WO_EQ|WO_ISN
2ee40 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ULL, 0);.      i
2ee50 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f  f( pTerm==0 ) co
2ee60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
2ee70 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
2ee80 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 26 26  tor&WO_EQ)!=0 &&
2ee90 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
2eea0 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
2eeb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20  const char *z1, 
2eec0 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  *z2;.        pCo
2eed0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2eee0 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
2eef0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
2ef00 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
2ef10 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
2ef20 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
2ef30 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2ef40 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a     z1 = pColl->z
2ef50 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43  Name;.        pC
2ef60 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2ef70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
2ef80 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  >pParse, pTerm->
2ef90 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2efa0 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
2efb0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
2efc0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d  ll;.        z2 =
2efd0 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
2efe0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2eff0 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
2f000 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2f010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f  .      }.      o
2f020 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
2f030 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  i);.    }..    i
2f040 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
2f050 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
2f060 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  W)==0 ){.      i
2f070 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
2f080 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b  s & WHERE_IPK ){
2f090 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20  .        pIndex 
2f0a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  = 0;.        nCo
2f0b0 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  lumn = 0;.      
2f0c0 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64 65  }else if( (pInde
2f0d0 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
2f0e0 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c  ee.pIndex)==0 ||
2f0f0 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
2f100 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  red ){.        r
2f110 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
2f120 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 43  else{.        nC
2f130 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
2f140 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  nColumn;.       
2f150 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2f160 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72   = pIndex->onErr
2f170 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 20  or!=OE_None;.   
2f180 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c     }..      /* L
2f190 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
2f1a0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
2f1b0 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69  ndex and deal wi
2f1c0 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20  th the ones.    
2f1d0 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f    ** that are no
2f1e0 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  t constrained by
2f1f0 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20   == or IN..     
2f200 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20   */.      rev = 
2f210 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20  revSet = 0;.    
2f220 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
2f230 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  s = 0;.      for
2f240 28 6a 3d 30 3b 20 6a 3c 3d 6e 43 6f 6c 75 6d 6e  (j=0; j<=nColumn
2f250 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2f260 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54  u8 bOnce;   /* T
2f270 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f  rue to run the O
2f280 52 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c  RDER BY search l
2f290 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  oop */..        
2f2a0 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20  /* Skip over == 
2f2b0 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d  and IS NULL term
2f2c0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
2f2d0 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   j<pLoop->u.btre
2f2e0 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26  e.nEq.         &
2f2f0 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61  & ((i = pLoop->a
2f300 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61  LTerm[j]->eOpera
2f310 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f  tor) & (WO_EQ|WO
2f320 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20 20  _ISNULL))!=0.   
2f330 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2f340 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53 4e    if( i & WO_ISN
2f350 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
2f360 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
2f370 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a  rderDistinct );.
2f380 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
2f390 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
2f3a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f3b0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2f3c0 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20    .        }..  
2f3d0 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65        /* Get the
2f3e0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
2f3f0 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f  n the table (iCo
2f400 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f  lumn) and sort o
2f410 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rder.        ** 
2f420 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68 65  (revIdx) for the
2f430 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   j-th column of 
2f440 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
2f450 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2f460 28 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  ( j<nColumn ){. 
2f470 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d           /* Norm
2f480 61 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  al index columns
2f490 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 43   */.          iC
2f4a0 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
2f4b0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
2f4c0 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
2f4d0 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
2f4e0 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  er[j];.         
2f4f0 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
2f500 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50  ndex->pTable->iP
2f510 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20  Key ) iColumn = 
2f520 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
2f530 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2f540 54 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  The ROWID column
2f550 20 61 74 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20   at the end */. 
2f560 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2f570 20 6a 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20   j==nColumn );. 
2f580 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
2f590 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
2f5a0 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20   revIdx = 0;.   
2f5b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2f5c0 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69  /* An unconstrai
2f5d0 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ned column that 
2f5e0 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65  might be NULL me
2f5f0 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20 20  ans that this.  
2f600 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f        ** WhereLo
2f610 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f  op is not well-o
2f620 72 64 65 72 65 64 20 0a 20 20 20 20 20 20 20 20  rdered .        
2f630 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
2f640 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20  sOrderDistinct. 
2f650 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75          && iColu
2f660 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26  mn>=0.         &
2f670 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  & j>=pLoop->u.bt
2f680 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
2f690 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62   && pIndex->pTab
2f6a0 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
2f6b0 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20  ].notNull==0.   
2f6c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2f6d0 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2f6e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
2f6f0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e  ..        /* Fin
2f700 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  d the ORDER BY t
2f710 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70  erm that corresp
2f720 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68  onds to the j-th
2f730 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20   column.        
2f740 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
2f750 61 6e 64 20 61 6e 64 20 6d 61 72 6b 20 74 68 61  and and mark tha
2f760 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  t ORDER BY term 
2f770 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  off .        */.
2f780 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20          bOnce = 
2f790 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74  1;.        isMat
2f7a0 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
2f7b0 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26  for(i=0; bOnce &
2f7c0 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  & i<nOrderBy; i+
2f7d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2f7e0 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
2f7f0 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
2f800 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78  .          pOBEx
2f810 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
2f820 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
2f830 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2f840 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
2f850 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
2f860 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
2f870 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  Y );.          t
2f880 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
2f890 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
2f8a0 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20  INCTBY );.      
2f8b0 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
2f8c0 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f  ags & (WHERE_GRO
2f8d0 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49  UPBY|WHERE_DISTI
2f8e0 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e  NCTBY))==0 ) bOn
2f8f0 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
2f900 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
2f910 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
2f920 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2f930 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2f940 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
2f950 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2f960 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2f970 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
2f980 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2f990 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
2f9a0 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn>=0 ){.       
2f9b0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2f9c0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2f9d0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
2f9e0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2f9f0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
2fa00 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
2fa10 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
2fa20 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  tColl;.         
2fa30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
2fa40 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
2fa50 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  me, pIndex->azCo
2fa60 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74  ll[j])!=0 ) cont
2fa70 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2fa80 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61  }.          isMa
2fa90 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  tch = 1;.       
2faa0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2fab0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2fac0 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  isMatch ){.     
2fad0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
2fae0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2faf0 20 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74    testcase( dist
2fb00 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29  inctColumns==0 )
2fb10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69  ;.            di
2fb20 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
2fb30 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
2fb40 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c           obSat |
2fb50 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
2fb60 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 49          if( (pWI
2fb70 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2fb80 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29  & WHERE_GROUPBY)
2fb90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2fba0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
2fbb0 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69  the sort order i
2fbc0 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20  s compatible in 
2fbd0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
2fbe0 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
2fbf0 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73  ** Sort order is
2fc00 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20   irrelevant for 
2fc10 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
2fc20 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
2fc30 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a    if( revSet ){.
2fc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2fc50 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29  ( (rev ^ revIdx)
2fc60 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  !=pOrderBy->a[i]
2fc70 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74  .sortOrder ) ret
2fc80 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20  urn 0;.         
2fc90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fca0 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65          rev = re
2fcb0 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d  vIdx ^ pOrderBy-
2fcc0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
2fcd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2fce0 66 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61  f( rev ) *pRevMa
2fcf0 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c  sk |= MASKBIT(iL
2fd00 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oop);.          
2fd10 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a      revSet = 1;.
2fd20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2fd30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fd40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2fd50 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66     /* No match f
2fd60 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
2fd70 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c    if( j==0 || j<
2fd80 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
2fd90 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2fda0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2fdb0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
2fdc0 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2fdd0 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
2fde0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
2fdf0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2fe00 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f       } /* end Lo
2fe10 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65  op over all inde
2fe20 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  x columns */.   
2fe30 20 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43     if( distinctC
2fe40 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20  olumns ){.      
2fe50 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
2fe60 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29  derDistinct==0 )
2fe70 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65  ;.        isOrde
2fe80 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20  rDistinct = 1;. 
2fe90 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20       }.    } /* 
2fea0 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72  end-if not one-r
2feb0 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61  ow */..    /* Ma
2fec0 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72  rk off any other
2fed0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
2fee0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 70  that reference p
2fef0 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20  Loop */.    if( 
2ff00 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2ff10 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69  ){.      orderDi
2ff20 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c  stinctMask |= pL
2ff30 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
2ff40 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2ff50 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
2ff60 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b          Expr *p;
2ff70 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53  .        if( MAS
2ff80 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
2ff90 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2ffa0 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79      p = pOrderBy
2ffb0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
2ffc0 20 20 20 20 20 20 69 66 28 20 28 65 78 70 72 54        if( (exprT
2ffd0 61 62 6c 65 55 73 61 67 65 28 26 70 57 49 6e 66  ableUsage(&pWInf
2ffe0 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 29 26  o->sMaskSet, p)&
2fff0 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61  ~orderDistinctMa
30000 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
30010 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
30020 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
30030 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
30040 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20  .  } /* End the 
30050 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68  loop over all Wh
30060 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75  ereLoops from ou
30070 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f  ter-most down to
30080 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20   inner-most */. 
30090 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f   if( obSat==obDo
300a0 6e 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ne ) return 1;. 
300b0 20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73   if( !isOrderDis
300c0 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
300d0 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ;.  return -1;.}
300e0 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
300f0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46  ACE_ENABLED./* F
30100 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  or debugging use
30110 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63   only: */.static
30120 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65   const char *whe
30130 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65  rePathName(Where
30140 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74  Path *pPath, int
30150 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f   nLoop, WhereLoo
30160 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61  p *pLast){.  sta
30170 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36  tic char zName[6
30180 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  5];.  int i;.  f
30190 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b  or(i=0; i<nLoop;
301a0 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20   i++){ zName[i] 
301b0 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
301c0 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20  ]->cId; }.  if( 
301d0 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b  pLast ) zName[i+
301e0 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b  +] = pLast->cId;
301f0 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b  .  zName[i] = 0;
30200 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
30210 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
30220 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74  * Given the list
30230 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62   of WhereLoop ob
30240 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d  jects at pWInfo-
30250 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f  >pLoops, this ro
30260 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74  utine.** attempt
30270 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f  s to find the lo
30280 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74  west cost path t
30290 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20  hat visits each 
302a0 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63  WhereLoop.** onc
302b0 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73  e.  This path is
302c0 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74   then loaded int
302d0 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b  o the pWInfo->a[
302e0 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e  ].pWLoop fields.
302f0 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68  .**.** Assume th
30300 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  at the total num
30310 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
30320 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65  ws that will nee
30330 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a  d to be sorted.*
30340 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73  * will be nRowEs
30350 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67  t (in the 10*log
30360 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  2 representation
30370 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73  ).  Or, ignore s
30380 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20  orting.** costs 
30390 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a  if nRowEst==0..*
303a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
303b0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
303c0 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
303d0 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   of a memory all
303e0 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72  ocation.** error
303f0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
30400 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68  ic int wherePath
30410 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f  Solver(WhereInfo
30420 20 2a 70 57 49 6e 66 6f 2c 20 57 68 65 72 65 43   *pWInfo, WhereC
30430 6f 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20  ost nRowEst){.  
30440 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20  int mxChoice;   
30450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
30460 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
30470 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68  imultaneous path
30480 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69  s tracked */.  i
30490 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt nLoop;       
304a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
304b0 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
304c0 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72  he join */.  Par
304d0 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
304e0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
304f0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
30500 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
30510 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30520 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
30530 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  ion */.  int iLo
30540 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
30550 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
30560 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d  er over the term
30570 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
30580 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20  .  int ii, jj;  
30590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
305a0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
305b0 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 43 6f  .  WhereCost rCo
305c0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
305d0 2f 2a 20 43 6f 73 74 20 6f 66 20 61 20 70 61 74  /* Cost of a pat
305e0 68 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  h */.  WhereCost
305f0 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20   mxCost = 0;    
30600 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63      /* Maximum c
30610 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20  ost of a set of 
30620 70 61 74 68 73 20 2a 2f 0a 20 20 57 68 65 72 65  paths */.  Where
30630 43 6f 73 74 20 72 53 6f 72 74 43 6f 73 74 3b 20  Cost rSortCost; 
30640 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
30650 74 6f 20 64 6f 20 61 20 73 6f 72 74 20 2a 2f 0a  to do a sort */.
30660 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d    int nTo, nFrom
30670 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
30680 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65  umber of valid e
30690 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20  ntries in aTo[] 
306a0 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20  and aFrom[] */. 
306b0 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f   WherePath *aFro
306c0 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  m;         /* Al
306d0 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74  l nFrom paths at
306e0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65   the previous le
306f0 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
30700 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20  th *aTo;        
30710 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65     /* The nTo be
30720 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20  st paths at the 
30730 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f  current level */
30740 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46  .  WherePath *pF
30750 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
30760 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46  An element of aF
30770 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72  rom[] that we ar
30780 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
30790 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f    WherePath *pTo
307a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
307b0 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f  n element of aTo
307c0 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
307d0 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
307e0 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70  hereLoop *pWLoop
307f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
30800 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
30810 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68   objects */.  Wh
30820 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20  ereLoop **pX;   
30830 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
30840 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70  to divy up the p
30850 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  Space memory */.
30860 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20    char *pSpace; 
30870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30880 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
30890 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  used by this rou
308a0 74 69 6e 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73  tine */..  pPars
308b0 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
308c0 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
308d0 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d  e->db;.  nLoop =
308e0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b   pWInfo->nLevel;
308f0 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f  .  /* TUNING: Fo
30900 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73  r simple queries
30910 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20  , only the best 
30920 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e  path is tracked.
30930 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20  .  ** For 2-way 
30940 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73  joins, the 5 bes
30950 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c  t paths are foll
30960 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a  owed..  ** For j
30970 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72  oins of 3 or mor
30980 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20  e tables, track 
30990 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68  the 10 best path
309a0 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20  s */.  mxChoice 
309b0 3d 20 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20 31  = (nLoop==1) ? 1
309c0 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35   : (nLoop==2 ? 5
309d0 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74   : 10);.  assert
309e0 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d  ( nLoop<=pWInfo-
309f0 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  >pTabList->nSrc 
30a00 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  );.  WHERETRACE(
30a10 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65  0x002, ("---- be
30a20 67 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 29 3b  gin solver\n"));
30a30 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
30a40 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73  and initialize s
30a50 70 61 63 65 20 66 6f 72 20 61 54 6f 20 61 6e 64  pace for aTo and
30a60 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d   aFrom */.  ii =
30a70 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61   (sizeof(WherePa
30a80 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65  th)+sizeof(Where
30a90 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78  Loop*)*nLoop)*mx
30aa0 43 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53 70 61  Choice*2;.  pSpa
30ab0 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ce = sqlite3DbMa
30ac0 6c 6c 6f 63 52 61 77 28 64 62 2c 20 69 69 29 3b  llocRaw(db, ii);
30ad0 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30  .  if( pSpace==0
30ae0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
30af0 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20  _NOMEM;.  aTo = 
30b00 28 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61  (WherePath*)pSpa
30b10 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54  ce;.  aFrom = aT
30b20 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65  o+mxChoice;.  me
30b30 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73  mset(aFrom, 0, s
30b40 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29  izeof(aFrom[0]))
30b50 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c  ;.  pX = (WhereL
30b60 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43  oop**)(aFrom+mxC
30b70 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69  hoice);.  for(ii
30b80 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72  =mxChoice*2, pFr
30b90 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69  om=aTo; ii>0; ii
30ba0 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20  --, pFrom++, pX 
30bb0 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70  += nLoop){.    p
30bc0 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58  From->aLoop = pX
30bd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 64  ;.  }..  /* Seed
30be0 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74 68   the search with
30bf0 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50   a single WhereP
30c00 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a  ath containing z
30c10 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a  ero WhereLoops..
30c20 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47    **.  ** TUNING
30c30 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  : Do not let the
30c40 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61   number of itera
30c50 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32  tions go above 2
30c60 35 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a  5.  If the cost.
30c70 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e    ** of computin
30c80 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
30c90 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64  ndex is not paid
30ca0 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65   back within the
30cb0 20 66 69 72 73 74 20 32 35 0a 20 20 2a 2a 20 72   first 25.  ** r
30cc0 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ows, then do not
30cd0 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74   use the automat
30ce0 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61  ic index. */.  a
30cf0 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d  From[0].nRow = M
30d00 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  IN(pParse->nQuer
30d10 79 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73 73  yLoop, 46);  ass
30d20 65 72 74 28 20 34 36 3d 3d 77 68 65 72 65 43 6f  ert( 46==whereCo
30d30 73 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72 6f  st(25) );.  nFro
30d40 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50 72 65  m = 1;..  /* Pre
30d50 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 73 74  compute the cost
30d60 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20   of sorting the 
30d70 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 65 74  final result set
30d80 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 0a  , if the caller.
30d90 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 57    ** to sqlite3W
30da0 68 65 72 65 42 65 67 69 6e 28 29 20 77 61 73 20  hereBegin() was 
30db0 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20  concerned about 
30dc0 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 72 53 6f  sorting */.  rSo
30dd0 72 74 43 6f 73 74 20 3d 20 30 3b 0a 20 20 69 66  rtCost = 0;.  if
30de0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
30df0 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74  By==0 || nRowEst
30e00 3d 3d 30 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d  ==0 ){.    aFrom
30e10 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 56 61 6c  [0].isOrderedVal
30e20 69 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  id = 1;.  }else{
30e30 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  .    /* TUNING: 
30e40 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f  Estimated cost o
30e50 66 20 73 6f 72 74 69 6e 67 20 69 73 20 4e 2a 6c  f sorting is N*l
30e60 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
30e70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  s the.    ** num
30e80 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
30e90 77 73 2e 20 2a 2f 0a 20 20 20 20 72 53 6f 72 74  ws. */.    rSort
30ea0 43 6f 73 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b  Cost = nRowEst +
30eb0 20 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73 74 29   estLog(nRowEst)
30ec0 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
30ed0 28 30 78 30 30 32 2c 28 22 2d 2d 2d 2d 20 73 6f  (0x002,("---- so
30ee0 72 74 20 63 6f 73 74 3d 25 2d 33 64 5c 6e 22 2c  rt cost=%-3d\n",
30ef0 20 72 53 6f 72 74 43 6f 73 74 29 29 3b 0a 20 20   rSortCost));.  
30f00 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
30f10 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e  successively lon
30f20 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75  ger WherePaths u
30f30 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75  sing the previou
30f40 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a  s generation.  *
30f50 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20  * of WherePaths 
30f60 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72  as the basis for
30f70 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70   the next.  Keep
30f80 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78   track of the mx
30f90 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74  Choice.  ** best
30fa0 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67   paths at each g
30fb0 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66  eneration */.  f
30fc0 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
30fd0 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
30fe0 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a  ){.    nTo = 0;.
30ff0 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46      for(ii=0, pF
31000 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46  rom=aFrom; ii<nF
31010 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d  rom; ii++, pFrom
31020 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  ++){.      for(p
31030 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  WLoop=pWInfo->pL
31040 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57  oops; pWLoop; pW
31050 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65  Loop=pWLoop->pNe
31060 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20  xtLoop){.       
31070 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77   Bitmask maskNew
31080 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
31090 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20  k revMask = 0;. 
310a0 20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65         u8 isOrde
310b0 72 65 64 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d  redValid = pFrom
310c0 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
310d0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69 73 4f  ;.        u8 isO
310e0 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e  rdered = pFrom->
310f0 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
31100 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e     if( (pWLoop->
31110 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d  prereq & ~pFrom-
31120 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
31130 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
31140 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d    if( (pWLoop->m
31150 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d  askSelf & pFrom-
31160 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
31170 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
31180 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
31190 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20  nt, pWLoop is a 
311a0 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20  candidate to be 
311b0 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a  the next loop. .
311c0 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75          ** Compu
311d0 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20  te its cost */. 
311e0 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77         rCost = w
311f0 68 65 72 65 43 6f 73 74 41 64 64 28 70 57 4c 6f  hereCostAdd(pWLo
31200 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f  op->rSetup,pWLoo
31210 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d  p->rRun + pFrom-
31220 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20  >nRow);.        
31230 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73  rCost = whereCos
31240 74 41 64 64 28 72 43 6f 73 74 2c 20 70 46 72 6f  tAdd(rCost, pFro
31250 6d 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20 20  m->rCost);.     
31260 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72     maskNew = pFr
31270 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
31280 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
31290 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
312a0 4f 72 64 65 72 65 64 56 61 6c 69 64 20 29 7b 0a  OrderedValid ){.
312b0 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68            switch
312c0 28 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  ( wherePathSatis
312d0 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
312e0 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
312f0 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
31300 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
31310 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  om, pWInfo->wctr
31320 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  lFlags,.        
31330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
31340 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72  Loop, pWLoop, &r
31350 65 76 4d 61 73 6b 29 20 29 7b 0a 20 20 20 20 20  evMask) ){.     
31360 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20         case 1:  
31370 2f 2a 20 59 65 73 2e 20 20 70 46 72 6f 6d 2b 70  /* Yes.  pFrom+p
31380 57 4c 6f 6f 70 20 64 6f 65 73 20 73 61 74 69 73  WLoop does satis
31390 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  fy the ORDER BY 
313a0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
313b0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
313c0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  d = 1;.         
313d0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
313e0 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  lid = 1;.       
313f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
31400 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 30            case 0
31410 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70 46 72 6f 6d  :  /* No.  pFrom
31420 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c 20 72 65 71  +pWLoop will req
31430 75 69 72 65 20 61 20 73 65 70 61 72 61 74 65 20  uire a separate 
31440 73 6f 72 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  sort */.        
31450 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20        isOrdered 
31460 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
31470 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69     isOrderedVali
31480 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  d = 1;.         
31490 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68 65       rCost = whe
314a0 72 65 43 6f 73 74 41 64 64 28 72 43 6f 73 74 2c  reCostAdd(rCost,
314b0 20 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20 20 20   rSortCost);.   
314c0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
314d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65  ;.            de
314e0 66 61 75 6c 74 3a 20 2f 2a 20 43 61 6e 6e 6f 74  fault: /* Cannot
314f0 20 74 65 6c 6c 20 79 65 74 2e 20 20 54 72 79 20   tell yet.  Try 
31500 61 67 61 69 6e 20 6f 6e 20 74 68 65 20 6e 65 78  again on the nex
31510 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  t iteration */. 
31520 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
31530 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
31540 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
31550 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b           revMask
31560 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
31570 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
31580 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
31590 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73   see if pWLoop s
315a0 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74  hould be added t
315b0 6f 20 74 68 65 20 6d 78 43 68 6f 69 63 65 20 62  o the mxChoice b
315c0 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  est so far */.  
315d0 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20        for(jj=0, 
315e0 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b  pTo=aTo; jj<nTo;
315f0 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   jj++, pTo++){. 
31600 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
31610 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b  ->maskLoop==mask
31620 4e 65 77 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72  New && pTo->isOr
31630 64 65 72 65 64 56 61 6c 69 64 3d 3d 69 73 4f 72  deredValid==isOr
31640 64 65 72 65 64 56 61 6c 69 64 20 29 7b 0a 20 20  deredValid ){.  
31650 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
31660 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b  se( jj==nTo-1 );
31670 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
31680 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
31690 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
316a0 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b    if( jj>=nTo ){
316b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
316c0 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 26 26 20  To>=mxChoice && 
316d0 72 43 6f 73 74 3e 3d 6d 78 43 6f 73 74 20 29 7b  rCost>=mxCost ){
316e0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
316f0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
31700 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
31710 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
31720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31730 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
31740 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20  intf("Skip   %s 
31750 63 6f 73 74 3d 25 33 64 20 6f 72 64 65 72 3d 25  cost=%3d order=%
31760 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
31770 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
31780 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
31790 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
317a0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
317b0 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
317c0 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65  alid ? (isOrdere
317d0 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
317e0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
317f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
31800 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
31810 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31820 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61          /* Add a
31830 20 6e 65 77 20 50 61 74 68 20 74 6f 20 74 68 65   new Path to the
31840 20 61 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20 20   aTo[] set */.  
31850 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c          if( nTo<
31860 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
31870 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
31880 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
31890 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f  the aTo set by o
318a0 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ne */.          
318b0 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20    jj = nTo++;.  
318c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
318d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
318e0 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20  w path replaces 
318f0 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20  the prior worst 
31900 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65  to keep count be
31910 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a  low mxChoice */.
31920 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
31930 6a 6a 3d 6e 54 6f 2d 31 3b 20 61 54 6f 5b 6a 6a  jj=nTo-1; aTo[jj
31940 5d 2e 72 43 6f 73 74 3c 6d 78 43 6f 73 74 3b 20  ].rCost<mxCost; 
31950 6a 6a 2d 2d 29 7b 20 61 73 73 65 72 74 28 6a 6a  jj--){ assert(jj
31960 3e 30 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  >0); }.         
31970 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f   }.          pTo
31980 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66   = &aTo[jj];.#if
31990 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
319a0 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20  NABLED.         
319b0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
319c0 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
319d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
319e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65  3DebugPrintf("Ne
319f0 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  w    %s cost=%-3
31a00 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
31a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
31a20 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
31a30 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
31a40 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20  p), rCost,.     
31a50 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
31a60 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f  eredValid ? (isO
31a70 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
31a80 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
31a90 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
31aa0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
31ab0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
31ac0 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20 29 7b  >rCost<=rCost ){
31ad0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
31ae0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
31af0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
31b00 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
31b10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31b20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
31b30 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
31b40 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20          "Skip   
31b50 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64  %s cost=%-3d ord
31b60 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
31b70 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
31b80 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
31b90 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
31ba0 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Cost,.          
31bb0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
31bc0 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65  dValid ? (isOrde
31bd0 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
31be0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
31bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
31c00 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76 73  bugPrintf("   vs
31c10 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72   %s cost=%-3d or
31c20 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
31c30 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
31c40 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
31c50 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
31c60 2d 3e 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20  ->rCost,.       
31c70 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
31c80 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
31c90 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
31ca0 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
31cb0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
31cc0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
31cd0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
31ce0 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f   pTo->rCost==rCo
31cf0 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  st );.          
31d00 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
31d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31d20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d    testcase( pTo-
31d30 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20  >rCost==rCost+1 
31d40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
31d50 41 20 6e 65 77 20 61 6e 64 20 62 65 74 74 65 72  A new and better
31d60 20 73 63 6f 72 65 20 66 6f 72 20 61 20 70 72 65   score for a pre
31d70 76 69 6f 75 73 6c 79 20 63 72 65 61 74 65 64 20  viously created 
31d80 65 71 75 69 76 61 6c 65 6e 74 20 70 61 74 68 20  equivalent path 
31d90 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
31da0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
31db0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
31dc0 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
31dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31de0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
31df0 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
31e00 20 20 20 20 22 55 70 64 61 74 65 20 25 73 20 63      "Update %s c
31e10 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25  ost=%-3d order=%
31e20 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
31e30 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
31e40 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
31e50 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a  pWLoop), rCost,.
31e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e70 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
31e80 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59   (isOrdered ? 'Y
31e90 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
31ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
31eb0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
31ec0 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25  "  was %s cost=%
31ed0 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  -3d order=%c\n",
31ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31ef0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
31f00 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
31f10 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20 20   pTo->rCost,.   
31f20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
31f30 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
31f40 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
31f50 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
31f60 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
31f70 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
31f80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
31f90 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e  pWLoop is a winn
31fa0 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20 74  er.  Add it to t
31fb0 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20 73  he set of best s
31fc0 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
31fd0 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d   pTo->maskLoop =
31fe0 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
31ff0 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
32000 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  elf;.        pTo
32010 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d  ->revLoop = revM
32020 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ask;.        pTo
32030 2d 3e 6e 52 6f 77 20 3d 20 70 46 72 6f 6d 2d 3e  ->nRow = pFrom->
32040 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e  nRow + pWLoop->n
32050 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  Out;.        pTo
32060 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b  ->rCost = rCost;
32070 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73  .        pTo->is
32080 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 69  OrderedValid = i
32090 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a 20  sOrderedValid;. 
320a0 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
320b0 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72 65  dered = isOrdere
320c0 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  d;.        memcp
320d0 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46  y(pTo->aLoop, pF
320e0 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65  rom->aLoop, size
320f0 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69  of(WhereLoop*)*i
32100 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 70  Loop);.        p
32110 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  To->aLoop[iLoop]
32120 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20   = pWLoop;.     
32130 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68     if( nTo>=mxCh
32140 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  oice ){.        
32150 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30    mxCost = aTo[0
32160 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ].rCost;.       
32170 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f     for(jj=1, pTo
32180 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43  =&aTo[1]; jj<mxC
32190 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  hoice; jj++, pTo
321a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
321b0 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e   if( pTo->rCost>
321c0 6d 78 43 6f 73 74 20 29 20 6d 78 43 6f 73 74 20  mxCost ) mxCost 
321d0 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20  = pTo->rCost;.  
321e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
321f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
32200 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
32210 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
32220 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
32230 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20  eTrace>=2 ){.   
32240 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
32250 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65  rintf("---- afte
32260 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c  r round %d ----\
32270 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  n", iLoop);.    
32280 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d    for(ii=0, pTo=
32290 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b  aTo; ii<nTo; ii+
322a0 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
322b0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
322c0 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d  rintf(" %s cost=
322d0 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f  %-3d nrow=%-3d o
322e0 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
322f0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
32300 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
32310 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
32320 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20   pTo->nRow,.    
32330 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
32340 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54  deredValid ? (pT
32350 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27  o->isOrdered ? '
32360 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
32370 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
32380 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
32390 64 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65  d && pTo->isOrde
323a0 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  red ){.         
323b0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
323c0 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78  ntf(" rev=0x%llx
323d0 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f  \n", pTo->revLoo
323e0 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  p);.        }els
323f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
32400 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
32410 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  "\n");.        }
32420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
32430 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77  endif..    /* Sw
32440 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20  ap the roles of 
32450 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f  aFrom and aTo fo
32460 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72  r the next gener
32470 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72  ation */.    pFr
32480 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54  om = aTo;.    aT
32490 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61  o = aFrom;.    a
324a0 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20  From = pFrom;.  
324b0 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20    nFrom = nTo;. 
324c0 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d   }..  if( nFrom=
324d0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
324e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
324f0 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75  , "no query solu
32500 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69  tion");.    sqli
32510 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
32520 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72  pace);.    retur
32530 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
32540 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64    }.  .  /* Find
32550 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
32560 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69   path.  pFrom wi
32570 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74  ll be left point
32580 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68  ing to that path
32590 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46   */.  pFrom = aF
325a0 72 6f 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  rom;.  assert( n
325b0 46 72 6f 6d 3d 3d 31 20 29 3b 0a 23 69 66 20 30  From==1 );.#if 0
325c0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
325d0 67 20 69 73 20 6e 65 65 64 65 64 20 69 66 20 6e  g is needed if n
325e0 46 72 6f 6d 20 69 73 20 65 76 65 72 20 6d 6f 72  From is ever mor
325f0 65 20 74 68 61 6e 20 31 20 2a 2f 0a 20 20 66 6f  e than 1 */.  fo
32600 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d  r(ii=1; ii<nFrom
32610 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
32620 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46   pFrom->rCost>aF
32630 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20  rom[ii].rCost ) 
32640 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69  pFrom = &aFrom[i
32650 69 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  i];.  }.#endif. 
32660 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
32670 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29  >nLevel==nLoop )
32680 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ;.  /* Load the 
32690 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
326a0 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a   into pWInfo */.
326b0 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
326c0 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  Loop<nLoop; iLoo
326d0 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c  p++){.    WhereL
326e0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70  evel *pLevel = p
326f0 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70  WInfo->a + iLoop
32700 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57  ;.    pLevel->pW
32710 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20  Loop = pWLoop = 
32720 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f  pFrom->aLoop[iLo
32730 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  op];.    pLevel-
32740 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d  >iFrom = pWLoop-
32750 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65  >iTab;.    pLeve
32760 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49  l->iTabCur = pWI
32770 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
32780 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e  [pLevel->iFrom].
32790 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69  iCursor;.  }.  i
327a0 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
327b0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
327c0 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30  ANT_DISTINCT)!=0
327d0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
327e0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
327f0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d  RE_DISTINCTBY)==
32800 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e  0.   && pWInfo->
32810 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45  eDistinct==WHERE
32820 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20  _DISTINCT_NOOP. 
32830 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20 29    && nRowEst.  )
32840 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f  {.    Bitmask no
32850 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20 72  tUsed;.    int r
32860 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74  c = wherePathSat
32870 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
32880 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52  Info, pWInfo->pR
32890 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c  esultSet, pFrom,
328a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
328b0 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54    WHERE_DISTINCT
328c0 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72  BY, nLoop-1, pFr
328d0 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d  om->aLoop[nLoop-
328e0 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20  1], &notUsed);. 
328f0 20 20 20 69 66 28 20 72 63 3d 3d 31 20 29 20 70     if( rc==1 ) p
32900 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
32910 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
32920 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 7d 0a 20  T_ORDERED;.  }. 
32930 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72   if( pFrom->isOr
32940 64 65 72 65 64 20 29 7b 0a 20 20 20 20 69 66 28  dered ){.    if(
32950 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
32960 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
32970 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20  INCTBY ){.      
32980 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
32990 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
329a0 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
329b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49  }else{.      pWI
329c0 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b  nfo->bOBSat = 1;
329d0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  .      pWInfo->r
329e0 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
329f0 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20  revLoop;.    }. 
32a00 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f   }.  pWInfo->nRo
32a10 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52  wOut = pFrom->nR
32a20 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  ow;..  /* Free t
32a30 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
32a40 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65  and return succe
32a50 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  ss */.  sqlite3D
32a60 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65  bFree(db, pSpace
32a70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
32a80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
32a90 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65  Most queries use
32aa0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
32ab0 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e  able (they are n
32ac0 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61  ot joins) and ha
32ad0 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20  ve.** simple == 
32ae0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69  constraints agai
32af0 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c  nst indexed fiel
32b00 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ds.  This routin
32b10 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  e attempts.** to
32b20 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70   plan those simp
32b30 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d  le cases using m
32b40 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e  uch less ceremon
32b50 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65  y than the.** ge
32b60 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75  neral-purpose qu
32b70 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64  ery planner, and
32b80 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66   thereby yield f
32b90 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72  aster sqlite3_pr
32ba0 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73  epare().** times
32bb0 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
32bc0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  case..**.** Retu
32bd0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73  rn non-zero on s
32be0 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20  uccess, if this 
32bf0 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e  query can be han
32c00 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20  dled by this.** 
32c10 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20  no-frills query 
32c20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e  planner.  Return
32c30 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75   zero if this qu
32c40 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a  ery needs the .*
32c50 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
32c60 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  e query planner.
32c70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
32c80 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65  hereShortCut(Whe
32c90 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
32ca0 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72  Builder){.  Wher
32cb0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
32cc0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
32cd0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57  item *pItem;.  W
32ce0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
32cf0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
32d00 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  erm;.  WhereLoop
32d10 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69   *pLoop;.  int i
32d20 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  Cur;.  int j;.  
32d30 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
32d40 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20  ndex *pIdx;.  . 
32d50 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
32d60 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66  er->pWInfo;.  if
32d70 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
32d80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52  lags & WHERE_FOR
32d90 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72  CE_TABLE ) retur
32da0 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
32db0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
32dc0 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49  >nSrc>=1 );.  pI
32dd0 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
32de0 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61  abList->a;.  pTa
32df0 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
32e00 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
32e10 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
32e20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  0;.  if( pItem->
32e30 7a 49 6e 64 65 78 20 29 20 72 65 74 75 72 6e 20  zIndex ) return 
32e40 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  0;.  iCur = pIte
32e50 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57  m->iCursor;.  pW
32e60 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
32e70 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69  ;.  pLoop = pBui
32e80 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c  lder->pNew;.  pL
32e90 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30  oop->wsFlags = 0
32ea0 3b 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64  ;.  pTerm = find
32eb0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
32ec0 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30 29  -1, 0, WO_EQ, 0)
32ed0 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b  ;.  if( pTerm ){
32ee0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
32ef0 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
32f00 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c  MN_EQ|WHERE_IPK|
32f10 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
32f20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
32f30 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
32f40 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
32f50 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  1;.    pLoop->u.
32f60 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
32f70 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
32f80 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f  st of a rowid lo
32f90 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20  okup is 10 */.  
32fa0 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
32fb0 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 77 68 65 72  33;  /* 33==wher
32fc0 65 43 6f 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d  eCost(10) */.  }
32fd0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49  else{.    for(pI
32fe0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
32ff0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
33000 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
33010 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
33020 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 7c 7c 20 70 49  r==OE_None || pI
33030 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
33040 65 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e!=0 ) continue;
33050 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
33060 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  j<pIdx->nColumn;
33070 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   j++){.        p
33080 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
33090 70 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78 2d  pWC, iCur, pIdx-
330a0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c  >aiColumn[j], 0,
330b0 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a 20   WO_EQ, pIdx);. 
330c0 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
330d0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
330e0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 52 65       whereLoopRe
330f0 73 69 7a 65 28 70 57 49 6e 66 6f 2d 3e 70 50 61  size(pWInfo->pPa
33100 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20  rse->db, pLoop, 
33110 6a 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  j);.        pLoo
33120 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70  p->aLTerm[j] = p
33130 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
33140 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d      if( j!=pIdx-
33150 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >nColumn ) conti
33160 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  nue;.      pLoop
33170 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
33180 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
33190 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49  E_ONEROW|WHERE_I
331a0 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66  NDEXED;.      if
331b0 28 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  ( (pItem->colUse
331c0 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
331d0 64 65 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b  dex(pIdx))==0 ){
331e0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
331f0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
33200 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20  _IDX_ONLY;.     
33210 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e   }.      pLoop->
33220 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20  nLTerm = j;.    
33230 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
33240 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20  .nEq = j;.      
33250 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
33260 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
33270 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
33280 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20  ost of a unique 
33290 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20  index lookup is 
332a0 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f  15 */.      pLoo
332b0 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f  p->rRun = 39;  /
332c0 2a 20 33 39 3d 3d 77 68 65 72 65 43 6f 73 74 28  * 39==whereCost(
332d0 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  15) */.      bre
332e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
332f0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
33300 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d  gs ){.    pLoop-
33310 3e 6e 4f 75 74 20 3d 20 28 57 68 65 72 65 43 6f  >nOut = (WhereCo
33320 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f  st)1;.    pWInfo
33330 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20  ->a[0].pWLoop = 
33340 70 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70  pLoop;.    pLoop
33350 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74  ->maskSelf = get
33360 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
33370 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20  askSet, iCur);. 
33380 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
33390 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a  iTabCur = iCur;.
333a0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77      pWInfo->nRow
333b0 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Out = 1;.    if(
333c0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
333d0 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53  y ) pWInfo->bOBS
333e0 61 74 20 3d 20 20 31 3b 0a 20 20 20 20 69 66 28  at =  1;.    if(
333f0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
33400 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
33410 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
33420 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
33430 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
33440 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20  TINCT_UNIQUE;.  
33450 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
33460 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f  E_DEBUG.    pLoo
33470 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65  p->cId = '0';.#e
33480 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
33490 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
334a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
334b0 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
334c0 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
334d0 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
334e0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
334f0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
33500 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
33510 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
33520 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
33530 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
33540 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
33550 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
33560 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
33570 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
33580 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
33590 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
335a0 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
335b0 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
335c0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
335d0 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
335e0 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
335f0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
33600 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
33610 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
33620 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
33630 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
33640 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
33650 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
33660 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
33670 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
33680 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
33690 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
336a0 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
336b0 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
336c0 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
336d0 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
336e0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
336f0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
33700 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
33710 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
33720 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
33730 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
33740 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
33750 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
33760 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
33770 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
33780 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
33790 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
337a0 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
337b0 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
337c0 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
337d0 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
337e0 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
337f0 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
33800 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
33810 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
33820 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
33830 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
33840 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
33850 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
33860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33870 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
33880 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
33890 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
338a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
338b0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
338c0 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
338d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
338e0 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
338f0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
33900 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
33910 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
33920 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
33930 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
33940 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
33950 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
33960 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
33970 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
33980 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
33990 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
339a0 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
339b0 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
339c0 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
339d0 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
339e0 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
339f0 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
33a00 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
33a10 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
33a20 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
33a30 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
33a40 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
33a50 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
33a60 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
33a70 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
33a80 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
33a90 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
33aa0 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
33ab0 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
33ac0 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
33ad0 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
33ae0 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
33af0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
33b00 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
33b10 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
33b20 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
33b30 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
33b40 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
33b50 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
33b60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
33b70 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
33b80 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
33b90 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
33ba0 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
33bb0 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
33bc0 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
33bd0 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
33be0 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
33bf0 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
33c00 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
33c10 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
33c20 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
33c30 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
33c40 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
33c50 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
33c60 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
33c70 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
33c80 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
33c90 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
33ca0 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
33cb0 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
33cc0 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
33cd0 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
33ce0 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
33cf0 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
33d00 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
33d10 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
33d20 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
33d30 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
33d40 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
33d50 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
33d60 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
33d70 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
33d80 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
33d90 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
33da0 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
33db0 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
33dc0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
33dd0 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
33de0 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
33df0 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
33e00 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
33e10 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
33e20 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
33e30 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
33e40 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
33e50 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
33e60 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
33e70 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
33e80 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
33e90 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
33ea0 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
33eb0 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
33ec0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
33ed0 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
33ee0 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
33ef0 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
33f00 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
33f10 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
33f20 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
33f30 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
33f40 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
33f50 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
33f60 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
33f70 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
33f80 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
33f90 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
33fa0 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
33fb0 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
33fc0 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
33fd0 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
33fe0 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
33ff0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
34000 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
34010 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
34020 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
34030 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
34040 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
34050 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
34060 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
34070 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
34080 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
34090 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
340a0 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
340b0 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
340c0 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
340d0 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
340e0 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
340f0 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
34100 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
34110 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  NG.**.** pOrderB
34120 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
34130 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
34140 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52  lause (or the GR
34150 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  OUP BY clause.**
34160 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52   if the WHERE_GR
34170 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65  OUPBY flag is se
34180 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29  t in wctrlFlags)
34190 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
341a0 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65  tement.** if the
341b0 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74  re is one.  If t
341c0 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
341d0 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66   BY clause or if
341e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
341f0 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
34200 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
34210 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ETE statement, t
34220 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20  hen pOrderBy is 
34230 4e 55 4c 4c 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e  NULL..*/.WhereIn
34240 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65  fo *sqlite3Where
34250 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a  Begin(.  Parse *
34260 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
34270 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
34280 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
34290 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
342a0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20  /* FROM clause: 
342b0 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61  A list of all ta
342c0 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e  bles to be scann
342d0 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  ed */.  Expr *pW
342e0 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  here,         /*
342f0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
34300 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
34310 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
34320 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  An ORDER BY clau
34330 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
34340 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73 75   ExprList *pResu
34350 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73 75 6c 74  ltSet, /* Result
34360 20 73 65 74 20 6f 66 20 74 68 65 20 71 75 65 72   set of the quer
34370 79 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  y */.  u16 wctrl
34380 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20  Flags,       /* 
34390 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
343a0 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64  _* flags defined
343b0 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
343c0 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72  */.  int iIdxCur
343d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
343e0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
343f0 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e 64  ONLY is set, ind
34400 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ex cursor number
34410 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79   */.){.  int nBy
34420 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  teWInfo;        
34430 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65      /* Num. byte
34440 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
34450 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
34460 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69   */.  int nTabLi
34470 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
34480 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
34490 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69  ements in pTabLi
344a0 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  st */.  WhereInf
344b0 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
344c0 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d     /* Will becom
344d0 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  e the return val
344e0 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
344f0 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
34500 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
34510 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75  ;   /* The virtu
34520 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  al database engi
34530 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ne */.  Bitmask 
34540 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  notReady;       
34550 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68     /* Cursors th
34560 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70  at are not yet p
34570 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57  ositioned */.  W
34580 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
34590 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65  sWLB;     /* The
345a0 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64   WhereLoop build
345b0 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  er */.  WhereMas
345c0 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
345d0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
345e0 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f  sion mask set */
345f0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
34600 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a  Level;        /*
34610 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
34620 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a  in pWInfo->a[] *
34630 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
34640 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  Loop;          /
34650 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * Pointer to a s
34660 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20  ingle WhereLoop 
34670 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
34680 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
34690 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
346a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69  ounter */.  sqli
346b0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
346c0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
346d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
346e0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
346f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34700 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
34710 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20  ..  /* Variable 
34720 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
34730 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
34740 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  >db;.  memset(&s
34750 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  WLB, 0, sizeof(s
34760 57 4c 42 29 29 3b 0a 20 20 73 57 4c 42 2e 70 4f  WLB));.  sWLB.pO
34770 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
34780 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65  y;..  /* Disable
34790 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70   the DISTINCT op
347a0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51  timization if SQ
347b0 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74  LITE_DistinctOpt
347c0 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a   is set via.  **
347d0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74   sqlite3_test_ct
347e0 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  rl(SQLITE_TESTCT
347f0 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
34800 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f  ,...) */.  if( O
34810 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
34820 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  led(db, SQLITE_D
34830 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20  istinctOpt) ){. 
34840 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26 3d     wctrlFlags &=
34850 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53   ~WHERE_WANT_DIS
34860 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TINCT;.  }..  /*
34870 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
34880 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
34890 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
348a0 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
348b0 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69  r of.  ** bits i
348c0 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a  n a Bitmask .  *
348d0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  /.  testcase( pT
348e0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d  abList->nSrc==BM
348f0 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c  S );.  if( pTabL
34900 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b  ist->nSrc>BMS ){
34910 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
34920 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74  rMsg(pParse, "at
34930 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20   most %d tables 
34940 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29  in a join", BMS)
34950 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
34960 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66    }..  /* This f
34970 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79  unction normally
34980 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73   generates a nes
34990 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c  ted loop for all
349a0 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a   tables in .  **
349b0 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20   pTabList.  But 
349c0 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45  if the WHERE_ONE
349d0 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20  TABLE_ONLY flag 
349e0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20  is set, then we 
349f0 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79  should.  ** only
34a00 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   generate code f
34a10 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62  or the first tab
34a20 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61  le in pTabList a
34a30 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20  nd assume that. 
34a40 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20   ** any cursors 
34a50 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
34a60 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65  subsequent table
34a70 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69  s are uninitiali
34a80 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62  zed..  */.  nTab
34a90 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61  List = (wctrlFla
34aa0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
34ab0 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20  BLE_ONLY) ? 1 : 
34ac0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a  pTabList->nSrc;.
34ad0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
34ae0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
34af0 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  e WhereInfo stru
34b00 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
34b10 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20  become the.  ** 
34b20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20  return value. A 
34b30 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f  single allocatio
34b40 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  n is used to sto
34b50 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  re the WhereInfo
34b60 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68  .  ** struct, th
34b70 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68  e contents of Wh
34b80 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65  ereInfo.a[], the
34b90 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
34ba0 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20  ucture.  ** and 
34bb0 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  the WhereMaskSet
34bc0 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63   structure. Sinc
34bd0 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f  e WhereClause co
34be0 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65  ntains an 8-byte
34bf0 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70  .  ** field (typ
34c00 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75  e Bitmask) it mu
34c10 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e  st be aligned on
34c20 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64   an 8-byte bound
34c30 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ary on.  ** some
34c40 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20   architectures. 
34c50 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38  Hence the ROUND8
34c60 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  () below..  */. 
34c70 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f   nByteWInfo = RO
34c80 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72  UND8(sizeof(Wher
34c90 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74  eInfo)+(nTabList
34ca0 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65  -1)*sizeof(Where
34cb0 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66  Level));.  pWInf
34cc0 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
34cd0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
34ce0 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28  eWInfo + sizeof(
34cf0 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69  WhereLoop));.  i
34d00 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
34d10 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
34d20 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
34d30 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  nfo);.    pWInfo
34d40 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77   = 0;.    goto w
34d50 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
34d60 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c    }.  pWInfo->nL
34d70 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b  evel = nTabList;
34d80 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  .  pWInfo->pPars
34d90 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57  e = pParse;.  pW
34da0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d  Info->pTabList =
34db0 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49   pTabList;.  pWI
34dc0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  nfo->pOrderBy = 
34dd0 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e  pOrderBy;.  pWIn
34de0 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d  fo->pResultSet =
34df0 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 70   pResultSet;.  p
34e00 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20  WInfo->iBreak = 
34e10 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
34e20 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66  abel(v);.  pWInf
34e30 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  o->wctrlFlags = 
34e40 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57  wctrlFlags;.  pW
34e50 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
34e60 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
34e70 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d  nQueryLoop;.  pM
34e80 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f  askSet = &pWInfo
34e90 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57  ->sMaskSet;.  sW
34ea0 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e  LB.pWInfo = pWIn
34eb0 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d  fo;.  sWLB.pWC =
34ec0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
34ed0 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68   sWLB.pNew = (Wh
34ee0 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72  ereLoop*)(((char
34ef0 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57  *)pWInfo)+nByteW
34f00 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  Info);.  assert(
34f10 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
34f20 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29  NMENT(sWLB.pNew)
34f30 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49   );.  whereLoopI
34f40 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a  nit(sWLB.pNew);.
34f50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
34f60 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d  BUG.  sWLB.pNew-
34f70 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64  >cId = '*';.#end
34f80 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74  if..  /* Split t
34f90 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
34fa0 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75  into separate su
34fb0 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65  bexpressions whe
34fc0 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62  re each.  ** sub
34fd0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
34fe0 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e  parated by an AN
34ff0 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  D operator..  */
35000 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70  .  initMaskSet(p
35010 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72  MaskSet);.  wher
35020 65 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57 49  eClauseInit(&pWI
35030 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f  nfo->sWC, pWInfo
35040 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
35050 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70 50  CodeConstants(pP
35060 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  arse, pWhere);. 
35070 20 77 68 65 72 65 53 70 6c 69 74 28 26 70 57 49   whereSplit(&pWI
35080 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65  nfo->sWC, pWhere
35090 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 73 71 6c  , TK_AND);.  sql
350a0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
350b0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29  hema(pParse, -1)
350c0 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20  ; /* Insert the 
350d0 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20  cookie verifier 
350e0 47 6f 74 6f 20 2a 2f 0a 20 20 20 20 0a 20 20 2f  Goto */.    .  /
350f0 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
35100 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
35110 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  hat is constant.
35120 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20    Evaluate the. 
35130 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61   ** expression a
35140 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f  nd either jump o
35150 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
35160 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75  ode or fall thru
35170 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68  ..  */.  if( pWh
35180 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74  ere && (nTabList
35190 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78  ==0 || sqlite3Ex
351a0 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
351b0 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a  oin(pWhere)) ){.
351c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
351d0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
351e0 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  Where, pWInfo->i
351f0 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55  Break, SQLITE_JU
35200 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
35210 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Where = 0;.  }..
35220 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
35230 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73  e: No FROM claus
35240 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61  e.  */.  if( nTa
35250 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  bList==0 ){.    
35260 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70  if( pOrderBy ) p
35270 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20  WInfo->bOBSat = 
35280 31 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c  1;.    if( wctrl
35290 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
352a0 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
352b0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
352c0 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
352d0 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
352e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
352f0 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f  Assign a bit fro
35300 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f  m the bitmask to
35310 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
35320 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
35330 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61    **.  ** When a
35340 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b  ssigning bitmask
35350 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20   values to FROM 
35360 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c 20  clause cursors, 
35370 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  it must be.  ** 
35380 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69 66  the case that if
35390 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73   X is the bitmas
353a0 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 46  k for the N-th F
353b0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
353c0 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69  then.  ** the bi
353d0 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52  tmask for all FR
353e0 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  OM clause terms 
353f0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
35400 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a  he N-th term.  *
35410 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41 6e  * is (X-1).   An
35420 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
35430 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   the ON clause o
35440 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  f a LEFT JOIN ca
35450 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20 45  n use.  ** its E
35460 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
35470 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69 6e  ble value to fin
35480 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f 66  d the bitmask of
35490 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
354a0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  .  ** of the joi
354b0 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67 20  n.  Subtracting 
354c0 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69 67  one from the rig
354d0 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73 6b  ht table bitmask
354e0 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62 69   gives a.  ** bi
354f0 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61  tmask for all ta
35500 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
35510 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b   of the join.  K
35520 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61  nowing the bitma
35530 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20  sk.  ** for all 
35540 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
35550 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  ft of a left joi
35560 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  n is important. 
35570 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20   Ticket #3015.. 
35580 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
35590 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20  at bitmasks are 
355a0 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
355b0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74  pTabList->nSrc t
355c0 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54  ables in.  ** pT
355d0 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74  abList, not just
355e0 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c   the first nTabL
355f0 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61  ist tables.  nTa
35600 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c  bList is normall
35610 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20  y.  ** equal to 
35620 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62  pTabList->nSrc b
35630 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  ut might be shor
35640 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68  tened to 1 if th
35650 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45  e.  ** WHERE_ONE
35660 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20  TABLE_ONLY flag 
35670 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66  is set..  */.  f
35680 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62  or(ii=0; ii<pTab
35690 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b  List->nSrc; ii++
356a0 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73  ){.    createMas
356b0 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
356c0 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72  List->a[ii].iCur
356d0 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  sor);.  }.#ifnde
356e0 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  f NDEBUG.  {.   
356f0 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65   Bitmask toTheLe
35700 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ft = 0;.    for(
35710 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
35720 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
35730 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
35740 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
35750 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
35760 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
35770 20 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31      assert( (m-1
35780 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a  )==toTheLeft );.
35790 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20        toTheLeft 
357a0 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  |= m;.    }.  }.
357b0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61  #endif..  /* Ana
357c0 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lyze all of the 
357d0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
357e0 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41   Note that exprA
357f0 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20  nalyze() might. 
35800 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74   ** add new virt
35810 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74  ual terms onto t
35820 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
35830 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20  ERE clause.  We 
35840 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74  do not.  ** want
35850 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73   to analyze thes
35860 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c  e virtual terms,
35870 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a   so start analyz
35880 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20  ing at the end. 
35890 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72   ** and work for
358a0 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68 65  ward so that the
358b0 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20 74   added virtual t
358c0 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70  erms are never p
358d0 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20  rocessed..  */. 
358e0 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
358f0 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
35900 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64  o->sWC);.  if( d
35910 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
35920 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
35930 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
35940 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52  ..  /* If the OR
35950 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50  DER BY (or GROUP
35960 20 42 59 29 20 63 6c 61 75 73 65 20 63 6f 6e 74   BY) clause cont
35970 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65 73 20  ains references 
35980 74 6f 20 67 65 6e 65 72 61 6c 0a 20 20 2a 2a 20  to general.  ** 
35990 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 74 68 65  expressions, the
359a0 6e 20 77 65 20 77 6f 6e 27 74 20 62 65 20 61 62  n we won't be ab
359b0 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 69 74  le to satisfy it
359c0 20 75 73 69 6e 67 20 69 6e 64 69 63 65 73 2c 20   using indices, 
359d0 73 6f 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61 64  so.  ** go ahead
359e0 20 61 6e 64 20 64 69 73 61 62 6c 65 20 69 74 20   and disable it 
359f0 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
35a00 70 4f 72 64 65 72 42 79 20 26 26 20 28 77 63 74  pOrderBy && (wct
35a10 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
35a20 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d  WANT_DISTINCT)!=
35a30 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69 3d  0 ){.    for(ii=
35a40 30 3b 20 69 69 3c 70 4f 72 64 65 72 42 79 2d 3e  0; ii<pOrderBy->
35a50 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
35a60 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
35a70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
35a80 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
35a90 79 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b  y->a[ii].pExpr);
35aa0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
35ab0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
35ac0 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
35ad0 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  o->pOrderBy = pO
35ae0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
35af0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
35b00 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
35b10 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
35b20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
35b30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
35b40 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67  .  if( wctrlFlag
35b50 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
35b60 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69  ISTINCT ){.    i
35b70 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  f( isDistinctRed
35b80 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70  undant(pParse, p
35b90 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f  TabList, &pWInfo
35ba0 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65  ->sWC, pResultSe
35bb0 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
35bc0 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b  he DISTINCT mark
35bd0 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73  ing is pointless
35be0 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f  .  Ignore it. */
35bf0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
35c00 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
35c10 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
35c20 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
35c30 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
35c40 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f       /* Try to O
35c50 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73 75  RDER BY the resu
35c60 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64  lt set to make d
35c70 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69  istinct processi
35c80 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20  ng easier */.   
35c90 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c     pWInfo->wctrl
35ca0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44  Flags |= WHERE_D
35cb0 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20  ISTINCTBY;.     
35cc0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
35cd0 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a  y = pResultSet;.
35ce0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
35cf0 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68  Construct the Wh
35d00 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
35d10 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  */.  WHERETRACE(
35d20 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74  0xffff,("*** Opt
35d30 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a  imizer Start ***
35d40 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 6e 54 61  \n"));.  if( nTa
35d50 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68 65 72  bList!=1 || wher
35d60 65 53 68 6f 72 74 43 75 74 28 26 73 57 4c 42 29  eShortCut(&sWLB)
35d70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
35d80 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
35d90 26 73 57 4c 42 29 3b 0a 20 20 20 20 69 66 28 20  &sWLB);.    if( 
35da0 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  rc ) goto whereB
35db0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 20 20  eginError;.  .  
35dc0 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c    /* Display all
35dd0 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
35de0 70 20 6f 62 6a 65 63 74 73 20 69 66 20 77 68 65  p objects if whe
35df0 72 65 74 72 61 63 65 20 69 73 20 65 6e 61 62 6c  retrace is enabl
35e00 65 64 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45  ed */.#ifdef WHE
35e10 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
35e20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
35e30 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20  hereTrace ){.   
35e40 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b     WhereLoop *p;
35e50 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
35e60 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
35e70 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33  zLabel[] = "0123
35e80 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a  456789abcdefghij
35e90 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a  klmnopqrstuvwyxz
35ea0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
35eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ec0 20 20 20 20 20 20 20 20 20 22 41 42 43 44 45 46           "ABCDEF
35ed0 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
35ee0 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72  WYXZ";.      for
35ef0 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  (p=pWInfo->pLoop
35f00 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e  s, i=0; p; p=p->
35f10 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b  pNextLoop, i++){
35f20 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20  .        p->cId 
35f30 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f  = zLabel[i%sizeo
35f40 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20  f(zLabel)];.    
35f50 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
35f60 6e 74 28 70 2c 20 70 54 61 62 4c 69 73 74 29 3b  nt(p, pTabList);
35f70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
35f80 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65  endif.  .    whe
35f90 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49  rePathSolver(pWI
35fa0 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nfo, 0);.    if(
35fb0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
35fc0 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
35fd0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66  ginError;.    if
35fe0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
35ff0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65  By ){.       whe
36000 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49  rePathSolver(pWI
36010 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  nfo, pWInfo->nRo
36020 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20  wOut+1);.       
36030 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
36040 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
36050 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
36060 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49   }.  }.  if( pWI
36070 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  nfo->pOrderBy==0
36080 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   && (db->flags &
36090 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
360a0 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20  rder)!=0 ){.    
360b0 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
360c0 20 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d 31 29   = (Bitmask)(-1)
360d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
360e0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45  se->nErr || NEVE
360f0 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  R(db->mallocFail
36100 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ed) ){.    goto 
36110 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
36120 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52  .  }.#ifdef WHER
36130 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
36140 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
36150 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 69 6e  eTrace ){.    in
36160 74 20 69 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  t ii;.    sqlite
36170 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d  3DebugPrintf("--
36180 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77  -- Solution nRow
36190 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52  =%d", pWInfo->nR
361a0 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20  owOut);.    if( 
361b0 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 29  pWInfo->bOBSat )
361c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
361d0 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44  ebugPrintf(" ORD
361e0 45 52 42 59 3d 30 78 25 6c 6c 78 22 2c 20 70 57  ERBY=0x%llx", pW
361f0 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a  Info->revMask);.
36200 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68      }.    switch
36210 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  ( pWInfo->eDisti
36220 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73  nct ){.      cas
36230 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
36240 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
36250 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
36260 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
36270 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20  T=unique");.    
36280 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
36290 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
362a0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
362b0 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
362c0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
362d0 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f  tf("  DISTINCT=o
362e0 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20  rdered");.      
362f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
36300 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
36310 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
36320 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
36330 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
36340 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75  tf("  DISTINCT=u
36350 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  nordered");.    
36360 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
36370 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
36380 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
36390 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69  "\n");.    for(i
363a0 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e  i=0; ii<pWInfo->
363b0 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20  nLevel; ii++){. 
363c0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
363d0 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69  int(pWInfo->a[ii
363e0 5d 2e 70 57 4c 6f 6f 70 2c 20 70 54 61 62 4c 69  ].pWLoop, pTabLi
363f0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  st);.    }.  }.#
36400 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d  endif.  /* Attem
36410 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65  pt to omit table
36420 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20  s from the join 
36430 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65  that do not effe
36440 63 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  ct the result */
36450 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e  .  if( pWInfo->n
36460 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70  Level>=2.   && p
36470 52 65 73 75 6c 74 53 65 74 21 3d 30 0a 20 20 20  ResultSet!=0.   
36480 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
36490 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
364a0 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a  E_OmitNoopJoin).
364b0 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b    ){.    Bitmask
364c0 20 74 61 62 55 73 65 64 20 3d 20 65 78 70 72 4c   tabUsed = exprL
364d0 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
364e0 61 73 6b 53 65 74 2c 20 70 52 65 73 75 6c 74 53  askSet, pResultS
364f0 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72  et);.    if( pOr
36500 64 65 72 42 79 20 29 20 74 61 62 55 73 65 64 20  derBy ) tabUsed 
36510 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
36520 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
36530 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 77  pOrderBy);.    w
36540 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  hile( pWInfo->nL
36550 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20  evel>=2 ){.     
36560 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
36570 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20  m, *pEnd;.      
36580 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  pLoop = pWInfo->
36590 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  a[pWInfo->nLevel
365a0 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  -1].pWLoop;.    
365b0 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70    if( (pWInfo->p
365c0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
365d0 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65  ->iTab].jointype
365e0 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29   & JT_LEFT)==0 )
365f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
36600 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
36610 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
36620 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  NCT)==0.       &
36630 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
36640 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
36650 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
36660 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
36670 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
36680 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d  tabUsed & pLoop-
36690 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20  >maskSelf)!=0 ) 
366a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e  break;.      pEn
366b0 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20  d = sWLB.pWC->a 
366c0 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72  + sWLB.pWC->nTer
366d0 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65  m;.      for(pTe
366e0 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20  rm=sWLB.pWC->a; 
366f0 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72  pTerm<pEnd; pTer
36700 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
36710 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
36720 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  All & pLoop->mas
36730 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20  kSelf)!=0.      
36740 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
36750 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
36760 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
36770 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
36780 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
36790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
367a0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c        if( pTerm<
367b0 70 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  pEnd ) break;.  
367c0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
367d0 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70  xffff, ("-> drop
367e0 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65   loop %c not use
367f0 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64  d\n", pLoop->cId
36800 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ));.      pWInfo
36810 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20  ->nLevel--;.    
36820 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20    nTabList--;.  
36830 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54    }.  }.  WHERET
36840 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a  RACE(0xffff,("**
36850 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69  * Optimizer Fini
36860 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  shed ***\n"));. 
36870 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
36880 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70  >nQueryLoop += p
36890 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a  WInfo->nRowOut;.
368a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
368b0 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45  ler is an UPDATE
368c0 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
368d0 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71  ment that is req
368e0 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  uesting.  ** to 
368f0 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
36900 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d  lgorithm, determ
36910 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ine if this is a
36920 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a  ppropriate..  **
36930 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c   The one-pass al
36940 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72  gorithm only wor
36950 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20  ks if the WHERE 
36960 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
36970 74 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  ts.  ** the stat
36980 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20  ement to update 
36990 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20  a single row..  
369a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
369b0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
369c0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
369d0 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  )==0 || pWInfo->
369e0 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69  nLevel==1 );.  i
369f0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
36a00 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
36a10 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 26  ESIRED)!=0 .   &
36a20 26 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  & (pWInfo->a[0].
36a30 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
36a40 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21  & WHERE_ONEROW)!
36a50 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f  =0 ){.    pWInfo
36a60 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b  ->okOnePass = 1;
36a70 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
36a80 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
36a90 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f  s &= ~WHERE_IDX_
36aa0 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ONLY;.  }..  /* 
36ab0 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
36ac0 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
36ad0 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
36ae0 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
36af0 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
36b00 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
36b10 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
36b20 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
36b30 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
36b40 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69  fo->a; ii<nTabLi
36b50 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c  st; ii++, pLevel
36b60 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
36b70 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
36b80 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
36b90 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
36ba0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
36bb0 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
36bc0 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a  ng table/index *
36bd0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  /.    struct Src
36be0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
36bf0 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74  tem;..    pTabIt
36c00 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
36c10 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
36c20 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
36c30 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
36c40 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
36c50 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
36c60 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
36c70 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
36c80 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
36c90 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
36ca0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
36cb0 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
36cc0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
36cd0 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
36ce0 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e  /.    }else.#ifn
36cf0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36d00 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
36d10 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
36d20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
36d30 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
36d40 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
36d50 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73  r *pVTab = (cons
36d60 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
36d70 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
36d80 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab);.      int i
36d90 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
36da0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
36db0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
36dc0 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43  (v, OP_VOpen, iC
36dd0 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c  ur, 0, 0, pVTab,
36de0 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d   P4_VTAB);.    }
36df0 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
36e00 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
36e10 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20    /* noop */.   
36e20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
36e30 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
36e40 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
36e50 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
36e60 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
36e70 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f  gs & WHERE_OMIT_
36e80 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29  OPEN_CLOSE)==0 )
36e90 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  {.      int op =
36ea0 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61   pWInfo->okOnePa
36eb0 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74  ss ? OP_OpenWrit
36ec0 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  e : OP_OpenRead;
36ed0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
36ee0 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
36ef0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
36f00 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70  r, iDb, pTab, op
36f10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
36f20 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  e( !pWInfo->okOn
36f30 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
36f40 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
36f50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 70      testcase( !p
36f60 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
36f70 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d   && pTab->nCol==
36f80 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
36f90 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
36fa0 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
36fb0 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20  l<BMS ){.       
36fc0 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61   Bitmask b = pTa
36fd0 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  bItem->colUsed;.
36fe0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
36ff0 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  0;.        for(;
37000 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29   b; b=b>>1, n++)
37010 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  {}.        sqlit
37020 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
37030 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
37040 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a  rentAddr(v)-1, .
37050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37060 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
37070 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29  TE_INT_TO_PTR(n)
37080 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20  , P4_INT32);.   
37090 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d       assert( n<=
370a0 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
370b0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
370c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
370d0 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
370e0 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
370f0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
37100 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
37110 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
37120 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20  MATIC_INDEX.    
37130 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
37140 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
37150 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
37160 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74      constructAut
37170 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72  omaticIndex(pPar
37180 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  se, &pWInfo->sWC
37190 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52  , pTabItem, notR
371a0 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20  eady, pLevel);. 
371b0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
371c0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
371d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
371e0 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20  NDEXED ){.      
371f0 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f  Index *pIx = pLo
37200 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
37210 65 78 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  ex;.      KeyInf
37220 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  o *pKey = sqlite
37230 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
37240 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20  arse, pIx);.    
37250 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20 41 73 20    /* FIXME:  As 
37260 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
37270 75 73 65 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  use pTabItem->iC
37280 75 72 73 6f 72 20 69 66 20 57 48 45 52 45 5f 49  ursor if WHERE_I
37290 44 58 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 20 20 20  DX_ONLY */.     
372a0 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72 20 3d   int iIndexCur =
372b0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
372c0 20 3d 20 69 49 64 78 43 75 72 20 3f 20 69 49 64   = iIdxCur ? iId
372d0 78 43 75 72 20 3a 20 70 50 61 72 73 65 2d 3e 6e  xCur : pParse->n
372e0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Tab++;.      ass
372f0 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d  ert( pIx->pSchem
37300 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
37310 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
37320 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29  ( iIndexCur>=0 )
37330 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
37340 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
37350 4f 70 65 6e 52 65 61 64 2c 20 69 49 6e 64 65 78  OpenRead, iIndex
37360 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20  Cur, pIx->tnum, 
37370 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
37380 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
37390 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  ar*)pKey, P4_KEY
373a0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
373b0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
373c0 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
373d0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
373e0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
373f0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
37400 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74  e, iDb);.    not
37410 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73  Ready &= ~getMas
37420 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
37430 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  Set, pTabItem->i
37440 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70  Cursor);.  }.  p
37450 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71  WInfo->iTop = sq
37460 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
37470 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64  Addr(v);.  if( d
37480 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
37490 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
374a0 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65  nError;..  /* Ge
374b0 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
374c0 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68  to do the search
374d0 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f  .  Each iteratio
374e0 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a  n of the for.  *
374f0 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e  * loop below gen
37500 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20  erates code for 
37510 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20  a single nested 
37520 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20  loop of the VM. 
37530 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a   ** program..  *
37540 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
37550 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
37560 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c  r(ii=0; ii<nTabL
37570 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ist; ii++){.    
37580 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
37590 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 65 78 70  ->a[ii];.    exp
375a0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72  lainOneScan(pPar
375b0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  se, pTabList, pL
375c0 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c  evel, ii, pLevel
375d0 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c  ->iFrom, wctrlFl
375e0 61 67 73 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61  ags);.    notRea
375f0 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70  dy = codeOneLoop
37600 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69  Start(pWInfo, ii
37610 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20  , notReady);.   
37620 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
37630 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  ue = pLevel->add
37640 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rCont;.  }..  /*
37650 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 72 65 74 75   Done. */.  retu
37660 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  rn pWInfo;..  /*
37670 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61   Jump here if ma
37680 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68  lloc fails */.wh
37690 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20  ereBeginError:. 
376a0 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20   if( pWInfo ){. 
376b0 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
376c0 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  yLoop = pWInfo->
376d0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
376e0 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72  .    whereInfoFr
376f0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
37700 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
37710 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
37720 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
37730 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65   WHERE loop.  Se
37740 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a  e comments on .*
37750 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
37760 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69  gin() for additi
37770 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
37780 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
37790 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49  3WhereEnd(WhereI
377a0 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
377b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
377c0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
377d0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
377e0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
377f0 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
37800 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72   *pLevel;.  Wher
37810 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20  eLoop *pLoop;.  
37820 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
37830 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
37840 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
37850 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
37860 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
37870 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
37880 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73  n code..  */.  s
37890 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
378a0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
378b0 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c  for(i=pWInfo->nL
378c0 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  evel-1; i>=0; i-
378d0 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  -){.    pLevel =
378e0 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
378f0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
37900 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
37910 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
37920 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
37930 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  l->addrCont);.  
37940 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
37950 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
37960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37970 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  dOp2(v, pLevel->
37980 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  op, pLevel->p1, 
37990 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20  pLevel->p2);.   
379a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
379b0 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c  angeP5(v, pLevel
379c0 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->p5);.    }.   
379d0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
379e0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
379f0 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75  BLE && pLevel->u
37a00 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  .in.nIn>0 ){.   
37a10 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
37a20 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74   *pIn;.      int
37a30 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   j;.      sqlite
37a40 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
37a50 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
37a60 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  rNxt);.      for
37a70 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  (j=pLevel->u.in.
37a80 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c  nIn, pIn=&pLevel
37a90 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a  ->u.in.aInLoop[j
37aa0 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  -1]; j>0; j--, p
37ab0 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73  In--){.        s
37ac0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
37ad0 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
37ae0 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20  nTop+1);.       
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 49 6e 2d 3e 65 45 6e 64 4c  p2(v, pIn->eEndL
37b10 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72  oopOp, pIn->iCur
37b20 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
37b30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
37b40 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
37b50 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
37b60 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
37b70 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
37b80 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  (db, pLevel->u.i
37b90 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20  n.aInLoop);.    
37ba0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
37bb0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
37bc0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
37bd0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
37be0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
37bf0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
37c00 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
37c10 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
37c20 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76  , OP_IfPos, pLev
37c30 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
37c40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
37c50 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
37c60 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
37c70 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
37c80 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
37c90 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
37ca0 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
37cb0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
37cc0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
37cd0 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
37ce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37cf0 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
37d00 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  w, pTabList->a[i
37d10 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
37d20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
37d30 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
37d40 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
37d50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
37d60 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
37d70 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d  NullRow, pLevel-
37d80 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
37d90 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65   }.      if( pLe
37da0 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75  vel->op==OP_Retu
37db0 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rn ){.        sq
37dc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
37dd0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65  v, OP_Gosub, pLe
37de0 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
37df0 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
37e00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37e10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37e20 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
37e30 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  0, pLevel->addrF
37e40 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  irst);.      }. 
37e50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37e60 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
37e70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
37e80 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
37e90 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
37ea0 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
37eb0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
37ec0 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
37ed0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
37ee0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
37ef0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
37f00 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  );..  /* Close a
37f10 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ll of the cursor
37f20 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e  s that were open
37f30 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
37f40 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20  reBegin..  */.  
37f50 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
37f60 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74  nLevel<=pTabList
37f70 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28  ->nSrc );.  for(
37f80 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
37f90 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d  fo->a; i<pWInfo-
37fa0 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c  >nLevel; i++, pL
37fb0 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64  evel++){.    Ind
37fc0 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20  ex *pIdx = 0;.  
37fd0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
37fe0 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20  _item *pTabItem 
37ff0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
38000 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
38010 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
38020 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
38030 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
38040 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  b!=0 );.    pLoo
38050 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
38060 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61  op;.    if( (pTa
38070 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
38080 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20  _Ephemeral)==0. 
38090 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65      && pTab->pSe
380a0 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20  lect==0.     && 
380b0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
380c0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54  ags & WHERE_OMIT
380d0 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a  _OPEN_CLOSE)==0.
380e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74      ){.      int
380f0 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46   ws = pLoop->wsF
38100 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20  lags;.      if( 
38110 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
38120 73 73 20 26 26 20 28 77 73 20 26 20 57 48 45 52  ss && (ws & WHER
38130 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
38140 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
38150 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
38160 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65  P_Close, pTabIte
38170 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
38180 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
38190 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  ws & WHERE_INDEX
381a0 45 44 29 21 3d 30 20 26 26 20 28 77 73 20 26 20  ED)!=0 && (ws & 
381b0 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
381c0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 29 3d 3d 30  _AUTO_INDEX))==0
381d