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

Artifact c1090a2769c6e47b88aa79cd34f2e763af5282f8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 4b 2c 58  e WHERETRACE(K,X
0430: 29 20 20 69 66 28 73 71 6c 69 74 65 33 57 68 65  )  if(sqlite3Whe
0440: 72 65 54 72 61 63 65 26 28 4b 29 29 20 73 71 6c  reTrace&(K)) sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0460: 58 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  X.# define WHERE
0470: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 31 0a  TRACE_ENABLED 1.
0480: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 57  #else.# define W
0490: 48 45 52 45 54 52 41 43 45 28 4b 2c 58 29 0a 23  HERETRACE(K,X).#
04a0: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
04b0: 64 20 72 65 66 65 72 65 6e 63 65 73 0a 2a 2f 0a  d references.*/.
04c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
04d0: 68 65 72 65 43 6c 61 75 73 65 20 57 68 65 72 65  hereClause Where
04e0: 43 6c 61 75 73 65 3b 0a 74 79 70 65 64 65 66 20  Clause;.typedef 
04f0: 73 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b  struct WhereMask
0500: 53 65 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74  Set WhereMaskSet
0510: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
0520: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 57 68 65   WhereOrInfo Whe
0530: 72 65 4f 72 49 6e 66 6f 3b 0a 74 79 70 65 64 65  reOrInfo;.typede
0540: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 41 6e  f struct WhereAn
0550: 64 49 6e 66 6f 20 57 68 65 72 65 41 6e 64 49 6e  dInfo WhereAndIn
0560: 66 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  fo;.typedef stru
0570: 63 74 20 57 68 65 72 65 4c 65 76 65 6c 20 57 68  ct WhereLevel Wh
0580: 65 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65  ereLevel;.typede
0590: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f  f struct WhereLo
05a0: 6f 70 20 57 68 65 72 65 4c 6f 6f 70 3b 0a 74 79  op WhereLoop;.ty
05b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
05c0: 72 65 50 61 74 68 20 57 68 65 72 65 50 61 74 68  rePath WherePath
05d0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
05e0: 20 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65   WhereTerm Where
05f0: 54 65 72 6d 3b 0a 74 79 70 65 64 65 66 20 73 74  Term;.typedef st
0600: 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75  ruct WhereLoopBu
0610: 69 6c 64 65 72 20 57 68 65 72 65 4c 6f 6f 70 42  ilder WhereLoopB
0620: 75 69 6c 64 65 72 3b 0a 74 79 70 65 64 65 66 20  uilder;.typedef 
0630: 73 74 72 75 63 74 20 57 68 65 72 65 53 63 61 6e  struct WhereScan
0640: 20 57 68 65 72 65 53 63 61 6e 3b 0a 74 79 70 65   WhereScan;.type
0650: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0660: 4f 72 43 6f 73 74 20 57 68 65 72 65 4f 72 43 6f  OrCost WhereOrCo
0670: 73 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  st;.typedef stru
0680: 63 74 20 57 68 65 72 65 4f 72 53 65 74 20 57 68  ct WhereOrSet Wh
0690: 65 72 65 4f 72 53 65 74 3b 0a 0a 2f 2a 0a 2a 2a  ereOrSet;../*.**
06a0: 20 43 6f 73 74 20 58 20 69 73 20 74 72 61 63 6b   Cost X is track
06b0: 65 64 20 61 73 20 31 30 2a 6c 6f 67 32 28 58 29  ed as 10*log2(X)
06c0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 31 36 2d   stored in a 16-
06d0: 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20 54 68  bit integer.  Th
06e0: 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 63 6f 73  e.** maximum cos
06f0: 74 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20 74  t for ordinary t
0700: 61 62 6c 65 73 20 69 73 20 36 34 2a 28 32 2a 2a  ables is 64*(2**
0710: 36 33 29 20 77 68 69 63 68 20 62 65 63 6f 6d 65  63) which become
0720: 73 20 36 39 30 30 2e 0a 2a 2a 20 28 56 69 72 74  s 6900..** (Virt
0730: 75 61 6c 20 74 61 62 6c 65 73 20 63 61 6e 20 72  ual tables can r
0740: 65 74 75 72 6e 20 61 20 6c 61 72 67 65 72 20 63  eturn a larger c
0750: 6f 73 74 2c 20 62 75 74 20 6c 65 74 27 73 20 61  ost, but let's a
0760: 73 73 75 6d 65 20 74 68 65 79 20 64 6f 20 6e 6f  ssume they do no
0770: 74 2e 29 0a 2a 2a 20 53 6f 20 61 6c 6c 20 63 6f  t.).** So all co
0780: 73 74 73 20 63 61 6e 20 62 65 20 73 74 6f 72 65  sts can be store
0790: 64 20 69 6e 20 61 20 31 36 2d 62 69 74 20 75 6e  d in a 16-bit un
07a0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 77  signed integer w
07b0: 69 74 68 6f 75 74 20 72 69 73 6b 0a 2a 2a 20 6f  ithout risk.** o
07c0: 66 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2a 0a 2a  f overflow..**.*
07d0: 2a 20 43 6f 73 74 73 20 61 72 65 20 65 73 74 69  * Costs are esti
07e0: 6d 61 74 65 73 2c 20 73 6f 20 6e 6f 20 65 66 66  mates, so no eff
07f0: 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  ort is made to c
0800: 6f 6d 70 75 74 65 20 31 30 2a 6c 6f 67 32 28 58  ompute 10*log2(X
0810: 29 20 65 78 61 63 74 6c 79 2e 0a 2a 2a 20 49 6e  ) exactly..** In
0820: 73 74 65 61 64 2c 20 61 20 63 6c 6f 73 65 20 65  stead, a close e
0830: 73 74 69 6d 61 74 65 20 69 73 20 75 73 65 64 2e  stimate is used.
0840: 20 20 41 6e 79 20 76 61 6c 75 65 20 6f 66 20 58    Any value of X
0850: 3c 3d 31 20 69 73 20 73 74 6f 72 65 64 20 61 73  <=1 is stored as
0860: 20 30 2e 0a 2a 2a 20 58 3d 32 20 69 73 20 31 30   0..** X=2 is 10
0870: 2e 20 20 58 3d 33 20 69 73 20 31 36 2e 20 20 58  .  X=3 is 16.  X
0880: 3d 31 30 30 30 20 69 73 20 39 39 2e 20 65 74 63  =1000 is 99. etc
0890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 6f 6f 6c  ..**.** The tool
08a0: 2f 77 68 65 72 65 63 6f 73 74 74 65 73 74 2e 63  /wherecosttest.c
08b0: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 69 6d 70   source file imp
08c0: 6c 65 6d 65 6e 74 73 20 61 20 63 6f 6d 6d 61 6e  lements a comman
08d0: 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d 0a 2a  d-line program.*
08e0: 2a 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 76  * that will conv
08f0: 65 72 74 20 57 68 65 72 65 43 6f 73 74 73 20 74  ert WhereCosts t
0900: 6f 20 69 6e 74 65 67 65 72 73 2c 20 63 6f 6e 76  o integers, conv
0910: 65 72 74 20 69 6e 74 65 67 65 72 73 20 74 6f 20  ert integers to 
0920: 57 68 65 72 65 43 6f 73 74 73 0a 2a 2a 20 61 6e  WhereCosts.** an
0930: 64 20 64 6f 20 61 64 64 69 74 69 6f 6e 20 61 6e  d do addition an
0940: 64 20 6d 75 6c 74 69 70 6c 69 63 61 74 69 6f 6e  d multiplication
0950: 20 6f 6e 20 57 68 65 72 65 43 6f 73 74 20 76 61   on WhereCost va
0960: 6c 75 65 73 2e 20 20 54 68 65 20 77 68 65 72 65  lues.  The where
0970: 63 6f 73 74 74 65 73 74 0a 2a 2a 20 63 6f 6d 6d  costtest.** comm
0980: 61 6e 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d  and-line program
0990: 20 69 73 20 61 20 75 73 65 66 75 6c 20 75 74 69   is a useful uti
09a0: 6c 69 74 79 20 74 6f 20 68 61 76 65 20 61 72 6f  lity to have aro
09b0: 75 6e 64 20 77 68 65 6e 20 77 6f 72 6b 69 6e 67  und when working
09c0: 20 77 69 74 68 0a 2a 2a 20 74 68 69 73 20 6d 6f   with.** this mo
09d0: 64 75 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  dule..*/.typedef
09e0: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
09f0: 69 6e 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a  int WhereCost;..
0a00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63  /*.** This objec
0a10: 74 20 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72  t contains infor
0a20: 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
0a30: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 73 69 6e   implement a sin
0a40: 67 6c 65 20 6e 65 73 74 65 64 0a 2a 2a 20 6c 6f  gle nested.** lo
0a50: 6f 70 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75  op in WHERE clau
0a60: 73 65 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 74 72 61  se..**.** Contra
0a70: 73 74 20 74 68 69 73 20 6f 62 6a 65 63 74 20 77  st this object w
0a80: 69 74 68 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20  ith WhereLoop.  
0a90: 54 68 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63  This object desc
0aa0: 72 69 62 65 73 20 74 68 65 0a 2a 2a 20 69 6d 70  ribes the.** imp
0ab0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ac0: 68 65 20 6c 6f 6f 70 2e 20 20 57 68 65 72 65 4c  he loop.  WhereL
0ad0: 6f 6f 70 20 64 65 73 63 72 69 62 65 73 20 74 68  oop describes th
0ae0: 65 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 20  e algorithm..** 
0af0: 54 68 69 73 20 6f 62 6a 65 63 74 20 63 6f 6e 74  This object cont
0b00: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
0b10: 6f 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  o the WhereLoop 
0b20: 61 6c 67 6f 72 69 74 68 6d 20 61 73 20 6f 6e 65  algorithm as one
0b30: 20 6f 66 0a 2a 2a 20 69 74 73 20 65 6c 65 6d 65   of.** its eleme
0b40: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 57  nts..**.** The W
0b50: 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  hereInfo object 
0b60: 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c  contains a singl
0b70: 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
0b80: 69 73 20 6f 62 6a 65 63 74 20 66 6f 72 0a 2a 2a  is object for.**
0b90: 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68   each term in th
0ba0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 28 77  e FROM clause (w
0bb0: 68 69 63 68 20 69 73 20 74 6f 20 73 61 79 2c 20  hich is to say, 
0bc0: 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a  for each of the.
0bd0: 2a 2a 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  ** nested loops 
0be0: 61 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29 2e  as implemented).
0bf0: 20 20 54 68 65 20 6f 72 64 65 72 20 6f 66 20 57    The order of W
0c00: 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74  hereLevel object
0c10: 73 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20  s determines.** 
0c20: 74 68 65 20 6c 6f 6f 70 20 6e 65 73 74 65 64 20  the loop nested 
0c30: 6f 72 64 65 72 2c 20 77 69 74 68 20 57 68 65 72  order, with Wher
0c40: 65 49 6e 66 6f 2e 61 5b 30 5d 20 62 65 69 6e 67  eInfo.a[0] being
0c50: 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20   the outer loop 
0c60: 61 6e 64 0a 2a 2a 20 57 68 65 72 65 49 6e 66 6f  and.** WhereInfo
0c70: 2e 61 5b 57 68 65 72 65 49 6e 66 6f 2e 6e 4c 65  .a[WhereInfo.nLe
0c80: 76 65 6c 2d 31 5d 20 62 65 69 6e 67 20 74 68 65  vel-1] being the
0c90: 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 0a 2a 2f 0a   inner loop..*/.
0ca0: 73 74 72 75 63 74 20 57 68 65 72 65 4c 65 76 65  struct WhereLeve
0cb0: 6c 20 7b 0a 20 20 69 6e 74 20 69 4c 65 66 74 4a  l {.  int iLeftJ
0cc0: 6f 69 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  oin;        /* M
0cd0: 65 6d 6f 72 79 20 63 65 6c 6c 20 75 73 65 64 20  emory cell used 
0ce0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 45 46  to implement LEF
0cf0: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 2a 2f 0a  T OUTER JOIN */.
0d00: 20 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20    int iTabCur;  
0d10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
0d20: 44 42 45 20 63 75 72 73 6f 72 20 75 73 65 64 20  DBE cursor used 
0d30: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 74 61  to access the ta
0d40: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ble */.  int iId
0d50: 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f  xCur;          /
0d60: 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
0d70: 72 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  r used to access
0d80: 20 70 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 61   pIdx */.  int a
0d90: 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
0da0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
0db0: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
0dc0: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
0dd0: 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20  addrNxt;        
0de0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
0df0: 6f 20 73 74 61 72 74 20 74 68 65 20 6e 65 78 74  o start the next
0e00: 20 49 4e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20   IN combination 
0e10: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
0e20: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t;         /* Ju
0e30: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
0e40: 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
0e50: 74 20 6c 6f 6f 70 20 63 79 63 6c 65 20 2a 2f 0a  t loop cycle */.
0e60: 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b    int addrFirst;
0e70: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
0e80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20   instruction of 
0e90: 69 6e 74 65 72 69 6f 72 20 6f 66 20 74 68 65 20  interior of the 
0ea0: 6c 6f 6f 70 20 2a 2f 0a 20 20 75 38 20 69 46 72  loop */.  u8 iFr
0eb0: 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  om;             
0ec0: 2f 2a 20 57 68 69 63 68 20 65 6e 74 72 79 20 69  /* Which entry i
0ed0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
0ee0: 65 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 70 35  e */.  u8 op, p5
0ef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0f00: 4f 70 63 6f 64 65 20 61 6e 64 20 50 35 20 6f 66  Opcode and P5 of
0f10: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 68 61 74   the opcode that
0f20: 20 65 6e 64 73 20 74 68 65 20 6c 6f 6f 70 20 2a   ends the loop *
0f30: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 70 32 3b 20  /.  int p1, p2; 
0f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
0f50: 72 61 6e 64 73 20 6f 66 20 74 68 65 20 6f 70 63  rands of the opc
0f60: 6f 64 65 20 75 73 65 64 20 74 6f 20 65 6e 64 73  ode used to ends
0f70: 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75   the loop */.  u
0f80: 6e 69 6f 6e 20 7b 20 20 20 20 20 20 20 20 20 20  nion {          
0f90: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
0fa0: 69 6f 6e 20 74 68 61 74 20 64 65 70 65 6e 64 73  ion that depends
0fb0: 20 6f 6e 20 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c   on pWLoop->wsFl
0fc0: 61 67 73 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ags */.    struc
0fd0: 74 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49  t {.      int nI
0fe0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
0ff0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1000: 72 69 65 73 20 69 6e 20 61 49 6e 4c 6f 6f 70 5b  ries in aInLoop[
1010: 5d 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  ] */.      struc
1020: 74 20 49 6e 4c 6f 6f 70 20 7b 0a 20 20 20 20 20  t InLoop {.     
1030: 20 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20     int iCur;    
1040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1050: 20 56 44 42 45 20 63 75 72 73 6f 72 20 75 73 65   VDBE cursor use
1060: 64 20 62 79 20 74 68 69 73 20 49 4e 20 6f 70 65  d by this IN ope
1070: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
1080: 20 69 6e 74 20 61 64 64 72 49 6e 54 6f 70 3b 20   int addrInTop; 
1090: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
10a0: 66 20 74 68 65 20 49 4e 20 6c 6f 6f 70 20 2a 2f  f the IN loop */
10b0: 0a 20 20 20 20 20 20 20 20 75 38 20 65 45 6e 64  .        u8 eEnd
10c0: 4c 6f 6f 70 4f 70 3b 20 20 20 20 20 20 20 20 20  LoopOp;         
10d0: 2f 2a 20 49 4e 20 4c 6f 6f 70 20 74 65 72 6d 69  /* IN Loop termi
10e0: 6e 61 74 6f 72 2e 20 4f 50 5f 4e 65 78 74 20 6f  nator. OP_Next o
10f0: 72 20 4f 50 5f 50 72 65 76 20 2a 2f 0a 20 20 20  r OP_Prev */.   
1100: 20 20 20 7d 20 2a 61 49 6e 4c 6f 6f 70 3b 20 20     } *aInLoop;  
1110: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
1120: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61  rmation about ea
1130: 63 68 20 6e 65 73 74 65 64 20 49 4e 20 6f 70 65  ch nested IN ope
1140: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 20 69  rator */.    } i
1150: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1160: 20 20 20 2f 2a 20 55 73 65 64 20 77 68 65 6e 20     /* Used when 
1170: 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26  pWLoop->wsFlags&
1180: 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 2a 2f  WHERE_IN_ABLE */
1190: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76  .    Index *pCov
11a0: 69 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  idx;       /* Po
11b0: 73 73 69 62 6c 65 20 63 6f 76 65 72 69 6e 67 20  ssible covering 
11c0: 69 6e 64 65 78 20 66 6f 72 20 57 48 45 52 45 5f  index for WHERE_
11d0: 4d 55 4c 54 49 5f 4f 52 20 2a 2f 0a 20 20 7d 20  MULTI_OR */.  } 
11e0: 75 3b 0a 20 20 73 74 72 75 63 74 20 57 68 65 72  u;.  struct Wher
11f0: 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20  eLoop *pWLoop;  
1200: 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 65 64 20  /* The selected 
1210: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1220: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61   */.};../*.** Ea
1230: 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ch instance of t
1240: 68 69 73 20 6f 62 6a 65 63 74 20 72 65 70 72 65  his object repre
1250: 73 65 6e 74 73 20 61 6e 20 61 6c 67 6f 72 69 74  sents an algorit
1260: 68 6d 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e  hm for evaluatin
1270: 67 20 6f 6e 65 0a 2a 2a 20 74 65 72 6d 20 6f 66  g one.** term of
1280: 20 61 20 6a 6f 69 6e 2e 20 20 45 76 65 72 79 20   a join.  Every 
1290: 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
12a0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 68 61 76   clause will hav
12b0: 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e  e at least.** on
12c0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
12d0: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
12e0: 20 28 75 6e 6c 65 73 73 20 49 4e 44 45 58 45 44   (unless INDEXED
12f0: 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a   BY constraints.
1300: 2a 2a 20 70 72 65 76 65 6e 74 20 61 20 71 75 65  ** prevent a que
1310: 72 79 20 73 6f 6c 75 74 69 6f 6e 20 2d 20 77 68  ry solution - wh
1320: 69 63 68 20 69 73 20 61 6e 20 65 72 72 6f 72 29  ich is an error)
1330: 20 61 6e 64 20 6d 61 6e 79 20 74 65 72 6d 73 20   and many terms 
1340: 6f 66 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  of the.** FROM c
1350: 6c 61 75 73 65 20 77 69 6c 6c 20 68 61 76 65 20  lause will have 
1360: 6d 75 6c 74 69 70 6c 65 20 57 68 65 72 65 4c 6f  multiple WhereLo
1370: 6f 70 20 6f 62 6a 65 63 74 73 2c 20 65 61 63 68  op objects, each
1380: 20 64 65 73 63 72 69 62 69 6e 67 20 61 0a 2a 2a   describing a.**
1390: 20 70 6f 74 65 6e 74 69 61 6c 20 77 61 79 20 6f   potential way o
13a0: 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  f implementing t
13b0: 68 61 74 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  hat FROM-clause 
13c0: 74 65 72 6d 2c 20 74 6f 67 65 74 68 65 72 20 77  term, together w
13d0: 69 74 68 0a 2a 2a 20 64 65 70 65 6e 64 65 6e 63  ith.** dependenc
13e0: 69 65 73 20 61 6e 64 20 63 6f 73 74 20 65 73 74  ies and cost est
13f0: 69 6d 61 74 65 73 20 66 6f 72 20 75 73 69 6e 67  imates for using
1400: 20 74 68 65 20 63 68 6f 73 65 6e 20 61 6c 67 6f   the chosen algo
1410: 72 69 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20 51 75 65  rithm..**.** Que
1420: 72 79 20 70 6c 61 6e 6e 69 6e 67 20 63 6f 6e 73  ry planning cons
1430: 69 73 74 73 20 6f 66 20 62 75 69 6c 64 69 6e 67  ists of building
1440: 20 75 70 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e   up a collection
1450: 20 6f 66 20 74 68 65 73 65 20 57 68 65 72 65 4c   of these WhereL
1460: 6f 6f 70 0a 2a 2a 20 6f 62 6a 65 63 74 73 2c 20  oop.** objects, 
1470: 74 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 61  then computing a
1480: 20 70 61 72 74 69 63 75 6c 61 72 20 73 65 71 75   particular sequ
1490: 65 6e 63 65 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ence of WhereLoo
14a0: 70 20 6f 62 6a 65 63 74 73 2c 20 77 69 74 68 0a  p objects, with.
14b0: 2a 2a 20 6f 6e 65 20 57 68 65 72 65 4c 6f 6f 70  ** one WhereLoop
14c0: 20 6f 62 6a 65 63 74 20 70 65 72 20 46 52 4f 4d   object per FROM
14d0: 20 63 6c 61 75 73 65 20 74 65 72 6d 2c 20 74 68   clause term, th
14e0: 61 74 20 73 61 74 69 73 66 79 20 61 6c 6c 20 64  at satisfy all d
14f0: 65 70 65 6e 64 65 6e 63 69 65 73 0a 2a 2a 20 61  ependencies.** a
1500: 6e 64 20 74 68 61 74 20 6d 69 6e 69 6d 69 7a 65  nd that minimize
1510: 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 63 6f 73   the overall cos
1520: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  t..*/.struct Whe
1530: 72 65 4c 6f 6f 70 20 7b 0a 20 20 42 69 74 6d 61  reLoop {.  Bitma
1540: 73 6b 20 70 72 65 72 65 71 3b 20 20 20 20 20 20  sk prereq;      
1550: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 6f   /* Bitmask of o
1560: 74 68 65 72 20 6c 6f 6f 70 73 20 74 68 61 74 20  ther loops that 
1570: 6d 75 73 74 20 72 75 6e 20 66 69 72 73 74 20 2a  must run first *
1580: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  /.  Bitmask mask
1590: 53 65 6c 66 3b 20 20 20 20 20 2f 2a 20 42 69 74  Self;     /* Bit
15a0: 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e 67  mask identifying
15b0: 20 74 61 62 6c 65 20 69 54 61 62 20 2a 2f 0a 23   table iTab */.#
15c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
15d0: 55 47 0a 20 20 63 68 61 72 20 63 49 64 3b 20 20  UG.  char cId;  
15e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
15f0: 6d 62 6f 6c 69 63 20 49 44 20 6f 66 20 74 68 69  mbolic ID of thi
1600: 73 20 6c 6f 6f 70 20 66 6f 72 20 64 65 62 75 67  s loop for debug
1610: 67 69 6e 67 20 75 73 65 20 2a 2f 0a 23 65 6e 64  ging use */.#end
1620: 69 66 0a 20 20 75 38 20 69 54 61 62 3b 20 20 20  if.  u8 iTab;   
1630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1640: 73 69 74 69 6f 6e 20 69 6e 20 46 52 4f 4d 20 63  sition in FROM c
1650: 6c 61 75 73 65 20 6f 66 20 74 61 62 6c 65 20 66  lause of table f
1660: 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  or this loop */.
1670: 20 20 75 38 20 69 53 6f 72 74 49 64 78 3b 20 20    u8 iSortIdx;  
1680: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 69          /* Sorti
1690: 6e 67 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 2e  ng index number.
16a0: 20 20 30 3d 3d 4e 6f 6e 65 20 2a 2f 0a 20 20 57    0==None */.  W
16b0: 68 65 72 65 43 6f 73 74 20 72 53 65 74 75 70 3b  hereCost rSetup;
16c0: 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65       /* One-time
16d0: 20 73 65 74 75 70 20 63 6f 73 74 20 28 65 78 3a   setup cost (ex:
16e0: 20 63 72 65 61 74 65 20 74 72 61 6e 73 69 65 6e   create transien
16f0: 74 20 69 6e 64 65 78 29 20 2a 2f 0a 20 20 57 68  t index) */.  Wh
1700: 65 72 65 43 6f 73 74 20 72 52 75 6e 3b 20 20 20  ereCost rRun;   
1710: 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 72      /* Cost of r
1720: 75 6e 6e 69 6e 67 20 65 61 63 68 20 6c 6f 6f 70  unning each loop
1730: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
1740: 6e 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 45  nOut;       /* E
1750: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
1760: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a  of output rows *
1770: 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  /.  union {.    
1780: 73 74 72 75 63 74 20 7b 20 20 20 20 20 20 20 20  struct {        
1790: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d         /* Inform
17a0: 61 74 69 6f 6e 20 66 6f 72 20 69 6e 74 65 72 6e  ation for intern
17b0: 61 6c 20 62 74 72 65 65 20 74 61 62 6c 65 73 20  al btree tables 
17c0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71  */.      int nEq
17d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 71 75  /* Number of equ
17f0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1800: 73 20 2a 2f 0a 20 20 20 20 20 20 49 6e 64 65 78  s */.      Index
1810: 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
1820: 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 2c    /* Index used,
1830: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   or NULL */.    
1840: 7d 20 62 74 72 65 65 3b 0a 20 20 20 20 73 74 72  } btree;.    str
1850: 75 63 74 20 7b 20 20 20 20 20 20 20 20 20 20 20  uct {           
1860: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
1870: 6f 6e 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74  on for virtual t
1880: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  ables */.      i
1890: 6e 74 20 69 64 78 4e 75 6d 3b 20 20 20 20 20 20  nt idxNum;      
18a0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e        /* Index n
18b0: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 75  umber */.      u
18c0: 38 20 6e 65 65 64 46 72 65 65 3b 20 20 20 20 20  8 needFree;     
18d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
18e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 69 64   sqlite3_free(id
18f0: 78 53 74 72 29 20 69 73 20 6e 65 65 64 65 64 20  xStr) is needed 
1900: 2a 2f 0a 20 20 20 20 20 20 75 38 20 69 73 4f 72  */.      u8 isOr
1910: 64 65 72 65 64 3b 20 20 20 20 20 20 20 20 20 20  dered;          
1920: 2f 2a 20 54 72 75 65 20 69 66 20 73 61 74 69 73  /* True if satis
1930: 66 69 65 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  fies ORDER BY */
1940: 0a 20 20 20 20 20 20 75 31 36 20 6f 6d 69 74 4d  .      u16 omitM
1950: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ask;          /*
1960: 20 54 65 72 6d 73 20 74 68 61 74 20 6d 61 79 20   Terms that may 
1970: 62 65 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  be omitted */.  
1980: 20 20 20 20 63 68 61 72 20 2a 69 64 78 53 74 72      char *idxStr
1990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
19a0: 64 65 78 20 69 64 65 6e 74 69 66 69 65 72 20 73  dex identifier s
19b0: 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 20 76  tring */.    } v
19c0: 74 61 62 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  tab;.  } u;.  u3
19d0: 32 20 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  2 wsFlags;      
19e0: 20 20 20 20 2f 2a 20 57 48 45 52 45 5f 2a 20 66      /* WHERE_* f
19f0: 6c 61 67 73 20 64 65 73 63 72 69 62 69 6e 67 20  lags describing 
1a00: 74 68 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75 31  the plan */.  u1
1a10: 36 20 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20  6 nLTerm;       
1a20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a30: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 4c 54 65   entries in aLTe
1a40: 72 6d 5b 5d 20 2a 2f 0a 20 20 2f 2a 2a 2a 2a 20  rm[] */.  /**** 
1a50: 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 29 20  whereLoopXfer() 
1a60: 63 6f 70 69 65 73 20 66 69 65 6c 64 73 20 61 62  copies fields ab
1a70: 6f 76 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ove ************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 20 64  ***********/.# d
1a90: 65 66 69 6e 65 20 57 48 45 52 45 5f 4c 4f 4f 50  efine WHERE_LOOP
1aa0: 5f 58 46 45 52 5f 53 5a 20 6f 66 66 73 65 74 6f  _XFER_SZ offseto
1ab0: 66 28 57 68 65 72 65 4c 6f 6f 70 2c 6e 4c 53 6c  f(WhereLoop,nLSl
1ac0: 6f 74 29 0a 20 20 75 31 36 20 6e 4c 53 6c 6f 74  ot).  u16 nLSlot
1ad0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1ae0: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 61  umber of slots a
1af0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4c 54  llocated for aLT
1b00: 65 72 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  erm[] */.  Where
1b10: 54 65 72 6d 20 2a 2a 61 4c 54 65 72 6d 3b 20 20  Term **aLTerm;  
1b20: 20 2f 2a 20 57 68 65 72 65 54 65 72 6d 73 20 75   /* WhereTerms u
1b30: 73 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  sed */.  WhereLo
1b40: 6f 70 20 2a 70 4e 65 78 74 4c 6f 6f 70 3b 20 2f  op *pNextLoop; /
1b50: 2a 20 4e 65 78 74 20 57 68 65 72 65 4c 6f 6f 70  * Next WhereLoop
1b60: 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 57   object in the W
1b70: 68 65 72 65 43 6c 61 75 73 65 20 2a 2f 0a 20 20  hereClause */.  
1b80: 57 68 65 72 65 54 65 72 6d 20 2a 61 4c 54 65 72  WhereTerm *aLTer
1b90: 6d 53 70 61 63 65 5b 34 5d 3b 20 20 2f 2a 20 49  mSpace[4];  /* I
1ba0: 6e 69 74 69 61 6c 20 61 4c 54 65 72 6d 5b 5d 20  nitial aLTerm[] 
1bb0: 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  space */.};../* 
1bc0: 54 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64  This object hold
1bd0: 73 20 74 68 65 20 70 72 65 72 65 71 75 69 73 69  s the prerequisi
1be0: 74 65 73 20 61 6e 64 20 74 68 65 20 63 6f 73 74  tes and the cost
1bf0: 20 6f 66 20 72 75 6e 6e 69 6e 67 20 61 0a 2a 2a   of running a.**
1c00: 20 73 75 62 71 75 65 72 79 20 6f 6e 20 6f 6e 65   subquery on one
1c10: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 4f   operand of an O
1c20: 52 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 74 68  R operator in th
1c30: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
1c40: 2a 2a 20 53 65 65 20 57 68 65 72 65 4f 72 53 65  ** See WhereOrSe
1c50: 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  t for additional
1c60: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 2a 2f   information .*/
1c70: 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 43  .struct WhereOrC
1c80: 6f 73 74 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20  ost {.  Bitmask 
1c90: 70 72 65 72 65 71 3b 20 20 20 20 20 2f 2a 20 50  prereq;     /* P
1ca0: 72 65 72 65 71 75 69 73 69 74 65 73 20 2a 2f 0a  rerequisites */.
1cb0: 20 20 57 68 65 72 65 43 6f 73 74 20 72 52 75 6e    WhereCost rRun
1cc0: 3b 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66  ;     /* Cost of
1cd0: 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 73 75   running this su
1ce0: 62 71 75 65 72 79 20 2a 2f 0a 20 20 57 68 65 72  bquery */.  Wher
1cf0: 65 43 6f 73 74 20 6e 4f 75 74 3b 20 20 20 20 20  eCost nOut;     
1d00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
1d10: 70 75 74 73 20 66 6f 72 20 74 68 69 73 20 73 75  puts for this su
1d20: 62 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bquery */.};../*
1d30: 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74 20   The WhereOrSet 
1d40: 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20 61 20 73  object holds a s
1d50: 65 74 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57  et of possible W
1d60: 68 65 72 65 4f 72 43 6f 73 74 73 20 74 68 61 74  hereOrCosts that
1d70: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  .** correspond t
1d80: 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 28 73  o the subquery(s
1d90: 29 20 6f 66 20 4f 52 2d 63 6c 61 75 73 65 20 70  ) of OR-clause p
1da0: 72 6f 63 65 73 73 69 6e 67 2e 20 20 4f 6e 6c 79  rocessing.  Only
1db0: 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 4e 5f 4f   the.** best N_O
1dc0: 52 5f 43 4f 53 54 20 65 6c 65 6d 65 6e 74 73 20  R_COST elements 
1dd0: 61 72 65 20 72 65 74 61 69 6e 65 64 2e 0a 2a 2f  are retained..*/
1de0: 0a 23 64 65 66 69 6e 65 20 4e 5f 4f 52 5f 43 4f  .#define N_OR_CO
1df0: 53 54 20 33 0a 73 74 72 75 63 74 20 57 68 65 72  ST 3.struct Wher
1e00: 65 4f 72 53 65 74 20 7b 0a 20 20 75 31 36 20 6e  eOrSet {.  u16 n
1e10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e30: 20 6f 66 20 76 61 6c 69 64 20 61 5b 5d 20 65 6e   of valid a[] en
1e40: 74 72 69 65 73 20 2a 2f 0a 20 20 57 68 65 72 65  tries */.  Where
1e50: 4f 72 43 6f 73 74 20 61 5b 4e 5f 4f 52 5f 43 4f  OrCost a[N_OR_CO
1e60: 53 54 5d 3b 20 20 20 2f 2a 20 53 65 74 20 6f 66  ST];   /* Set of
1e70: 20 62 65 73 74 20 63 6f 73 74 73 20 2a 2f 0a 7d   best costs */.}
1e80: 3b 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  ;.../* Forward d
1e90: 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6d 65  eclaration of me
1ea0: 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  thods */.static 
1eb0: 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  int whereLoopRes
1ec0: 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c 20 57 68  ize(sqlite3*, Wh
1ed0: 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74 29 3b 0a  ereLoop*, int);.
1ee0: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  ./*.** Each inst
1ef0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
1f00: 65 63 74 20 68 6f 6c 64 73 20 61 20 73 65 71 75  ect holds a sequ
1f10: 65 6e 63 65 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ence of WhereLoo
1f20: 70 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 74 68 61  p objects.** tha
1f30: 74 20 69 6d 70 6c 65 6d 65 6e 74 20 73 6f 6d 65  t implement some
1f40: 20 6f 72 20 61 6c 6c 20 6f 66 20 61 20 71 75 65   or all of a que
1f50: 72 79 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ry plan..**.** T
1f60: 68 69 6e 6b 20 6f 66 20 65 61 63 68 20 57 68 65  hink of each Whe
1f70: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 61 73  reLoop object as
1f80: 20 61 20 6e 6f 64 65 20 69 6e 20 61 20 67 72 61   a node in a gra
1f90: 70 68 20 77 69 74 68 20 61 72 63 73 0a 2a 2a 20  ph with arcs.** 
1fa0: 73 68 6f 77 69 6e 67 20 64 65 70 65 6e 64 65 6e  showing dependen
1fb0: 63 65 73 20 61 6e 64 20 63 6f 73 74 73 20 66 6f  ces and costs fo
1fc0: 72 20 74 72 61 76 65 6c 6c 69 6e 67 20 62 65 74  r travelling bet
1fd0: 77 65 65 6e 20 6e 6f 64 65 73 2e 20 20 28 54 68  ween nodes.  (Th
1fe0: 61 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 20 63  at is.** not a c
1ff0: 6f 6d 70 6c 65 74 65 6c 79 20 61 63 63 75 72 61  ompletely accura
2000: 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62  te description b
2010: 65 63 61 75 73 65 20 57 68 65 72 65 4c 6f 6f 70  ecause WhereLoop
2020: 20 63 6f 73 74 73 20 61 72 65 20 61 0a 2a 2a 20   costs are a.** 
2030: 76 65 63 74 6f 72 2c 20 6e 6f 74 20 61 20 73 63  vector, not a sc
2040: 61 6c 61 72 2c 20 61 6e 64 20 62 65 63 61 75 73  alar, and becaus
2050: 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20 61 72  e dependences ar
2060: 65 20 6d 61 6e 79 2d 74 6f 2d 6f 6e 65 2c 20 6e  e many-to-one, n
2070: 6f 74 0a 2a 2a 20 6f 6e 65 2d 74 6f 2d 6f 6e 65  ot.** one-to-one
2080: 20 61 73 20 61 72 65 20 67 72 61 70 68 20 6e 6f   as are graph no
2090: 64 65 73 2e 20 20 42 75 74 20 69 74 20 69 73 20  des.  But it is 
20a0: 61 20 75 73 65 66 75 6c 20 76 69 73 75 61 6c 69  a useful visuali
20b0: 7a 61 74 69 6f 6e 20 61 69 64 2e 29 0a 2a 2a 20  zation aid.).** 
20c0: 54 68 65 6e 20 61 20 57 68 65 72 65 50 61 74 68  Then a WherePath
20d0: 20 6f 62 6a 65 63 74 20 69 73 20 61 20 70 61 74   object is a pat
20e0: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 67 72  h through the gr
20f0: 61 70 68 20 74 68 61 74 20 76 69 73 69 74 73 20  aph that visits 
2100: 73 6f 6d 65 0a 2a 2a 20 6f 72 20 61 6c 6c 20 6f  some.** or all o
2110: 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
2120: 6f 62 6a 65 63 74 73 20 6f 6e 63 65 2e 0a 2a 2a  objects once..**
2130: 0a 2a 2a 20 54 68 65 20 22 73 6f 6c 76 65 72 22  .** The "solver"
2140: 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69   works by creati
2150: 6e 67 20 74 68 65 20 4e 20 62 65 73 74 20 57 68  ng the N best Wh
2160: 65 72 65 50 61 74 68 20 6f 62 6a 65 63 74 73 20  erePath objects 
2170: 6f 66 20 6c 65 6e 67 74 68 0a 2a 2a 20 31 2e 20  of length.** 1. 
2180: 20 54 68 65 6e 20 75 73 69 6e 67 20 74 68 6f 73   Then using thos
2190: 65 20 61 73 20 61 20 62 61 73 69 73 20 74 6f 20  e as a basis to 
21a0: 63 6f 6d 70 75 74 65 20 74 68 65 20 4e 20 62 65  compute the N be
21b0: 73 74 20 57 68 65 72 65 50 61 74 68 20 6f 62 6a  st WherePath obj
21c0: 65 63 74 73 0a 2a 2a 20 6f 66 20 6c 65 6e 67 74  ects.** of lengt
21d0: 68 20 32 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  h 2.  And so for
21e0: 74 68 20 75 6e 74 69 6c 20 74 68 65 20 6c 65 6e  th until the len
21f0: 67 74 68 20 6f 66 20 57 68 65 72 65 50 61 74 68  gth of WherePath
2200: 73 20 65 71 75 61 6c 73 20 74 68 65 0a 2a 2a 20  s equals the.** 
2210: 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 64 65 73 20  number of nodes 
2220: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2230: 73 65 2e 20 20 54 68 65 20 62 65 73 74 20 28 6c  se.  The best (l
2240: 6f 77 65 73 74 20 63 6f 73 74 29 20 57 68 65 72  owest cost) Wher
2250: 65 50 61 74 68 0a 2a 2a 20 61 74 20 74 68 65 20  ePath.** at the 
2260: 65 6e 64 20 69 73 20 74 68 65 20 63 68 6f 6f 73  end is the choos
2270: 65 6e 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a  en query plan..*
2280: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 50 61  /.struct WherePa
2290: 74 68 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  th {.  Bitmask m
22a0: 61 73 6b 4c 6f 6f 70 3b 20 20 20 20 20 2f 2a 20  askLoop;     /* 
22b0: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 57  Bitmask of all W
22c0: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
22d0: 20 69 6e 20 74 68 69 73 20 70 61 74 68 20 2a 2f   in this path */
22e0: 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4c 6f  .  Bitmask revLo
22f0: 6f 70 3b 20 20 20 20 20 20 2f 2a 20 61 4c 6f 6f  op;      /* aLoo
2300: 70 5b 5d 73 20 74 68 61 74 20 73 68 6f 75 6c 64  p[]s that should
2310: 20 62 65 20 72 65 76 65 72 73 65 64 20 66 6f 72   be reversed for
2320: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 57   ORDER BY */.  W
2330: 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 3b 20 20  hereCost nRow;  
2340: 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65       /* Estimate
2350: 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
2360: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
2370: 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 57 68 65  is path */.  Whe
2380: 72 65 43 6f 73 74 20 72 43 6f 73 74 3b 20 20 20  reCost rCost;   
2390: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 6f 73 74     /* Total cost
23a0: 20 6f 66 20 74 68 69 73 20 70 61 74 68 20 2a 2f   of this path */
23b0: 0a 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 3b  .  u8 isOrdered;
23c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
23d0: 20 69 66 20 74 68 69 73 20 70 61 74 68 20 73 61   if this path sa
23e0: 74 69 73 66 69 65 73 20 4f 52 44 45 52 20 42 59  tisfies ORDER BY
23f0: 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72   */.  u8 isOrder
2400: 65 64 56 61 6c 69 64 3b 20 20 20 20 2f 2a 20 54  edValid;    /* T
2410: 72 75 65 20 69 66 20 74 68 65 20 69 73 4f 72 64  rue if the isOrd
2420: 65 72 65 64 20 66 69 65 6c 64 20 69 73 20 76 61  ered field is va
2430: 6c 69 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  lid */.  WhereLo
2440: 6f 70 20 2a 2a 61 4c 6f 6f 70 3b 20 20 20 20 2f  op **aLoop;    /
2450: 2a 20 41 72 72 61 79 20 6f 66 20 57 68 65 72 65  * Array of Where
2460: 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 6d 70  Loop objects imp
2470: 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 70  lementing this p
2480: 61 74 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ath */.};../*.**
2490: 20 54 68 65 20 71 75 65 72 79 20 67 65 6e 65 72   The query gener
24a0: 61 74 6f 72 20 75 73 65 73 20 61 6e 20 61 72 72  ator uses an arr
24b0: 61 79 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20  ay of instances 
24c0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
24d0: 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69 74 20  e to.** help it 
24e0: 61 6e 61 6c 79 7a 65 20 74 68 65 20 73 75 62 65  analyze the sube
24f0: 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
2500: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
2510: 20 45 61 63 68 20 57 48 45 52 45 0a 2a 2a 20 63   Each WHERE.** c
2520: 6c 61 75 73 65 20 73 75 62 65 78 70 72 65 73 73  lause subexpress
2530: 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
2540: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
2550: 20 62 79 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   by AND operator
2560: 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c 79 2c 20 6f  s,.** usually, o
2570: 72 20 73 6f 6d 65 74 69 6d 65 73 20 73 75 62 65  r sometimes sube
2580: 78 70 72 65 73 73 69 6f 6e 73 20 73 65 70 61 72  xpressions separ
2590: 61 74 65 64 20 62 79 20 4f 52 2e 0a 2a 2a 0a 2a  ated by OR..**.*
25a0: 2a 20 41 6c 6c 20 57 68 65 72 65 54 65 72 6d 73  * All WhereTerms
25b0: 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 69   are collected i
25c0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65  nto a single Whe
25d0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
25e0: 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20 66 6f 6c  re.  .** The fol
25f0: 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69 74 79 20  lowing identity 
2600: 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  holds:.**.**    
2610: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 70 57      WhereTerm.pW
2620: 43 2d 3e 61 5b 57 68 65 72 65 54 65 72 6d 2e 69  C->a[WhereTerm.i
2630: 64 78 5d 20 3d 3d 20 57 68 65 72 65 54 65 72 6d  dx] == WhereTerm
2640: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 74 65  .**.** When a te
2650: 72 6d 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  rm is of the for
2660: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  m:.**.**        
2670: 20 20 20 20 20 20 58 20 3c 6f 70 3e 20 3c 65 78        X <op> <ex
2680: 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  pr>.**.** where 
2690: 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61  X is a column na
26a0: 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  me and <op> is o
26b0: 6e 65 20 6f 66 20 63 65 72 74 61 69 6e 20 6f 70  ne of certain op
26c0: 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74 68 65 6e  erators,.** then
26d0: 20 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43   WhereTerm.leftC
26e0: 75 72 73 6f 72 20 61 6e 64 20 57 68 65 72 65 54  ursor and WhereT
26f0: 65 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  erm.u.leftColumn
2700: 20 72 65 63 6f 72 64 20 74 68 65 0a 2a 2a 20 63   record the.** c
2710: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 61 6e 64  ursor number and
2720: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 66   column number f
2730: 6f 72 20 58 2e 20 20 57 68 65 72 65 54 65 72 6d  or X.  WhereTerm
2740: 2e 65 4f 70 65 72 61 74 6f 72 20 72 65 63 6f 72  .eOperator recor
2750: 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e 20 75  ds.** the <op> u
2760: 73 69 6e 67 20 61 20 62 69 74 6d 61 73 6b 20 65  sing a bitmask e
2770: 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e 65 64 20  ncoding defined 
2780: 62 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f 77 2e  by WO_xxx below.
2790: 20 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f 66 20    The.** use of 
27a0: 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69  a bitmask encodi
27b0: 6e 67 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  ng for the opera
27c0: 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f  tor allows us to
27d0: 20 73 65 61 72 63 68 0a 2a 2a 20 71 75 69 63 6b   search.** quick
27e0: 6c 79 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61  ly for terms tha
27f0: 74 20 6d 61 74 63 68 20 61 6e 79 20 6f 66 20 73  t match any of s
2800: 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74  everal different
2810: 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a   operators..**.*
2820: 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 6d 69  * A WhereTerm mi
2830: 67 68 74 20 61 6c 73 6f 20 62 65 20 74 77 6f 20  ght also be two 
2840: 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73  or more subterms
2850: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
2870: 28 74 31 2e 58 20 3c 6f 70 3e 20 3c 65 78 70 72  (t1.X <op> <expr
2880: 3e 29 20 4f 52 20 28 74 31 2e 59 20 3c 6f 70 3e  >) OR (t1.Y <op>
2890: 20 3c 65 78 70 72 3e 29 20 4f 52 20 2e 2e 2e 2e   <expr>) OR ....
28a0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 73  .**.** In this s
28b0: 65 63 6f 6e 64 20 63 61 73 65 2c 20 77 74 46 6c  econd case, wtFl
28c0: 61 67 20 68 61 73 20 74 68 65 20 54 45 52 4d 5f  ag has the TERM_
28d0: 4f 52 49 4e 46 4f 20 62 69 74 20 73 65 74 20 61  ORINFO bit set a
28e0: 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  nd eOperator==WO
28f0: 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57  _OR.** and the W
2900: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
2910: 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20  fo field points 
2920: 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  to auxiliary inf
2930: 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  ormation that.**
2940: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62   is collected ab
2950: 6f 75 74 20 74 68 65 20 4f 52 20 63 6c 61 75 73  out the OR claus
2960: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 65  e..**.** If a te
2970: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
2980: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20  clause does not 
2990: 6d 61 74 63 68 20 65 69 74 68 65 72 20 6f 66 20  match either of 
29a0: 74 68 65 20 74 77 6f 20 70 72 65 76 69 6f 75 73  the two previous
29b0: 0a 2a 2a 20 63 61 74 65 67 6f 72 69 65 73 2c 20  .** categories, 
29c0: 74 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 3d 3d  then eOperator==
29d0: 30 2e 20 20 54 68 65 20 57 68 65 72 65 54 65 72  0.  The WhereTer
29e0: 6d 2e 70 45 78 70 72 20 66 69 65 6c 64 20 69 73  m.pExpr field is
29f0: 20 73 74 69 6c 6c 20 73 65 74 0a 2a 2a 20 74 6f   still set.** to
2a00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 75   the original su
2a10: 62 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74  bexpression cont
2a20: 65 6e 74 20 61 6e 64 20 77 74 46 6c 61 67 73 20  ent and wtFlags 
2a30: 69 73 20 73 65 74 20 75 70 20 61 70 70 72 6f 70  is set up approp
2a40: 72 69 61 74 65 6c 79 0a 2a 2a 20 62 75 74 20 6e  riately.** but n
2a50: 6f 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 69  o other fields i
2a60: 6e 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 20  n the WhereTerm 
2a70: 6f 62 6a 65 63 74 20 61 72 65 20 6d 65 61 6e 69  object are meani
2a80: 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ngful..**.** Whe
2a90: 6e 20 65 4f 70 65 72 61 74 6f 72 21 3d 30 2c 20  n eOperator!=0, 
2aa0: 70 72 65 72 65 71 52 69 67 68 74 20 61 6e 64 20  prereqRight and 
2ab0: 70 72 65 72 65 71 41 6c 6c 20 72 65 63 6f 72 64  prereqAll record
2ac0: 20 73 65 74 73 20 6f 66 20 63 75 72 73 6f 72 20   sets of cursor 
2ad0: 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62 75 74 20  numbers,.** but 
2ae0: 74 68 65 79 20 64 6f 20 73 6f 20 69 6e 64 69 72  they do so indir
2af0: 65 63 74 6c 79 2e 20 20 41 20 73 69 6e 67 6c 65  ectly.  A single
2b00: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
2b10: 72 75 63 74 75 72 65 20 74 72 61 6e 73 6c 61 74  ructure translat
2b20: 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  es.** cursor num
2b30: 62 65 72 20 69 6e 74 6f 20 62 69 74 73 20 61 6e  ber into bits an
2b40: 64 20 74 68 65 20 74 72 61 6e 73 6c 61 74 65 64  d the translated
2b50: 20 62 69 74 20 69 73 20 73 74 6f 72 65 64 20 69   bit is stored i
2b60: 6e 20 74 68 65 20 70 72 65 72 65 71 0a 2a 2a 20  n the prereq.** 
2b70: 66 69 65 6c 64 73 2e 20 20 54 68 65 20 74 72 61  fields.  The tra
2b80: 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75 73 65 64  nslation is used
2b90: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 78   in order to max
2ba0: 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62 65 72  imize the number
2bb0: 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74 68 61 74   of.** bits that
2bc0: 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 61 20 42   will fit in a B
2bd0: 69 74 6d 61 73 6b 2e 20 20 54 68 65 20 56 44 42  itmask.  The VDB
2be0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
2bf0: 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 73 70 72   might be.** spr
2c00: 65 61 64 20 6f 75 74 20 6f 76 65 72 20 74 68 65  ead out over the
2c10: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
2c20: 74 65 67 65 72 73 2e 20 20 46 6f 72 20 65 78 61  tegers.  For exa
2c30: 6d 70 6c 65 2c 20 74 68 65 20 63 75 72 73 6f 72  mple, the cursor
2c40: 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d 69 67 68  .** numbers migh
2c50: 74 20 62 65 20 33 2c 20 38 2c 20 39 2c 20 31 30  t be 3, 8, 9, 10
2c60: 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c 20 61 6e  , 20, 23, 41, an
2c70: 64 20 34 35 2e 20 20 54 68 65 20 57 68 65 72 65  d 45.  The Where
2c80: 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61 6e 73  MaskSet.** trans
2c90: 6c 61 74 65 73 20 74 68 65 73 65 20 73 70 61 72  lates these spar
2ca0: 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  se cursor number
2cb0: 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69  s into consecuti
2cc0: 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 62  ve integers.** b
2cd0: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 20  eginning with 0 
2ce0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
2cf0: 20 74 68 65 20 62 65 73 74 20 70 6f 73 73 69 62   the best possib
2d00: 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20 61 76  le use of the av
2d10: 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74 73 20  ailable.** bits 
2d20: 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b 2e 20  in the Bitmask. 
2d30: 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78 61 6d   So, in the exam
2d40: 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 63  ple above, the c
2d50: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a 2a 2a  ursor numbers.**
2d60: 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64   would be mapped
2d70: 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73 20 30   into integers 0
2d80: 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2a 0a 2a   through 7..**.*
2d90: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2da0: 74 65 72 6d 73 20 69 6e 20 61 20 6a 6f 69 6e 20  terms in a join 
2db0: 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
2dc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
2dd0: 0a 2a 2a 20 69 6e 20 70 72 65 72 65 71 52 69 67  .** in prereqRig
2de0: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
2df0: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
2e00: 73 20 36 34 20 62 69 74 73 2c 20 68 65 6e 63 65  s 64 bits, hence
2e10: 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6f 6e   SQLite.** is on
2e20: 6c 79 20 61 62 6c 65 20 74 6f 20 70 72 6f 63 65  ly able to proce
2e30: 73 73 20 6a 6f 69 6e 73 20 77 69 74 68 20 36 34  ss joins with 64
2e40: 20 6f 72 20 66 65 77 65 72 20 74 61 62 6c 65 73   or fewer tables
2e50: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
2e60: 65 54 65 72 6d 20 7b 0a 20 20 45 78 70 72 20 2a  eTerm {.  Expr *
2e70: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
2e80: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2e90: 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
2ea0: 6e 20 74 68 61 74 20 69 73 20 74 68 69 73 20 74  n that is this t
2eb0: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  erm */.  int iPa
2ec0: 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
2ed0: 20 2f 2a 20 44 69 73 61 62 6c 65 20 70 57 43 2d   /* Disable pWC-
2ee0: 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77 68 65 6e  >a[iParent] when
2ef0: 20 74 68 69 73 20 74 65 72 6d 20 64 69 73 61 62   this term disab
2f00: 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 66  led */.  int lef
2f10: 74 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  tCursor;        
2f20: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
2f30: 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70  r of X in "X <op
2f40: 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 75  > <expr>" */.  u
2f50: 6e 69 6f 6e 20 7b 0a 20 20 20 20 69 6e 74 20 6c  nion {.    int l
2f60: 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  eftColumn;      
2f70: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
2f80: 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c  ber of X in "X <
2f90: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20  op> <expr>" */. 
2fa0: 20 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a     WhereOrInfo *
2fb0: 70 4f 72 49 6e 66 6f 3b 20 20 20 2f 2a 20 45 78  pOrInfo;   /* Ex
2fc0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
2fd0: 69 66 20 28 65 4f 70 65 72 61 74 6f 72 20 26 20  if (eOperator & 
2fe0: 57 4f 5f 4f 52 29 21 3d 30 20 2a 2f 0a 20 20 20  WO_OR)!=0 */.   
2ff0: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
3000: 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78 74 72  AndInfo; /* Extr
3010: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66  a information if
3020: 20 28 65 4f 70 65 72 61 74 6f 72 26 20 57 4f 5f   (eOperator& WO_
3030: 41 4e 44 29 21 3d 30 20 2a 2f 0a 20 20 7d 20 75  AND)!=0 */.  } u
3040: 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f  ;.  u16 eOperato
3050: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  r;          /* A
3060: 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73   WO_xx value des
3070: 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a  cribing <op> */.
3080: 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20    u8 wtFlags;   
3090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52            /* TER
30a0: 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e  M_xxx bit flags.
30b0: 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20    See below */. 
30c0: 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20   u8 nChild;     
30d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30e0: 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74  er of children t
30f0: 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65  hat must disable
3100: 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c   us */.  WhereCl
3110: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
3120: 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74   /* The clause t
3130: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
3140: 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b   of */.  Bitmask
3150: 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20 20   prereqRight;   
3160: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
3170: 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70 45  ables used by pE
3180: 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20  xpr->pRight */. 
3190: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
31a0: 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  ll;      /* Bitm
31b0: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65  ask of tables re
31c0: 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78 70  ferenced by pExp
31d0: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  r */.};../*.** A
31e0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
31f0: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
3200: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  gs.*/.#define TE
3210: 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78  RM_DYNAMIC    0x
3220: 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  01   /* Need to 
3230: 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  call sqlite3Expr
3240: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
3250: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
3260: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
3270: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
3280: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
3290: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
32a0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
32b0: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
32c0: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
32d0: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
32e0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
32f0: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
3300: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
3310: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49  #define TERM_ORI
3320: 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f  NFO     0x10   /
3330: 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74  * Need to free t
3340: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
3350: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  OrInfo object */
3360: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e  .#define TERM_AN
3370: 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20  DINFO    0x20   
3380: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
3390: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
33a0: 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a  pAndInfo obj */.
33b0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
33c0: 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20 2f  OK      0x40   /
33d0: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
33e0: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
33f0: 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
3400: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
3410: 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f  .#  define TERM_
3420: 56 4e 55 4c 4c 20 20 20 20 30 78 38 30 20 20 20  VNULL    0x80   
3430: 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72 65 64 20  /* Manufactured 
3440: 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c  x>NULL or x<=NUL
3450: 4c 20 74 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a  L term */.#else.
3460: 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  #  define TERM_V
3470: 4e 55 4c 4c 20 20 20 20 30 78 30 30 20 20 20 2f  NULL    0x00   /
3480: 2a 20 44 69 73 61 62 6c 65 64 20 69 66 20 6e 6f  * Disabled if no
3490: 74 20 75 73 69 6e 67 20 73 74 61 74 33 20 2a 2f  t using stat3 */
34a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
34b0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
34c0: 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62 6a 65  e WhereScan obje
34d0: 63 74 20 69 73 20 75 73 65 64 20 61 73 20 61 6e  ct is used as an
34e0: 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   iterator for lo
34f0: 63 61 74 69 6e 67 0a 2a 2a 20 74 65 72 6d 73 20  cating.** terms 
3500: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
3510: 75 73 65 20 74 68 61 74 20 61 72 65 20 75 73 65  use that are use
3520: 66 75 6c 20 74 6f 20 74 68 65 20 71 75 65 72 79  ful to the query
3530: 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 72   planner..*/.str
3540: 75 63 74 20 57 68 65 72 65 53 63 61 6e 20 7b 0a  uct WhereScan {.
3550: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3560: 4f 72 69 67 57 43 3b 20 20 20 20 20 20 2f 2a 20  OrigWC;      /* 
3570: 4f 72 69 67 69 6e 61 6c 2c 20 69 6e 6e 65 72 6d  Original, innerm
3580: 6f 73 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  ost WhereClause 
3590: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
35a0: 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
35b0: 2f 2a 20 57 68 65 72 65 43 6c 61 75 73 65 20 63  /* WhereClause c
35c0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 73  urrently being s
35d0: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72  canned */.  char
35e0: 20 2a 7a 43 6f 6c 6c 4e 61 6d 65 3b 20 20 20 20   *zCollName;    
35f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72         /* Requir
3600: 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ed collating seq
3610: 75 65 6e 63 65 2c 20 69 66 20 6e 6f 74 20 4e 55  uence, if not NU
3620: 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 69 64 78  LL */.  char idx
3630: 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  aff;            
3640: 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 74 63 68     /* Must match
3650: 20 74 68 69 73 20 61 66 66 69 6e 69 74 79 2c 20   this affinity, 
3660: 69 66 20 7a 43 6f 6c 6c 4e 61 6d 65 21 3d 4e 55  if zCollName!=NU
3670: 4c 4c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  LL */.  unsigned
3680: 20 63 68 61 72 20 6e 45 71 75 69 76 3b 20 20 20   char nEquiv;   
3690: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
36a0: 65 6e 74 72 69 65 73 20 69 6e 20 61 45 71 75 69  entries in aEqui
36b0: 76 5b 5d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  v[] */.  unsigne
36c0: 64 20 63 68 61 72 20 69 45 71 75 69 76 3b 20 20  d char iEquiv;  
36d0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73      /* Next unus
36e0: 65 64 20 73 6c 6f 74 20 69 6e 20 61 45 71 75 69  ed slot in aEqui
36f0: 76 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d  v[] */.  u32 opM
3700: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
3710: 20 20 20 20 2f 2a 20 41 63 63 65 70 74 61 62 6c      /* Acceptabl
3720: 65 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  e operators */. 
3730: 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20   int k;         
3740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
3750: 65 73 75 6d 65 20 73 63 61 6e 6e 69 6e 67 20 61  esume scanning a
3760: 74 20 74 68 69 73 2d 3e 70 57 43 2d 3e 61 5b 74  t this->pWC->a[t
3770: 68 69 73 2d 3e 6b 5d 20 2a 2f 0a 20 20 69 6e 74  his->k] */.  int
3780: 20 61 45 71 75 69 76 5b 32 32 5d 3b 20 20 20 20   aEquiv[22];    
3790: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
37a0: 72 2c 43 6f 6c 75 6d 6e 20 70 61 69 72 73 20 66  r,Column pairs f
37b0: 6f 72 20 65 71 75 69 76 61 6c 65 6e 63 65 20 63  or equivalence c
37c0: 6c 61 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lasses */.};../*
37d0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
37e0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
37f0: 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73   structure holds
3800: 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
3810: 20 61 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52   about a.** WHER
3820: 45 20 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c  E clause.  Mostl
3830: 79 20 74 68 69 73 20 69 73 20 61 20 63 6f 6e 74  y this is a cont
3840: 61 69 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72  ainer for one or
3850: 20 6d 6f 72 65 20 57 68 65 72 65 54 65 72 6d 73   more WhereTerms
3860: 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 6c 61 6e 61 74  ..**.** Explanat
3870: 69 6f 6e 20 6f 66 20 70 4f 75 74 65 72 3a 20 20  ion of pOuter:  
3880: 46 6f 72 20 61 20 57 48 45 52 45 20 63 6c 61 75  For a WHERE clau
3890: 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  se of the form.*
38a0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
38b0: 20 41 4e 44 20 28 28 62 20 41 4e 44 20 63 29 20   AND ((b AND c) 
38c0: 4f 52 20 28 64 20 41 4e 44 20 65 29 29 20 41 4e  OR (d AND e)) AN
38d0: 44 20 66 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  D f.**.** There 
38e0: 61 72 65 20 73 65 70 61 72 61 74 65 20 57 68 65  are separate Whe
38f0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 73  reClause objects
3900: 20 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 63   for the whole c
3910: 6c 61 75 73 65 20 61 6e 64 20 66 6f 72 0a 2a 2a  lause and for.**
3920: 20 74 68 65 20 73 75 62 63 6c 61 75 73 65 73 20   the subclauses 
3930: 22 28 62 20 41 4e 44 20 63 29 22 20 61 6e 64 20  "(b AND c)" and 
3940: 22 28 64 20 41 4e 44 20 65 29 22 2e 20 20 54 68  "(d AND e)".  Th
3950: 65 20 70 4f 75 74 65 72 20 66 69 65 6c 64 20 6f  e pOuter field o
3960: 66 20 74 68 65 0a 2a 2a 20 73 75 62 63 6c 61 75  f the.** subclau
3970: 73 65 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ses points to th
3980: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
3990: 6a 65 63 74 20 66 6f 72 20 74 68 65 20 77 68 6f  ject for the who
39a0: 6c 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  le clause..*/.st
39b0: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
39c0: 20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a   {.  WhereInfo *
39d0: 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 2f 2a  pWInfo;       /*
39e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
39f0: 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74  ocessing context
3a00: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
3a10: 65 20 2a 70 4f 75 74 65 72 3b 20 20 20 20 20 2f  e *pOuter;     /
3a20: 2a 20 4f 75 74 65 72 20 63 6f 6e 6a 75 6e 63 74  * Outer conjunct
3a30: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f 70 3b 20  ion */.  u8 op; 
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 2f 2a 20 53 70 6c 69 74 20 6f 70 65 72 61    /* Split opera
3a60: 74 6f 72 2e 20 20 54 4b 5f 41 4e 44 20 6f 72 20  tor.  TK_AND or 
3a70: 54 4b 5f 4f 52 20 2a 2f 0a 20 20 69 6e 74 20 6e  TK_OR */.  int n
3a80: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
3a90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3aa0: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
3ab0: 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20  nSlot;          
3ac0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3ad0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 5b 5d  f entries in a[]
3ae0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
3af0: 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *a;            /
3b00: 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73 63 72  * Each a[] descr
3b10: 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ibes a term of t
3b20: 68 65 20 57 48 45 52 45 20 63 6c 75 61 73 65 20  he WHERE cluase 
3b30: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
3b40: 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f 53 54 41 43  QLITE_SMALL_STAC
3b50: 4b 29 0a 20 20 57 68 65 72 65 54 65 72 6d 20 61  K).  WhereTerm a
3b60: 53 74 61 74 69 63 5b 31 5d 3b 20 20 20 20 2f 2a  Static[1];    /*
3b70: 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63 20   Initial static 
3b80: 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f  space for a[] */
3b90: 0a 23 65 6c 73 65 0a 20 20 57 68 65 72 65 54 65  .#else.  WhereTe
3ba0: 72 6d 20 61 53 74 61 74 69 63 5b 38 5d 3b 20 20  rm aStatic[8];  
3bb0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
3bc0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
3bd0: 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  ] */.#endif.};..
3be0: 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72  /*.** A WhereTer
3bf0: 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f 72  m with eOperator
3c00: 3d 3d 57 4f 5f 4f 52 20 68 61 73 20 69 74 73 20  ==WO_OR has its 
3c10: 75 2e 70 4f 72 49 6e 66 6f 20 70 6f 69 6e 74 65  u.pOrInfo pointe
3c20: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79  r set to.** a dy
3c30: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
3c40: 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ted instance of 
3c50: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3c60: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
3c70: 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 7b  ct WhereOrInfo {
3c80: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 77  .  WhereClause w
3c90: 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  c;          /* D
3ca0: 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 69 6e 74  ecomposition int
3cb0: 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
3cc0: 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c  Bitmask indexabl
3cd0: 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  e;       /* Bitm
3ce0: 61 73 6b 20 6f 66 20 61 6c 6c 20 69 6e 64 65 78  ask of all index
3cf0: 61 62 6c 65 20 74 61 62 6c 65 73 20 69 6e 20 74  able tables in t
3d00: 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 7d 3b 0a  he clause */.};.
3d10: 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65  ./*.** A WhereTe
3d20: 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f  rm with eOperato
3d30: 72 3d 3d 57 4f 5f 41 4e 44 20 68 61 73 20 69 74  r==WO_AND has it
3d40: 73 20 75 2e 70 41 6e 64 49 6e 66 6f 20 70 6f 69  s u.pAndInfo poi
3d50: 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61  nter set to.** a
3d60: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
3d70: 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20  ocated instance 
3d80: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3d90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
3da0: 74 72 75 63 74 20 57 68 65 72 65 41 6e 64 49 6e  truct WhereAndIn
3db0: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
3dc0: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
3dd0: 2f 2a 20 54 68 65 20 73 75 62 65 78 70 72 65 73  /* The subexpres
3de0: 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f 75 74 20  sion broken out 
3df0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
3e00: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3e10: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
3e20: 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20  ure keeps track 
3e30: 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  of a mapping.** 
3e40: 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75 72  between VDBE cur
3e50: 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64 20  sor numbers and 
3e60: 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74 6d  bits of the bitm
3e70: 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65 72  asks in WhereTer
3e80: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  m..**.** The VDB
3e90: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
3ea0: 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67   are small integ
3eb0: 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ers contained in
3ec0: 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74 65   .** SrcList_ite
3ed0: 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45 78  m.iCursor and Ex
3ee0: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
3ef0: 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65 6e  .  For any given
3f00: 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75 73   WHERE .** claus
3f10: 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  e, the cursor nu
3f20: 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74 20  mbers might not 
3f30: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
3f40: 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20 63   they might.** c
3f50: 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20 74  ontain gaps in t
3f60: 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65 71  he numbering seq
3f70: 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20 77  uence.  But we w
3f80: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78 69  ant to make maxi
3f90: 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74 68  mum.** use of th
3fa0: 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62 69  e bits in our bi
3fb0: 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73 74  tmasks.  This st
3fc0: 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65 73  ructure provides
3fd0: 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66 72   a mapping.** fr
3fe0: 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63 75  om the sparse cu
3ff0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
4000: 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e  o consecutive in
4010: 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  tegers beginning
4020: 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a  .** with 0..**.*
4030: 2a 20 49 66 20 57 68 65 72 65 4d 61 73 6b 53 65  * If WhereMaskSe
4040: 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65  t.ix[A]==B it me
4050: 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d 74  ans that The A-t
4060: 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d 61  h bit of a Bitma
4070: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  sk.** correspond
4080: 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  s VDBE cursor nu
4090: 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d 74  mber B.  The A-t
40a0: 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d 61  h bit of a bitma
40b0: 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a  sk is 1<<A..**.*
40c0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
40d0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
40e0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73  se expression us
40f0: 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a 2a  ed these VDBE.**
4100: 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c   cursors:  4, 5,
4110: 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e 20   8, 29, 57, 73. 
4120: 20 54 68 65 6e 20 74 68 65 20 20 57 68 65 72 65   Then the  Where
4130: 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
4140: 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74  e.** would map t
4150: 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  hose cursor numb
4160: 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20  ers into bits 0 
4170: 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a  through 5..**.**
4180: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d   Note that the m
4190: 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  apping is not ne
41a0: 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65  cessarily ordere
41b0: 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70  d.  In the examp
41c0: 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65  le.** above, the
41d0: 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67   mapping might g
41e0: 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d  o like this:  4-
41f0: 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20  >3, 5->1, 8->2, 
4200: 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c  29->0,.** 57->5,
4210: 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20   73->4.  Or one 
4220: 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d  of 719 other com
4230: 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20  binations might 
4240: 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64  be used. It.** d
4250: 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d  oes not really m
4260: 61 74 74 65 72 2e 20 20 57 68 61 74 20 69 73 20  atter.  What is 
4270: 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61  important is tha
4280: 74 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a  t sparse cursor.
4290: 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67  ** numbers all g
42a0: 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62  et mapped into b
42b0: 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20  it numbers that 
42c0: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
42d0: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67   contain.** no g
42e0: 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  aps..*/.struct W
42f0: 68 65 72 65 4d 61 73 6b 53 65 74 20 7b 0a 20 20  hereMaskSet {.  
4300: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4320: 20 4e 75 6d 62 65 72 20 6f 66 20 61 73 73 69 67   Number of assig
4330: 6e 65 64 20 63 75 72 73 6f 72 20 76 61 6c 75 65  ned cursor value
4340: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 42 4d  s */.  int ix[BM
4350: 53 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  S];             
4360: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 61       /* Cursor a
4370: 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68 20  ssigned to each 
4380: 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  bit */.};../*.**
4390: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   This object is 
43a0: 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  a convenience wr
43b0: 61 70 70 65 72 20 68 6f 6c 64 69 6e 67 20 61 6c  apper holding al
43c0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  l information ne
43d0: 65 64 65 64 0a 2a 2a 20 74 6f 20 63 6f 6e 73 74  eded.** to const
43e0: 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ruct WhereLoop o
43f0: 62 6a 65 63 74 73 20 66 6f 72 20 61 20 70 61 72  bjects for a par
4400: 74 69 63 75 6c 61 72 20 71 75 65 72 79 2e 0a 2a  ticular query..*
4410: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f  /.struct WhereLo
4420: 6f 70 42 75 69 6c 64 65 72 20 7b 0a 20 20 57 68  opBuilder {.  Wh
4430: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
4440: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
4450: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
4460: 73 20 57 48 45 52 45 20 2a 2f 0a 20 20 57 68 65  s WHERE */.  Whe
4470: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
4480: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
4490: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a  clause terms */.
44a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
44b0: 65 72 42 79 3b 20 20 20 20 20 20 20 2f 2a 20 4f  erBy;       /* O
44c0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
44d0: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
44e0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  New;          /*
44f0: 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
4500: 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72  oop */.  WhereOr
4510: 53 65 74 20 2a 70 4f 72 53 65 74 3b 20 20 20 20  Set *pOrSet;    
4520: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 62 65 73     /* Record bes
4530: 74 20 6c 6f 6f 70 73 20 68 65 72 65 2c 20 69 66  t loops here, if
4540: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 23 69 66   not NULL */.#if
4550: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4560: 45 5f 53 54 41 54 34 0a 20 20 55 6e 70 61 63 6b  E_STAT4.  Unpack
4570: 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 3b 20  edRecord *pRec; 
4580: 20 20 20 20 2f 2a 20 50 72 6f 62 65 20 66 6f 72      /* Probe for
4590: 20 73 74 61 74 34 20 28 69 66 20 72 65 71 75 69   stat4 (if requi
45a0: 72 65 64 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  red) */.  int nR
45b0: 65 63 56 61 6c 69 64 3b 20 20 20 20 20 20 20 20  ecValid;        
45c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
45d0: 20 76 61 6c 69 64 20 66 69 65 6c 64 73 20 63 75   valid fields cu
45e0: 72 72 65 6e 74 6c 79 20 69 6e 20 70 52 65 63 20  rrently in pRec 
45f0: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
4600: 0a 2a 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c  .** The WHERE cl
4610: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
4620: 72 6f 75 74 69 6e 65 20 68 61 73 20 74 77 6f 20  routine has two 
4630: 68 61 6c 76 65 73 2e 20 20 54 68 65 0a 2a 2a 20  halves.  The.** 
4640: 66 69 72 73 74 20 70 61 72 74 20 64 6f 65 73 20  first part does 
4650: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
4660: 20 57 48 45 52 45 20 6c 6f 6f 70 20 61 6e 64 20   WHERE loop and 
4670: 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 68 61  the second.** ha
4680: 6c 66 20 64 6f 65 73 20 74 68 65 20 74 61 69 6c  lf does the tail
4690: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f   of the WHERE lo
46a0: 6f 70 2e 20 20 41 6e 20 69 6e 73 74 61 6e 63 65  op.  An instance
46b0: 20 6f 66 0a 2a 2a 20 74 68 69 73 20 73 74 72 75   of.** this stru
46c0: 63 74 75 72 65 20 69 73 20 72 65 74 75 72 6e 65  cture is returne
46d0: 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 68  d by the first h
46e0: 61 6c 66 20 61 6e 64 20 70 61 73 73 65 64 0a 2a  alf and passed.*
46f0: 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 63 6f 6e  * into the secon
4700: 64 20 68 61 6c 66 20 74 6f 20 67 69 76 65 20 73  d half to give s
4710: 6f 6d 65 20 63 6f 6e 74 69 6e 75 69 74 79 2e 0a  ome continuity..
4720: 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  **.** An instanc
4730: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
4740: 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6d 70 6c   holds the compl
4750: 65 74 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  ete state of the
4760: 20 71 75 65 72 79 0a 2a 2a 20 70 6c 61 6e 6e 65   query.** planne
4770: 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  r..*/.struct Whe
4780: 72 65 49 6e 66 6f 20 7b 0a 20 20 50 61 72 73 65  reInfo {.  Parse
4790: 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
47a0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
47b0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
47c0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
47d0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
47e0: 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st;        /* Li
47f0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
4800: 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78  the join */.  Ex
4810: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
4820: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  ;       /* The O
4830: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
4840: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  r NULL */.  Expr
4850: 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74  List *pResultSet
4860: 3b 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20  ;     /* Result 
4870: 73 65 74 2e 20 44 49 53 54 49 4e 43 54 20 6f 70  set. DISTINCT op
4880: 65 72 61 74 65 73 20 6f 6e 20 74 68 65 73 65 20  erates on these 
4890: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
48a0: 70 4c 6f 6f 70 73 3b 20 20 20 20 20 20 20 20 2f  pLoops;        /
48b0: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 57 68  * List of all Wh
48c0: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
48d0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 76  */.  Bitmask rev
48e0: 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  Mask;          /
48f0: 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20  * Mask of ORDER 
4900: 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 6e 65  BY terms that ne
4910: 65 64 20 72 65 76 65 72 73 69 6e 67 20 2a 2f 0a  ed reversing */.
4920: 20 20 57 68 65 72 65 43 6f 73 74 20 6e 52 6f 77    WhereCost nRow
4930: 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  Out;        /* E
4940: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
4950: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a  of output rows *
4960: 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
4970: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs;           /*
4980: 20 46 6c 61 67 73 20 6f 72 69 67 69 6e 61 6c 6c   Flags originall
4990: 79 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  y passed to sqli
49a0: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
49b0: 2a 2f 0a 20 20 75 38 20 62 4f 42 53 61 74 3b 20  */.  u8 bOBSat; 
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
49d0: 2a 20 4f 52 44 45 52 20 42 59 20 73 61 74 69 73  * ORDER BY satis
49e0: 66 69 65 64 20 62 79 20 69 6e 64 69 63 65 73 20  fied by indices 
49f0: 2a 2f 0a 20 20 75 38 20 6f 6b 4f 6e 65 50 61 73  */.  u8 okOnePas
4a00: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
4a10: 2a 20 4f 6b 20 74 6f 20 75 73 65 20 6f 6e 65 2d  * Ok to use one-
4a20: 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 66  pass algorithm f
4a30: 6f 72 20 55 50 44 41 54 45 2f 44 45 4c 45 54 45  or UPDATE/DELETE
4a40: 20 2a 2f 0a 20 20 75 38 20 75 6e 74 65 73 74 65   */.  u8 unteste
4a50: 64 54 65 72 6d 73 3b 20 20 20 20 20 20 20 20 20  dTerms;         
4a60: 2f 2a 20 4e 6f 74 20 61 6c 6c 20 57 48 45 52 45  /* Not all WHERE
4a70: 20 74 65 72 6d 73 20 72 65 73 6f 6c 76 65 64 20   terms resolved 
4a80: 62 79 20 6f 75 74 65 72 20 6c 6f 6f 70 20 2a 2f  by outer loop */
4a90: 0a 20 20 75 38 20 65 44 69 73 74 69 6e 63 74 3b  .  u8 eDistinct;
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4ab0: 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
4ac0: 5f 44 49 53 54 49 4e 43 54 5f 2a 20 76 61 6c 75  _DISTINCT_* valu
4ad0: 65 73 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38  es below */.  u8
4ae0: 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20   nLevel;        
4af0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b00: 72 20 6f 66 20 6e 65 73 74 65 64 20 6c 6f 6f 70  r of nested loop
4b10: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f 70 3b 20   */.  int iTop; 
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 2f 2a 20 54 68 65 20 76 65 72 79 20 62 65 67 69  /* The very begi
4b40: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 57 48 45  nning of the WHE
4b50: 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  RE loop */.  int
4b60: 20 69 43 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20   iContinue;     
4b70: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
4b80: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
4b90: 77 69 74 68 20 6e 65 78 74 20 72 65 63 6f 72 64  with next record
4ba0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
4bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4bc0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
4bd0: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
4be0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 73   loop */.  int s
4bf0: 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 20  avedNQueryLoop; 
4c00: 20 20 20 20 20 2f 2a 20 70 50 61 72 73 65 2d 3e       /* pParse->
4c10: 6e 51 75 65 72 79 4c 6f 6f 70 20 6f 75 74 73 69  nQueryLoop outsi
4c20: 64 65 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  de the WHERE loo
4c30: 70 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  p */.  WhereMask
4c40: 53 65 74 20 73 4d 61 73 6b 53 65 74 3b 20 20 20  Set sMaskSet;   
4c50: 20 2f 2a 20 4d 61 70 20 63 75 72 73 6f 72 20 6e   /* Map cursor n
4c60: 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73  umbers to bitmas
4c70: 6b 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ks */.  WhereCla
4c80: 75 73 65 20 73 57 43 3b 20 20 20 20 20 20 20 20  use sWC;        
4c90: 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69    /* Decompositi
4ca0: 6f 6e 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  on of the WHERE 
4cb0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
4cc0: 65 4c 65 76 65 6c 20 61 5b 31 5d 3b 20 20 20 20  eLevel a[1];    
4cd0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
4ce0: 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68 20  tion about each 
4cf0: 6e 65 73 74 20 6c 6f 6f 70 20 69 6e 20 57 48 45  nest loop in WHE
4d00: 52 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  RE */.};../*.** 
4d10: 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65  Bitmasks for the
4d20: 20 6f 70 65 72 61 74 6f 72 73 20 6f 6e 20 57 68   operators on Wh
4d30: 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 73 2e  ereTerm objects.
4d40: 20 20 54 68 65 73 65 20 61 72 65 20 61 6c 6c 0a    These are all.
4d50: 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
4d60: 74 20 61 72 65 20 6f 66 20 69 6e 74 65 72 65 73  t are of interes
4d70: 74 20 74 6f 20 74 68 65 20 71 75 65 72 79 20 70  t to the query p
4d80: 6c 61 6e 6e 65 72 2e 20 20 41 6e 0a 2a 2a 20 4f  lanner.  An.** O
4d90: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  R-ed combination
4da0: 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65 73   of these values
4db0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
4dc0: 6e 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 0a  n searching for.
4dd0: 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 57 68  ** particular Wh
4de0: 65 72 65 54 65 72 6d 73 20 77 69 74 68 69 6e 20  ereTerms within 
4df0: 61 20 57 68 65 72 65 43 6c 61 75 73 65 2e 0a 2a  a WhereClause..*
4e00: 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20  /.#define WO_IN 
4e10: 20 20 20 20 30 78 30 30 31 0a 23 64 65 66 69 6e      0x001.#defin
4e20: 65 20 57 4f 5f 45 51 20 20 20 20 20 30 78 30 30  e WO_EQ     0x00
4e30: 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20  2.#define WO_LT 
4e40: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
4e50: 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  LT-TK_EQ)).#defi
4e60: 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f  ne WO_LE     (WO
4e70: 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45  _EQ<<(TK_LE-TK_E
4e80: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47  Q)).#define WO_G
4e90: 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  T     (WO_EQ<<(T
4ea0: 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65  K_GT-TK_EQ)).#de
4eb0: 66 69 6e 65 20 57 4f 5f 47 45 20 20 20 20 20 28  fine WO_GE     (
4ec0: 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b  WO_EQ<<(TK_GE-TK
4ed0: 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f  _EQ)).#define WO
4ee0: 5f 4d 41 54 43 48 20 20 30 78 30 34 30 0a 23 64  _MATCH  0x040.#d
4ef0: 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20  efine WO_ISNULL 
4f00: 30 78 30 38 30 0a 23 64 65 66 69 6e 65 20 57 4f  0x080.#define WO
4f10: 5f 4f 52 20 20 20 20 20 30 78 31 30 30 20 20 20  _OR     0x100   
4f20: 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f      /* Two or mo
4f30: 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  re OR-connected 
4f40: 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65  terms */.#define
4f50: 20 57 4f 5f 41 4e 44 20 20 20 20 30 78 32 30 30   WO_AND    0x200
4f60: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
4f70: 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e 65 63   more AND-connec
4f80: 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65  ted terms */.#de
4f90: 66 69 6e 65 20 57 4f 5f 45 51 55 49 56 20 20 30  fine WO_EQUIV  0
4fa0: 78 34 30 30 20 20 20 20 20 20 20 2f 2a 20 4f 66  x400       /* Of
4fb0: 20 74 68 65 20 66 6f 72 6d 20 41 3d 3d 42 2c 20   the form A==B, 
4fc0: 62 6f 74 68 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  both columns */.
4fd0: 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20  #define WO_NOOP 
4fe0: 20 20 30 78 38 30 30 20 20 20 20 20 20 20 2f 2a    0x800       /*
4ff0: 20 54 68 69 73 20 74 65 72 6d 20 64 6f 65 73 20   This term does 
5000: 6e 6f 74 20 72 65 73 74 72 69 63 74 20 73 65 61  not restrict sea
5010: 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 0a 23 64  rch space */..#d
5020: 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20  efine WO_ALL    
5030: 30 78 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d  0xfff       /* M
5040: 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69  ask of all possi
5050: 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20  ble WO_* values 
5060: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49  */.#define WO_SI
5070: 4e 47 4c 45 20 30 78 30 66 66 20 20 20 20 20 20  NGLE 0x0ff      
5080: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
5090: 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f  non-compound WO_
50a0: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a  * values */../*.
50b0: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 64 65 66  ** These are def
50c0: 69 6e 69 74 69 6f 6e 73 20 6f 66 20 62 69 74 73  initions of bits
50d0: 20 69 6e 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   in the WhereLoo
50e0: 70 2e 77 73 46 6c 61 67 73 20 66 69 65 6c 64 2e  p.wsFlags field.
50f0: 0a 2a 2a 20 54 68 65 20 70 61 72 74 69 63 75 6c  .** The particul
5100: 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ar combination o
5110: 66 20 62 69 74 73 20 69 6e 20 65 61 63 68 20 57  f bits in each W
5120: 68 65 72 65 4c 6f 6f 70 20 68 65 6c 70 20 74 6f  hereLoop help to
5130: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 74 68  .** determine th
5140: 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74  e algorithm that
5150: 20 57 68 65 72 65 4c 6f 6f 70 20 72 65 70 72 65   WhereLoop repre
5160: 73 65 6e 74 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  sents..*/.#defin
5170: 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  e WHERE_COLUMN_E
5180: 51 20 20 20 20 30 78 30 30 30 30 30 30 30 31 20  Q    0x00000001 
5190: 20 2f 2a 20 78 3d 45 58 50 52 20 2a 2f 0a 23 64   /* x=EXPR */.#d
51a0: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
51b0: 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30 30 30 30  MN_RANGE 0x00000
51c0: 30 30 32 20 20 2f 2a 20 78 3c 45 58 50 52 20 61  002  /* x<EXPR a
51d0: 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a  nd/or x>EXPR */.
51e0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
51f0: 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78 30 30 30  LUMN_IN    0x000
5200: 30 30 30 30 34 20 20 2f 2a 20 78 20 49 4e 20 28  00004  /* x IN (
5210: 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ...) */.#define 
5220: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
5230: 4c 20 20 30 78 30 30 30 30 30 30 30 38 20 20 2f  L  0x00000008  /
5240: 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23  * x IS NULL */.#
5250: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4e  define WHERE_CON
5260: 53 54 52 41 49 4e 54 20 20 20 30 78 30 30 30 30  STRAINT   0x0000
5270: 30 30 30 66 20 20 2f 2a 20 41 6e 79 20 6f 66 20  000f  /* Any of 
5280: 74 68 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  the WHERE_COLUMN
5290: 5f 78 78 78 20 76 61 6c 75 65 73 20 2a 2f 0a 23  _xxx values */.#
52a0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54 4f 50  define WHERE_TOP
52b0: 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 30 30  _LIMIT    0x0000
52c0: 30 30 31 30 20 20 2f 2a 20 78 3c 45 58 50 52 20  0010  /* x<EXPR 
52d0: 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e 73 74  or x<=EXPR const
52e0: 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  raint */.#define
52f0: 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
5300: 20 20 20 20 30 78 30 30 30 30 30 30 32 30 20 20      0x00000020  
5310: 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20 78 3e 3d  /* x>EXPR or x>=
5320: 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20  EXPR constraint 
5330: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
5340: 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20 20 30 78  _BOTH_LIMIT   0x
5350: 30 30 30 30 30 30 33 30 20 20 2f 2a 20 42 6f 74  00000030  /* Bot
5360: 68 20 78 3e 45 58 50 52 20 61 6e 64 20 78 3c 45  h x>EXPR and x<E
5370: 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  XPR */.#define W
5380: 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20  HERE_IDX_ONLY   
5390: 20 20 30 78 30 30 30 30 30 30 34 30 20 20 2f 2a    0x00000040  /*
53a0: 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   Use index only 
53b0: 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a  - omit table */.
53c0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 50  #define WHERE_IP
53d0: 4b 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30  K          0x000
53e0: 30 30 31 30 30 20 20 2f 2a 20 78 20 69 73 20 74  00100  /* x is t
53f0: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
5400: 52 59 20 4b 45 59 20 2a 2f 0a 23 64 65 66 69 6e  RY KEY */.#defin
5410: 65 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  e WHERE_INDEXED 
5420: 20 20 20 20 20 30 78 30 30 30 30 30 32 30 30 20       0x00000200 
5430: 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75 2e   /* WhereLoop.u.
5440: 62 74 72 65 65 2e 70 49 6e 64 65 78 20 69 73 20  btree.pIndex is 
5450: 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66 69 6e 65  valid */.#define
5460: 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
5470: 42 4c 45 20 30 78 30 30 30 30 30 34 30 30 20 20  BLE 0x00000400  
5480: 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75 2e 76  /* WhereLoop.u.v
5490: 74 61 62 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  tab is valid */.
54a0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 4e  #define WHERE_IN
54b0: 5f 41 42 4c 45 20 20 20 20 20 20 30 78 30 30 30  _ABLE      0x000
54c0: 30 30 38 30 30 20 20 2f 2a 20 41 62 6c 65 20 74  00800  /* Able t
54d0: 6f 20 73 75 70 70 6f 72 74 20 61 6e 20 49 4e 20  o support an IN 
54e0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66  operator */.#def
54f0: 69 6e 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  ine WHERE_ONEROW
5500: 20 20 20 20 20 20 20 30 78 30 30 30 30 31 30 30         0x0000100
5510: 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f  0  /* Selects no
5520: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
5530: 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  ow */.#define WH
5540: 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20 20 20  ERE_MULTI_OR    
5550: 20 30 78 30 30 30 30 32 30 30 30 20 20 2f 2a 20   0x00002000  /* 
5560: 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c  OR using multipl
5570: 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 23 64 65  e indices */.#de
5580: 66 69 6e 65 20 57 48 45 52 45 5f 41 55 54 4f 5f  fine WHERE_AUTO_
5590: 49 4e 44 45 58 20 20 20 30 78 30 30 30 30 34 30  INDEX   0x000040
55a0: 30 30 20 20 2f 2a 20 55 73 65 73 20 61 6e 20 65  00  /* Uses an e
55b0: 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 2a  phemeral index *
55c0: 2f 0a 0a 0a 2f 2a 20 43 6f 6e 76 65 72 74 20 61  /.../* Convert a
55d0: 20 57 68 65 72 65 43 6f 73 74 20 76 61 6c 75 65   WhereCost value
55e0: 20 28 31 30 20 74 69 6d 65 73 20 6c 6f 67 32 28   (10 times log2(
55f0: 58 29 29 20 69 6e 74 6f 20 69 74 73 20 69 6e 74  X)) into its int
5600: 65 67 65 72 20 76 61 6c 75 65 20 58 2e 0a 2a 2a  eger value X..**
5610: 20 41 20 72 6f 75 67 68 20 61 70 70 72 6f 78 69   A rough approxi
5620: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  mation is used. 
5630: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
5640: 6e 65 64 20 69 73 20 6e 6f 74 20 65 78 61 63 74  ned is not exact
5650: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20  ..*/.static u64 
5660: 77 68 65 72 65 43 6f 73 74 54 6f 49 6e 74 28 57  whereCostToInt(W
5670: 68 65 72 65 43 6f 73 74 20 78 29 7b 0a 20 20 75  hereCost x){.  u
5680: 36 34 20 6e 3b 0a 20 20 69 66 28 20 78 3c 31 30  64 n;.  if( x<10
5690: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6e   ) return 1;.  n
56a0: 20 3d 20 78 25 31 30 3b 0a 20 20 78 20 2f 3d 20   = x%10;.  x /= 
56b0: 31 30 3b 0a 20 20 69 66 28 20 6e 3e 3d 35 20 29  10;.  if( n>=5 )
56c0: 20 6e 20 2d 3d 20 32 3b 0a 20 20 65 6c 73 65 20   n -= 2;.  else 
56d0: 69 66 28 20 6e 3e 3d 31 20 29 20 6e 20 2d 3d 20  if( n>=1 ) n -= 
56e0: 31 3b 0a 20 20 69 66 28 20 78 3e 3d 33 20 29 20  1;.  if( x>=3 ) 
56f0: 72 65 74 75 72 6e 20 28 6e 2b 38 29 3c 3c 28 78  return (n+8)<<(x
5700: 2d 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 6e  -3);.  return (n
5710: 2b 38 29 3e 3e 28 33 2d 78 29 3b 0a 7d 0a 0a 2f  +8)>>(3-x);.}../
5720: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5730: 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
5740: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
5750: 66 72 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61  from a WHERE cla
5760: 75 73 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74  use.*/.u64 sqlit
5770: 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77  e3WhereOutputRow
5780: 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20  Count(WhereInfo 
5790: 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75  *pWInfo){.  retu
57a0: 72 6e 20 77 68 65 72 65 43 6f 73 74 54 6f 49 6e  rn whereCostToIn
57b0: 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  t(pWInfo->nRowOu
57c0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
57d0: 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 57  urn one of the W
57e0: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78 78  HERE_DISTINCT_xx
57f0: 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69 6e  xxx values to in
5800: 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73 0a  dicate how this.
5810: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
5820: 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73 20  returns outputs 
5830: 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f  for DISTINCT pro
5840: 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  cessing..*/.int 
5850: 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
5860: 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66 6f  stinct(WhereInfo
5870: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
5880: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  urn pWInfo->eDis
5890: 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinct;.}../*.** 
58a0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
58b0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
58c0: 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20  returns rows in 
58d0: 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e 0a  ORDER BY order..
58e0: 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  ** Return FALSE 
58f0: 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e 65  if the output ne
5900: 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65 64  eds to be sorted
5910: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5920: 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 57  WhereIsOrdered(W
5930: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
5940: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  ){.  return pWIn
5950: 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30 3b 0a 7d  fo->bOBSat!=0;.}
5960: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5970: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
5980: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
5990: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
59a0: 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65  continue.** imme
59b0: 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65  diately with the
59c0: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57   next row of a W
59d0: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
59e0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
59f0: 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68  ContinueLabel(Wh
5a00: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
5a10: 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  {.  return pWInf
5a20: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  o->iContinue;.}.
5a30: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5a40: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
5a50: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
5a60: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  to in order to b
5a70: 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61  reak.** out of a
5a80: 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a   WHERE loop..*/.
5a90: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
5aa0: 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72 65  BreakLabel(Where
5ab0: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
5ac0: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
5ad0: 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iBreak;.}../*.**
5ae0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5af0: 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
5b00: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 63 61  ETE statement ca
5b10: 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65 63 74  n operate direct
5b20: 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f 77  ly on.** the row
5b30: 69 64 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ids returned by 
5b40: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  a WHERE clause. 
5b50: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
5b60: 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55 50 44   doing an.** UPD
5b70: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6d 69  ATE or DELETE mi
5b80: 67 68 74 20 63 68 61 6e 67 65 20 73 75 62 73 65  ght change subse
5b90: 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c 61 75  quent WHERE clau
5ba0: 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 69  se results..*/.i
5bb0: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f  nt sqlite3WhereO
5bc0: 6b 4f 6e 65 50 61 73 73 28 57 68 65 72 65 49 6e  kOnePass(WhereIn
5bd0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
5be0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6f 6b  eturn pWInfo->ok
5bf0: 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  OnePass;.}../*.*
5c00: 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f 6e 74 65  * Move the conte
5c10: 6e 74 20 6f 66 20 70 53 72 63 20 69 6e 74 6f 20  nt of pSrc into 
5c20: 70 44 65 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  pDest.*/.static 
5c30: 76 6f 69 64 20 77 68 65 72 65 4f 72 4d 6f 76 65  void whereOrMove
5c40: 28 57 68 65 72 65 4f 72 53 65 74 20 2a 70 44 65  (WhereOrSet *pDe
5c50: 73 74 2c 20 57 68 65 72 65 4f 72 53 65 74 20 2a  st, WhereOrSet *
5c60: 70 53 72 63 29 7b 0a 20 20 70 44 65 73 74 2d 3e  pSrc){.  pDest->
5c70: 6e 20 3d 20 70 53 72 63 2d 3e 6e 3b 0a 20 20 6d  n = pSrc->n;.  m
5c80: 65 6d 63 70 79 28 70 44 65 73 74 2d 3e 61 2c 20  emcpy(pDest->a, 
5c90: 70 53 72 63 2d 3e 61 2c 20 70 44 65 73 74 2d 3e  pSrc->a, pDest->
5ca0: 6e 2a 73 69 7a 65 6f 66 28 70 44 65 73 74 2d 3e  n*sizeof(pDest->
5cb0: 61 5b 30 5d 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  a[0]));.}../*.**
5cc0: 20 54 72 79 20 74 6f 20 69 6e 73 65 72 74 20 61   Try to insert a
5cd0: 20 6e 65 77 20 70 72 65 72 65 71 75 69 73 69 74   new prerequisit
5ce0: 65 2f 63 6f 73 74 20 65 6e 74 72 79 20 69 6e 74  e/cost entry int
5cf0: 6f 20 74 68 65 20 57 68 65 72 65 4f 72 53 65 74  o the WhereOrSet
5d00: 20 70 53 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pSet..**.** The
5d10: 20 6e 65 77 20 65 6e 74 72 79 20 6d 69 67 68 74   new entry might
5d20: 20 6f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78   overwrite an ex
5d30: 69 73 74 69 6e 67 20 65 6e 74 72 79 2c 20 6f 72  isting entry, or
5d40: 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20   it might be.** 
5d50: 61 70 70 65 6e 64 65 64 2c 20 6f 72 20 69 74 20  appended, or it 
5d60: 6d 69 67 68 74 20 62 65 20 64 69 73 63 61 72 64  might be discard
5d70: 65 64 2e 20 20 44 6f 20 77 68 61 74 65 76 65 72  ed.  Do whatever
5d80: 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 68   is the right th
5d90: 69 6e 67 0a 2a 2a 20 73 6f 20 74 68 61 74 20 70  ing.** so that p
5da0: 53 65 74 20 6b 65 65 70 73 20 74 68 65 20 4e 5f  Set keeps the N_
5db0: 4f 52 5f 43 4f 53 54 20 62 65 73 74 20 65 6e 74  OR_COST best ent
5dc0: 72 69 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72  ries seen so far
5dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5de0: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 0a 20  whereOrInsert(. 
5df0: 20 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53 65   WhereOrSet *pSe
5e00: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  t,      /* The W
5e10: 68 65 72 65 4f 72 53 65 74 20 74 6f 20 62 65 20  hereOrSet to be 
5e20: 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 42 69 74  updated */.  Bit
5e30: 6d 61 73 6b 20 70 72 65 72 65 71 2c 20 20 20 20  mask prereq,    
5e40: 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 69 73      /* Prerequis
5e50: 69 74 65 73 20 6f 66 20 74 68 65 20 6e 65 77 20  ites of the new 
5e60: 65 6e 74 72 79 20 2a 2f 0a 20 20 57 68 65 72 65  entry */.  Where
5e70: 43 6f 73 74 20 72 52 75 6e 2c 20 20 20 20 20 20  Cost rRun,      
5e80: 20 20 2f 2a 20 52 75 6e 2d 63 6f 73 74 20 6f 66    /* Run-cost of
5e90: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a   the new entry *
5ea0: 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e 4f  /.  WhereCost nO
5eb0: 75 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ut         /* Nu
5ec0: 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73 20  mber of outputs 
5ed0: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
5ee0: 79 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 69 3b  y */.){.  u16 i;
5ef0: 0a 20 20 57 68 65 72 65 4f 72 43 6f 73 74 20 2a  .  WhereOrCost *
5f00: 70 3b 0a 20 20 66 6f 72 28 69 3d 70 53 65 74 2d  p;.  for(i=pSet-
5f10: 3e 6e 2c 20 70 3d 70 53 65 74 2d 3e 61 3b 20 69  >n, p=pSet->a; i
5f20: 3e 30 3b 20 69 2d 2d 2c 20 70 2b 2b 29 7b 0a 20  >0; i--, p++){. 
5f30: 20 20 20 69 66 28 20 72 52 75 6e 3c 3d 70 2d 3e     if( rRun<=p->
5f40: 72 52 75 6e 20 26 26 20 28 70 72 65 72 65 71 20  rRun && (prereq 
5f50: 26 20 70 2d 3e 70 72 65 72 65 71 29 3d 3d 70 72  & p->prereq)==pr
5f60: 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 67 6f  ereq ){.      go
5f70: 74 6f 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74  to whereOrInsert
5f80: 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  _done;.    }.   
5f90: 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52   if( p->rRun<=rR
5fa0: 75 6e 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71  un && (p->prereq
5fb0: 20 26 20 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70   & prereq)==p->p
5fc0: 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 72  rereq ){.      r
5fd0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
5fe0: 20 7d 0a 20 20 69 66 28 20 70 53 65 74 2d 3e 6e   }.  if( pSet->n
5ff0: 3c 4e 5f 4f 52 5f 43 4f 53 54 20 29 7b 0a 20 20  <N_OR_COST ){.  
6000: 20 20 70 20 3d 20 26 70 53 65 74 2d 3e 61 5b 70    p = &pSet->a[p
6010: 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a 20 20 20 20 70  Set->n++];.    p
6020: 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a 20  ->nOut = nOut;. 
6030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
6040: 70 53 65 74 2d 3e 61 3b 0a 20 20 20 20 66 6f 72  pSet->a;.    for
6050: 28 69 3d 31 3b 20 69 3c 70 53 65 74 2d 3e 6e 3b  (i=1; i<pSet->n;
6060: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
6070: 20 70 2d 3e 72 52 75 6e 3e 70 53 65 74 2d 3e 61   p->rRun>pSet->a
6080: 5b 69 5d 2e 72 52 75 6e 20 29 20 70 20 3d 20 70  [i].rRun ) p = p
6090: 53 65 74 2d 3e 61 20 2b 20 69 3b 0a 20 20 20 20  Set->a + i;.    
60a0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75  }.    if( p->rRu
60b0: 6e 3c 3d 72 52 75 6e 20 29 20 72 65 74 75 72 6e  n<=rRun ) return
60c0: 20 30 3b 0a 20 20 7d 0a 77 68 65 72 65 4f 72 49   0;.  }.whereOrI
60d0: 6e 73 65 72 74 5f 64 6f 6e 65 3a 0a 20 20 70 2d  nsert_done:.  p-
60e0: 3e 70 72 65 72 65 71 20 3d 20 70 72 65 72 65 71  >prereq = prereq
60f0: 3b 0a 20 20 70 2d 3e 72 52 75 6e 20 3d 20 72 52  ;.  p->rRun = rR
6100: 75 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 75  un;.  if( p->nOu
6110: 74 3e 6e 4f 75 74 20 29 20 70 2d 3e 6e 4f 75 74  t>nOut ) p->nOut
6120: 20 3d 20 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72   = nOut;.  retur
6130: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 1;.}../*.** In
6140: 69 74 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c  itialize a preal
6150: 6c 6f 63 61 74 65 64 20 57 68 65 72 65 43 6c 61  located WhereCla
6160: 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  use structure..*
6170: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
6180: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20  ereClauseInit(. 
6190: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
61a0: 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  C,        /* The
61b0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20   WhereClause to 
61c0: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  be initialized *
61d0: 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
61e0: 57 49 6e 66 6f 20 20 20 20 20 20 20 20 2f 2a 20  WInfo        /* 
61f0: 54 68 65 20 57 48 45 52 45 20 70 72 6f 63 65 73  The WHERE proces
6200: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6210: 29 7b 0a 20 20 70 57 43 2d 3e 70 57 49 6e 66 6f  ){.  pWC->pWInfo
6220: 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 70 57 43   = pWInfo;.  pWC
6230: 2d 3e 70 4f 75 74 65 72 20 3d 20 30 3b 0a 20 20  ->pOuter = 0;.  
6240: 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a  pWC->nTerm = 0;.
6250: 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41    pWC->nSlot = A
6260: 72 72 61 79 53 69 7a 65 28 70 57 43 2d 3e 61 53  rraySize(pWC->aS
6270: 74 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61  tatic);.  pWC->a
6280: 20 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b   = pWC->aStatic;
6290: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
62a0: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
62b0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61  ic void whereCla
62c0: 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c  useClear(WhereCl
62d0: 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44  ause*);../*.** D
62e0: 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65  eallocate all me
62f0: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
6300: 77 69 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e  with a WhereOrIn
6310: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
6320: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f  atic void whereO
6330: 72 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69  rInfoDelete(sqli
6340: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72  te3 *db, WhereOr
6350: 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72  Info *p){.  wher
6360: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d  eClauseClear(&p-
6370: 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  >wc);.  sqlite3D
6380: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
6390: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
63a0: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
63b0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57  ociated with a W
63c0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65  hereAndInfo obje
63d0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
63e0: 69 64 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44  id whereAndInfoD
63f0: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
6400: 62 2c 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20  b, WhereAndInfo 
6410: 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75  *p){.  whereClau
6420: 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b  seClear(&p->wc);
6430: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
6440: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
6450: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57  * Deallocate a W
6460: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
6470: 74 75 72 65 2e 20 20 54 68 65 20 57 68 65 72 65  ture.  The Where
6480: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
6490: 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f  .** itself is no
64a0: 74 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 72  t freed.  This r
64b0: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e  outine is the in
64c0: 76 65 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c  verse of whereCl
64d0: 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73  auseInit()..*/.s
64e0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
64f0: 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72  ClauseClear(Wher
6500: 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20  eClause *pWC){. 
6510: 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54   int i;.  WhereT
6520: 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65  erm *a;.  sqlite
6530: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49  3 *db = pWC->pWI
6540: 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
6550: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
6560: 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b  erm-1, a=pWC->a;
6570: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29   i>=0; i--, a++)
6580: 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46  {.    if( a->wtF
6590: 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41  lags & TERM_DYNA
65a0: 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MIC ){.      sql
65b0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
65c0: 62 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20  b, a->pExpr);.  
65d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e 77    }.    if( a->w
65e0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
65f0: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68  INFO ){.      wh
6600: 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28  ereOrInfoDelete(
6610: 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f  db, a->u.pOrInfo
6620: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
6630: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
6640: 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20  RM_ANDINFO ){.  
6650: 20 20 20 20 77 68 65 72 65 41 6e 64 49 6e 66 6f      whereAndInfo
6660: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
6670: 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  pAndInfo);.    }
6680: 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e  .  }.  if( pWC->
6690: 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  a!=pWC->aStatic 
66a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
66b0: 46 72 65 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Free(db, pWC->a)
66c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
66d0: 64 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  dd a single new 
66e0: 57 68 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20  WhereTerm entry 
66f0: 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  to the WhereClau
6700: 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a  se object pWC..*
6710: 2a 20 54 68 65 20 6e 65 77 20 57 68 65 72 65 54  * The new WhereT
6720: 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  erm object is co
6730: 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45  nstructed from E
6740: 78 70 72 20 70 20 61 6e 64 20 77 69 74 68 20 77  xpr p and with w
6750: 74 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69  tFlags..** The i
6760: 6e 64 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d  ndex in pWC->a[]
6770: 20 6f 66 20 74 68 65 20 6e 65 77 20 57 68 65 72   of the new Wher
6780: 65 54 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65  eTerm is returne
6790: 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  d on success..**
67a0: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   0 is returned i
67b0: 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54  f the new WhereT
67c0: 65 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  erm could not be
67d0: 20 61 64 64 65 64 20 64 75 65 20 74 6f 20 61 20   added due to a 
67e0: 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61  memory.** alloca
67f0: 74 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  tion error.  The
6800: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6810: 6f 6e 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20  on failure will 
6820: 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a  be recorded in.*
6830: 2a 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63  * the db->malloc
6840: 46 61 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74  Failed flag so t
6850: 68 61 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c  hat higher-level
6860: 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64   functions can d
6870: 65 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  etect it..**.** 
6880: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
6890: 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  l increase the s
68a0: 69 7a 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e  ize of the pWC->
68b0: 61 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63  a[] array as nec
68c0: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
68d0: 20 74 68 65 20 77 74 46 6c 61 67 73 20 61 72 67   the wtFlags arg
68e0: 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54  ument includes T
68f0: 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65  ERM_DYNAMIC, the
6900: 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  n responsibility
6910: 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20  .** for freeing 
6920: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
6930: 20 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 74   is assumed by t
6940: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
6950: 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68  bject pWC..** Th
6960: 69 73 20 69 73 20 74 72 75 65 20 65 76 65 6e 20  is is true even 
6970: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
6980: 66 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74  fails to allocat
6990: 65 20 61 20 6e 65 77 20 57 68 65 72 65 54 65 72  e a new WhereTer
69a0: 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  m..**.** WARNING
69b0: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
69c0: 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65  might reallocate
69d0: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
69e0: 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72  to store.** Wher
69f0: 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69  eTerms.  All poi
6a00: 6e 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65  nters to WhereTe
6a10: 72 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  rms should be in
6a20: 76 61 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a  validated after.
6a30: 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** calling this 
6a40: 72 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70  routine.  Such p
6a50: 6f 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72  ointers may be r
6a60: 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20  einitialized by 
6a70: 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74  referencing.** t
6a80: 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61  he pWC->a[] arra
6a90: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
6aa0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
6ab0: 72 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  rt(WhereClause *
6ac0: 70 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 38  pWC, Expr *p, u8
6ad0: 20 77 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65   wtFlags){.  Whe
6ae0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
6af0: 20 69 6e 74 20 69 64 78 3b 0a 20 20 74 65 73 74   int idx;.  test
6b00: 63 61 73 65 28 20 77 74 46 6c 61 67 73 20 26 20  case( wtFlags & 
6b10: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
6b20: 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
6b30: 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a  >=pWC->nSlot ){.
6b40: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
6b50: 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20  Old = pWC->a;.  
6b60: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6b70: 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
6b80: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43  rse->db;.    pWC
6b90: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
6ba0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
6bb0: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
6bc0: 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20  WC->nSlot*2 );. 
6bd0: 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30     if( pWC->a==0
6be0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 74   ){.      if( wt
6bf0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e  Flags & TERM_DYN
6c00: 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20  AMIC ){.        
6c10: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6c20: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
6c30: 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d  }.      pWC->a =
6c40: 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74   pOld;.      ret
6c50: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
6c60: 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20   memcpy(pWC->a, 
6c70: 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43  pOld, sizeof(pWC
6c80: 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65  ->a[0])*pWC->nTe
6c90: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  rm);.    if( pOl
6ca0: 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  d!=pWC->aStatic 
6cb0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6cc0: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64 29  DbFree(db, pOld)
6cd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d  ;.    }.    pWC-
6ce0: 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33  >nSlot = sqlite3
6cf0: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
6d00: 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28   pWC->a)/sizeof(
6d10: 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a  pWC->a[0]);.  }.
6d20: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
6d30: 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65  a[idx = pWC->nTe
6d40: 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e  rm++];.  pTerm->
6d50: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
6d60: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
6d70: 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  );.  pTerm->wtFl
6d80: 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20  ags = wtFlags;. 
6d90: 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57   pTerm->pWC = pW
6da0: 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  C;.  pTerm->iPar
6db0: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ent = -1;.  retu
6dc0: 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn idx;.}../*.**
6dd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64   This routine id
6de0: 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72  entifies subexpr
6df0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
6e00: 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72  HERE clause wher
6e10: 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70  e.** each subexp
6e20: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
6e30: 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20  ated by the AND 
6e40: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65  operator or some
6e50: 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74   other.** operat
6e60: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
6e70: 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72  the op parameter
6e80: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
6e90: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
6ea0: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70  is filled with p
6eb0: 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78  ointers to subex
6ec0: 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20  pressions.  For 
6ed0: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
6ee0: 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c    WHERE  a=='hel
6ef0: 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65  lo' AND coalesce
6f00: 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63  (b,11)<10 AND (c
6f10: 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29  +12!=d OR c==22)
6f20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f  .**           \_
6f30: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
6f40: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  _____________/  
6f50: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
6f60: 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
6f70: 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20      slot[0]     
6f80: 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20         slot[1]  
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f               slo
6fa0: 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  t[2].**.** The o
6fb0: 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
6fc0: 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73  ause in pExpr is
6fd0: 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c   unaltered.  All
6fe0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
6ff0: 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c   does is make sl
7000: 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69  ot[] entries poi
7010: 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75  nt to substructu
7020: 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e  re within pExpr.
7030: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72  .**.** In the pr
7040: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20  evious sentence 
7050: 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72  and in the diagr
7060: 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66  am, "slot[]" ref
7070: 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68  ers to.** the Wh
7080: 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72  ereClause.a[] ar
7090: 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d  ray.  The slot[]
70a0: 20 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20   array grows as 
70b0: 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69  needed to contai
70c0: 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f  n.** all terms o
70d0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
70e0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
70f0: 69 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68  id whereSplit(Wh
7100: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
7110: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75 38 20  Expr *pExpr, u8 
7120: 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20 3d  op){.  pWC->op =
7130: 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72   op;.  if( pExpr
7140: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7150: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f  if( pExpr->op!=o
7160: 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  p ){.    whereCl
7170: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
7180: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c  pExpr, 0);.  }el
7190: 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  se{.    whereSpl
71a0: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
71b0: 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77  Left, op);.    w
71c0: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
71d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
71e0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
71f0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57 68 65  Initialize a Whe
7200: 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65 63 74  reMaskSet object
7210: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74  .*/.#define init
7220: 4d 61 73 6b 53 65 74 28 50 29 20 20 28 50 29 2d  MaskSet(P)  (P)-
7230: 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  >n=0../*.** Retu
7240: 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  rn the bitmask f
7250: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  or the given cur
7260: 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  sor number.  Ret
7270: 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72  urn 0 if.** iCur
7280: 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  sor is not in th
7290: 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e set..*/.static
72a0: 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b   Bitmask getMask
72b0: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
72c0: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
72d0: 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rsor){.  int i;.
72e0: 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53    assert( pMaskS
72f0: 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65  et->n<=(int)size
7300: 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b  of(Bitmask)*8 );
7310: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d  .  for(i=0; i<pM
7320: 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b  askSet->n; i++){
7330: 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65  .    if( pMaskSe
7340: 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f  t->ix[i]==iCurso
7350: 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  r ){.      retur
7360: 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  n MASKBIT(i);.  
7370: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7380: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
7390: 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66  ate a new mask f
73a0: 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f  or cursor iCurso
73b0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  r..**.** There i
73c0: 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72  s one cursor per
73d0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
73e0: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  OM clause.  The 
73f0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62  number of.** tab
7400: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
7410: 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65  clause is limite
7420: 64 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c  d by a test earl
7430: 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  y in the.** sqli
7440: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
7450: 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20  routine.  So we 
7460: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d  know that the pM
7470: 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20  askSet->ix[].** 
7480: 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72  array will never
7490: 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74   overflow..*/.st
74a0: 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65  atic void create
74b0: 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65  Mask(WhereMaskSe
74c0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
74d0: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73   iCursor){.  ass
74e0: 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e  ert( pMaskSet->n
74f0: 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61   < ArraySize(pMa
7500: 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20  skSet->ix) );.  
7510: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61  pMaskSet->ix[pMa
7520: 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43  skSet->n++] = iC
7530: 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ursor;.}../*.** 
7540: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 77  These routines w
7550: 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65 6c 79  alk (recursively
7560: 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  ) an expression 
7570: 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72 61 74  tree and generat
7580: 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69  e.** a bitmask i
7590: 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63 68 20  ndicating which 
75a0: 74 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  tables are used 
75b0: 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  in that expressi
75c0: 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f 0a 73  on.** tree..*/.s
75d0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
75e0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
75f0: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20  (WhereMaskSet*, 
7600: 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
7610: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53  ic Bitmask exprS
7620: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
7630: 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20 53  WhereMaskSet*, S
7640: 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20  elect*);.static 
7650: 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c  Bitmask exprTabl
7660: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
7670: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45  Set *pMaskSet, E
7680: 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61  xpr *p){.  Bitma
7690: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
76a0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
76b0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d   0;.  if( p->op=
76c0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
76d0: 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b    mask = getMask
76e0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54  (pMaskSet, p->iT
76f0: 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72  able);.    retur
7700: 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61  n mask;.  }.  ma
7710: 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  sk = exprTableUs
7720: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
7730: 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b  >pRight);.  mask
7740: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
7750: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
7760: 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 45 78  pLeft);.  if( Ex
7770: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
7780: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
7790: 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  {.    mask |= ex
77a0: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
77b0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
77c0: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65  x.pSelect);.  }e
77d0: 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  lse{.    mask |=
77e0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
77f0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
7800: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  >x.pList);.  }. 
7810: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
7820: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
7830: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
7840: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  e(WhereMaskSet *
7850: 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69  pMaskSet, ExprLi
7860: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
7870: 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  t i;.  Bitmask m
7880: 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ask = 0;.  if( p
7890: 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
78a0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
78b0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
78c0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
78d0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
78e0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
78f0: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
7900: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
7910: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
7920: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
7930: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
7940: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c  t *pMaskSet, Sel
7950: 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d  ect *pS){.  Bitm
7960: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  ask mask = 0;.  
7970: 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20 20 20  while( pS ){.   
7980: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
7990: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 6d   pS->pSrc;.    m
79a0: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
79b0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
79c0: 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b  et, pS->pEList);
79d0: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
79e0: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
79f0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47  pMaskSet, pS->pG
7a00: 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73  roupBy);.    mas
7a10: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
7a20: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
7a30: 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b  , pS->pOrderBy);
7a40: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
7a50: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
7a60: 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65  kSet, pS->pWhere
7a70: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
7a80: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
7a90: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76  askSet, pS->pHav
7aa0: 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 41 4c  ing);.    if( AL
7ab0: 57 41 59 53 28 70 53 72 63 21 3d 30 29 20 29 7b  WAYS(pSrc!=0) ){
7ac0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
7ad0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7ae0: 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
7af0: 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d  .        mask |=
7b00: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
7b10: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
7b20: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pSrc->a[i].pSele
7b30: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 61 73  ct);.        mas
7b40: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
7b50: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
7b60: 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20  rc->a[i].pOn);. 
7b70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7b80: 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72   pS = pS->pPrior
7b90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
7ba0: 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ask;.}../*.** Re
7bb0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
7bc0: 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20   given operator 
7bd0: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70  is one of the op
7be0: 65 72 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a  erators that is.
7bf0: 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61  ** allowed for a
7c00: 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52  n indexable WHER
7c10: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20  E clause term.  
7c20: 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72  The allowed oper
7c30: 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22  ators are.** "="
7c40: 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22  , "<", ">", "<="
7c50: 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c 20 61 6e  , ">=", "IN", an
7c60: 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a 2f 0a 73  d "IS NULL".*/.s
7c70: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65  tatic int allowe
7c80: 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61  dOp(int op){.  a
7c90: 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f  ssert( TK_GT>TK_
7ca0: 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47  EQ && TK_GT<TK_G
7cb0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
7cc0: 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_LT>TK_EQ && TK
7cd0: 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _LT<TK_GE );.  a
7ce0: 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f  ssert( TK_LE>TK_
7cf0: 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47  EQ && TK_LE<TK_G
7d00: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
7d10: 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b  K_GE==TK_EQ+4 );
7d20: 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b  .  return op==TK
7d30: 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45  _IN || (op>=TK_E
7d40: 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20  Q && op<=TK_GE) 
7d50: 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  || op==TK_ISNULL
7d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20  ;.}../*.** Swap 
7d70: 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20 74  two objects of t
7d80: 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23 64 65  ype TYPE..*/.#de
7d90: 66 69 6e 65 20 53 57 41 50 28 54 59 50 45 2c 41  fine SWAP(TYPE,A
7da0: 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b 20 41  ,B) {TYPE t=A; A
7db0: 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a  =B; B=t;}../*.**
7dc0: 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61   Commute a compa
7dd0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
7de0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
7df0: 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70 20 59  the form "X op Y
7e00: 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74  ".** are convert
7e10: 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20 58 22  ed into "Y op X"
7e20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66 74 2f  ..**.** If left/
7e30: 72 69 67 68 74 20 70 72 65 63 65 64 65 6e 63 65  right precedence
7e40: 20 72 75 6c 65 73 20 63 6f 6d 65 20 69 6e 74 6f   rules come into
7e50: 20 70 6c 61 79 20 77 68 65 6e 20 64 65 74 65 72   play when deter
7e60: 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  mining the.** co
7e70: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
7e80: 2c 20 74 68 65 6e 20 43 4f 4c 4c 41 54 45 20 6f  , then COLLATE o
7e90: 70 65 72 61 74 6f 72 73 20 61 72 65 20 61 64 6a  perators are adj
7ea0: 75 73 74 65 64 20 74 6f 20 65 6e 73 75 72 65 0a  usted to ensure.
7eb0: 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f 6c 6c  ** that the coll
7ec0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 64  ating sequence d
7ed0: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20  oes not change. 
7ee0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
7ef0: 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41   "Y collate NOCA
7f00: 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73  SE op X" becomes
7f10: 20 22 58 20 6f 70 20 59 22 20 62 65 63 61 75 73   "X op Y" becaus
7f20: 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  e any collation 
7f30: 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74  sequence on.** t
7f40: 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73 69 64  he left hand sid
7f50: 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  e of a compariso
7f60: 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20  n overrides any 
7f70: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7f80: 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20  ce .** attached 
7f90: 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 46 6f  to the right. Fo
7fa0: 72 20 74 68 65 20 73 61 6d 65 20 72 65 61 73 6f  r the same reaso
7fb0: 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65  n the EP_Collate
7fc0: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20   flag.** is not 
7fd0: 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  commuted..*/.sta
7fe0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d  tic void exprCom
7ff0: 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50 61 72  mute(Parse *pPar
8000: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
8010: 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67 68 74  {.  u16 expRight
8020: 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68   = (pExpr->pRigh
8030: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
8040: 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78  llate);.  u16 ex
8050: 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e  pLeft = (pExpr->
8060: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
8070: 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73  P_Collate);.  as
8080: 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28  sert( allowedOp(
8090: 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 70 45  pExpr->op) && pE
80a0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29  xpr->op!=TK_IN )
80b0: 3b 0a 20 20 69 66 28 20 65 78 70 52 69 67 68 74  ;.  if( expRight
80c0: 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20 20 20  ==expLeft ){.   
80d0: 20 2f 2a 20 45 69 74 68 65 72 20 58 20 61 6e 64   /* Either X and
80e0: 20 59 20 62 6f 74 68 20 68 61 76 65 20 43 4f 4c   Y both have COL
80f0: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 6f 72  LATE operator or
8100: 20 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f 0a 20   neither do */. 
8110: 20 20 20 69 66 28 20 65 78 70 52 69 67 68 74 20     if( expRight 
8120: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f 74 68  ){.      /* Both
8130: 20 58 20 61 6e 64 20 59 20 68 61 76 65 20 43 4f   X and Y have CO
8140: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 2e  LLATE operators.
8150: 20 20 4d 61 6b 65 20 73 75 72 65 20 58 20 69 73    Make sure X is
8160: 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 2a 2a   always.      **
8170: 20 75 73 65 64 20 62 79 20 63 6c 65 61 72 69 6e   used by clearin
8180: 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65  g the EP_Collate
8190: 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20 2a 2f   flag from Y. */
81a0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52  .      pExpr->pR
81b0: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  ight->flags &= ~
81c0: 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  EP_Collate;.    
81d0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
81e0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
81f0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
8200: 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  t)!=0 ){.      /
8210: 2a 20 4e 65 69 74 68 65 72 20 58 20 6e 6f 72 20  * Neither X nor 
8220: 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f  Y have COLLATE o
8230: 70 65 72 61 74 6f 72 73 2c 20 62 75 74 20 58 20  perators, but X 
8240: 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c  has a non-defaul
8250: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 6c 61  t.      ** colla
8260: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20  ting sequence.  
8270: 53 6f 20 61 64 64 20 74 68 65 20 45 50 5f 43 6f  So add the EP_Co
8280: 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f 6e 20  llate marker on 
8290: 58 20 74 6f 20 63 61 75 73 65 0a 20 20 20 20 20  X to cause.     
82a0: 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 73 65 61   ** it to be sea
82b0: 72 63 68 65 64 20 66 69 72 73 74 2e 20 2a 2f 0a  rched first. */.
82c0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
82d0: 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ft->flags |= EP_
82e0: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 0a 20  Collate;.    }. 
82f0: 20 7d 0a 20 20 53 57 41 50 28 45 78 70 72 2a 2c   }.  SWAP(Expr*,
8300: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70 45  pExpr->pRight,pE
8310: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  xpr->pLeft);.  i
8320: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b  f( pExpr->op>=TK
8330: 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _GT ){.    asser
8340: 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b  t( TK_LT==TK_GT+
8350: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
8360: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20   TK_GE==TK_LE+2 
8370: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  );.    assert( T
8380: 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20  K_GT>TK_EQ );.  
8390: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3c    assert( TK_GT<
83a0: 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73  TK_LE );.    ass
83b0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d  ert( pExpr->op>=
83c0: 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d 3e  TK_GT && pExpr->
83d0: 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20  op<=TK_GE );.   
83e0: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70   pExpr->op = ((p
83f0: 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e  Expr->op-TK_GT)^
8400: 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a  2)+TK_GT;.  }.}.
8410: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65  ./*.** Translate
8420: 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72   from TK_xx oper
8430: 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62 69  ator to WO_xx bi
8440: 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  tmask..*/.static
8450: 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d 61 73   u16 operatorMas
8460: 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36  k(int op){.  u16
8470: 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c   c;.  assert( al
8480: 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20  lowedOp(op) );. 
8490: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
84a0: 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b  {.    c = WO_IN;
84b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
84c0: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
84d0: 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b    c = WO_ISNULL;
84e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
84f0: 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f  sert( (WO_EQ<<(o
8500: 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78 37 66  p-TK_EQ)) < 0x7f
8510: 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20 28 75  ff );.    c = (u
8520: 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  16)(WO_EQ<<(op-T
8530: 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73  K_EQ));.  }.  as
8540: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e  sert( op!=TK_ISN
8550: 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e  ULL || c==WO_ISN
8560: 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ULL );.  assert(
8570: 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d   op!=TK_IN || c=
8580: 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65  =WO_IN );.  asse
8590: 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  rt( op!=TK_EQ ||
85a0: 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61   c==WO_EQ );.  a
85b0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54  ssert( op!=TK_LT
85c0: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a   || c==WO_LT );.
85d0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
85e0: 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20  _LE || c==WO_LE 
85f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
8600: 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GT || c==WO_
8610: 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GT );.  assert( 
8620: 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d  op!=TK_GE || c==
8630: 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75 72  WO_GE );.  retur
8640: 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n c;.}../*.** Ad
8650: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
8660: 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61 74  t WhereTerm that
8670: 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64 69   matches accordi
8680: 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65 72  ng to the criter
8690: 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68 65  ia.** establishe
86a0: 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61 6e  d when the pScan
86b0: 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69 74   object was init
86c0: 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72 65  ialized by where
86d0: 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52  ScanInit()..** R
86e0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
86f0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
8700: 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54 65  matching WhereTe
8710: 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  rms..*/.static W
8720: 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53  hereTerm *whereS
8730: 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63 61  canNext(WhereSca
8740: 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74  n *pScan){.  int
8750: 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
8760: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
8770: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
8780: 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  e term */.  int 
8790: 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
87a0: 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f   /* The column o
87b0: 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
87c0: 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49   term.  -1 for I
87d0: 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58  PK */.  Expr *pX
87e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
87f0: 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65  An expression be
8800: 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ing tested */.  
8810: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
8820: 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e  ;    /* Shorthan
8830: 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43  d for pScan->pWC
8840: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
8850: 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68  *pTerm;    /* Th
8860: 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65 73  e term being tes
8870: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d  ted */.  int k =
8880: 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a   pScan->k;    /*
8890: 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74 20   Where to start 
88a0: 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77  scanning */..  w
88b0: 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45 71  hile( pScan->iEq
88c0: 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75  uiv<=pScan->nEqu
88d0: 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d  iv ){.    iCur =
88e0: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70   pScan->aEquiv[p
88f0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32 5d 3b  Scan->iEquiv-2];
8900: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
8910: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63  Scan->aEquiv[pSc
8920: 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20  an->iEquiv-1];. 
8930: 20 20 20 77 68 69 6c 65 28 20 28 70 57 43 20 3d     while( (pWC =
8940: 20 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20   pScan->pWC)!=0 
8950: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65  ){.      for(pTe
8960: 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70  rm=pWC->a+k; k<p
8970: 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20  WC->nTerm; k++, 
8980: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
8990: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
89a0: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 26 26  tCursor==iCur &&
89b0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
89c0: 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b  lumn==iColumn ){
89d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
89e0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
89f0: 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30 0a   & WO_EQUIV)!=0.
8a00: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53             && pS
8a10: 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72 61  can->nEquiv<Arra
8a20: 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 45 71  ySize(pScan->aEq
8a30: 75 69 76 29 0a 20 20 20 20 20 20 20 20 20 20 29  uiv).          )
8a40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
8a50: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t j;.           
8a60: 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78 70   pX = sqlite3Exp
8a70: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54 65  rSkipCollate(pTe
8a80: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
8a90: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
8aa0: 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
8ab0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
8ac0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
8ad0: 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75 69  ; j<pScan->nEqui
8ae0: 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20 20 20  v; j+=2){.      
8af0: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63 61          if( pSca
8b00: 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d 70 58  n->aEquiv[j]==pX
8b10: 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20  ->iTable.       
8b20: 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e          && pScan
8b30: 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d 70  ->aEquiv[j+1]==p
8b40: 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  X->iColumn ){.  
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
8b70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8b80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8b90: 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e   if( j==pScan->n
8ba0: 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20  Equiv ){.       
8bb0: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45         pScan->aE
8bc0: 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54  quiv[j] = pX->iT
8bd0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
8be0: 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69      pScan->aEqui
8bf0: 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43 6f  v[j+1] = pX->iCo
8c00: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
8c10: 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69      pScan->nEqui
8c20: 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  v += 2;.        
8c30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8c40: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
8c50: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
8c60: 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73  r & pScan->opMas
8c70: 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
8c80: 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
8c90: 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20  he affinity and 
8ca0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8cb0: 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  ce match */.    
8cc0: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63 61          if( pSca
8cd0: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26 20  n->zCollName && 
8ce0: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
8cf0: 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d  r & WO_ISNULL)==
8d00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8d10: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
8d20: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
8d30: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
8d40: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50   pWC->pWInfo->pP
8d50: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
8d60: 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e      pX = pTerm->
8d70: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
8d80: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
8d90: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
8da0: 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78 61  (pX, pScan->idxa
8db0: 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ff) ){.         
8dc0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8dd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
8de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
8df0: 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74 29  ssert(pX->pLeft)
8e00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8e10: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
8e20: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
8e30: 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Seq(pParse,.    
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
8e70: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
8e80: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
8e90: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30      if( pColl==0
8ea0: 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73   ) pColl = pPars
8eb0: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
8ec0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8ed0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
8ee0: 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
8ef0: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
8f00: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
8f10: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8f40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
8f50: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8f60: 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20 20  & WO_EQ)!=0.    
8f70: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58 20           && (pX 
8f80: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
8f90: 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f  pRight)->op==TK_
8fa0: 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20  COLUMN.         
8fb0: 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62 6c      && pX->iTabl
8fc0: 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  e==pScan->aEquiv
8fd0: 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [0].            
8fe0: 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d   && pX->iColumn=
8ff0: 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 31  =pScan->aEquiv[1
9000: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b  ].            ){
9010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
9020: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
9030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9040: 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b     pScan->k = k+
9050: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
9060: 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20  eturn pTerm;.   
9070: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9080: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
9090: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53   pScan->pWC = pS
90a0: 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65 72  can->pWC->pOuter
90b0: 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20  ;.      k = 0;. 
90c0: 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e     }.    pScan->
90d0: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72  pWC = pScan->pOr
90e0: 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b  igWC;.    k = 0;
90f0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71 75  .    pScan->iEqu
9100: 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72  iv += 2;.  }.  r
9110: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
9120: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
9130: 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61 6e  HERE clause scan
9140: 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65 74  ner object.  Ret
9150: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
9160: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61   the.** first ma
9170: 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  tch.  Return NUL
9180: 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  L if there are n
9190: 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  o matches..**.**
91a0: 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69 6c   The scanner wil
91b0: 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20 74  l be searching t
91c0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
91d0: 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c 6f  pWC.  It will lo
91e0: 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73 20  ok.** for terms 
91f0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
9200: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
9210: 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43  e X is column iC
9220: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a 2a  olumn of table.*
9230: 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f 70  * iCur.  The <op
9240: 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  > must be one of
9250: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 64   the operators d
9260: 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d 61  escribed by opMa
9270: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  sk..**.** If the
9280: 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20 58   search is for X
9290: 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20 63   and the WHERE c
92a0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 74  lause contains t
92b0: 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66  erms of the.** f
92c0: 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68 69  orm X=Y then thi
92d0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
92e0: 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72 6d  also return term
92f0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
9300: 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "Y <op> <expr>"
9310: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
9320: 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e 73   levels of trans
9330: 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69 74  itivity is limit
9340: 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65 6e  ed,.** but is en
9350: 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20 6d  ough to handle m
9360: 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63  ost commonly occ
9370: 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74 65  urring SQL state
9380: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ments..**.** If 
9390: 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e 54  X is not the INT
93a0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
93b0: 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65 20   then X must be 
93c0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 0a  compatible with.
93d0: 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  ** index pIdx..*
93e0: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
93f0: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e 69  rm *whereScanIni
9400: 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20 2a  t(.  WhereScan *
9410: 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a 20  pScan,       /* 
9420: 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62  The WhereScan ob
9430: 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74 69  ject being initi
9440: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alized */.  Wher
9450: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
9460: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
9470: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 63   clause to be sc
9480: 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anned */.  int i
9490: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
94a0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
94b0: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  scan for */.  in
94c0: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
94d0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
94e0: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
94f0: 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20 20   u32 opMask,    
9500: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72           /* Oper
9510: 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e 20  ator(s) to scan 
9520: 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  for */.  Index *
9530: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  pIdx            
9540: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
9550: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
9560: 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69   index */.){.  i
9570: 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d 73  nt j;..  /* mems
9580: 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69 7a  et(pScan, 0, siz
9590: 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a 2f  eof(*pScan)); */
95a0: 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57  .  pScan->pOrigW
95b0: 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e  C = pWC;.  pScan
95c0: 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 69  ->pWC = pWC;.  i
95d0: 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c 75  f( pIdx && iColu
95e0: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53 63  mn>=0 ){.    pSc
95f0: 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64  an->idxaff = pId
9600: 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
9610: 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
9620: 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  y;.    for(j=0; 
9630: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
9640: 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  ]!=iColumn; j++)
9650: 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56 45  {.      if( NEVE
9660: 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  R(j>=pIdx->nColu
9670: 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  mn) ) return 0;.
9680: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
9690: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64  >zCollName = pId
96a0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  x->azColl[j];.  
96b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61 6e  }else{.    pScan
96c0: 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20  ->idxaff = 0;.  
96d0: 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61    pScan->zCollNa
96e0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53  me = 0;.  }.  pS
96f0: 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70  can->opMask = op
9700: 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b  Mask;.  pScan->k
9710: 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 61   = 0;.  pScan->a
9720: 45 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b  Equiv[0] = iCur;
9730: 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  .  pScan->aEquiv
9740: 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20  [1] = iColumn;. 
9750: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 3d   pScan->nEquiv =
9760: 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45 71   2;.  pScan->iEq
9770: 75 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75 72  uiv = 2;.  retur
9780: 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  n whereScanNext(
9790: 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pScan);.}../*.**
97a0: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   Search for a te
97b0: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
97c0: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f  clause that is o
97d0: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
97e0: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68  p> <expr>".** wh
97f0: 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72  ere X is a refer
9800: 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c  ence to the iCol
9810: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
9820: 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  r and <op> is on
9830: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78  e of.** the WO_x
9840: 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73  x operator codes
9850: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
9860: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a  e op parameter..
9870: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
9880: 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e  ter to the term.
9890: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
98a0: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54  t found..**.** T
98b0: 68 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64  he term returned
98c0: 20 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70   might by Y=<exp
98d0: 72 3e 20 69 66 20 74 68 65 72 65 20 69 73 20 61  r> if there is a
98e0: 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e  nother constrain
98f0: 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  t in.** the WHER
9900: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 73 70  E clause that sp
9910: 65 63 69 66 69 65 73 20 74 68 61 74 20 58 3d 59  ecifies that X=Y
9920: 2e 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73  .  Any such cons
9930: 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a  traints will be.
9940: 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ** identified by
9950: 20 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69   the WO_EQUIV bi
9960: 74 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e  t in the pTerm->
9970: 65 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e  eOperator field.
9980: 20 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76 5b    The.** aEquiv[
9990: 5d 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58 20  ] array holds X 
99a0: 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69  and all its equi
99b0: 76 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65 61  valents, with ea
99c0: 63 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65 0a  ch SQL variable.
99d0: 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77 6f  ** taking up two
99e0: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
99f0: 5b 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20 73  [].  The first s
9a00: 6c 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20 63  lot is for the c
9a10: 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a 20  ursor number.** 
9a20: 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 69  and the second i
9a30: 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  s for the column
9a40: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65 20   number.  There 
9a50: 61 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e 20  are 22 slots in 
9a60: 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74  aEquiv[].** so t
9a70: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
9a80: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
9a90: 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20   up to 10 other 
9aa0: 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65  equivalent value
9ab0: 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73 65  s..** Hence a se
9ac0: 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20  arch for X will 
9ad0: 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66  return <expr> if
9ae0: 20 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32 20   X=A1 and A1=A2 
9af0: 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e 64  and A2=A3.** and
9b00: 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20   ... and A9=A10 
9b10: 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a  and A10=<expr>..
9b20: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
9b30: 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  re multiple term
9b40: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
9b50: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
9b60: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
9b70: 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f  ".** then try fo
9b80: 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e  r the one with n
9b90: 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f  o dependencies o
9ba0: 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74  n <expr> - in ot
9bb0: 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a  her words where.
9bc0: 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  ** <expr> is a c
9bd0: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
9be0: 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  on of some kind.
9bf0: 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e    Only return en
9c00: 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  tries of.** the 
9c10: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
9c20: 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c  where Y is a col
9c30: 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  umn in another t
9c40: 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73  able if no terms
9c50: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
9c60: 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65  "X <op> <const-e
9c70: 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49  xpr>" exist.   I
9c80: 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20  f no terms with 
9c90: 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a  a constant RHS.*
9ca0: 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20  * exist, try to 
9cb0: 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68  return a term th
9cc0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
9cd0: 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74 61  WO_EQUIV..*/.sta
9ce0: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66  tic WhereTerm *f
9cf0: 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65  indTerm(.  Where
9d00: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
9d10: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
9d20: 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63  ause to be searc
9d30: 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  hed */.  int iCu
9d40: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
9d50: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
9d60: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  of LHS */.  int 
9d70: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  iColumn,        
9d80: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
9d90: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42  er of LHS */.  B
9da0: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
9db0: 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74       /* RHS must
9dc0: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74   not overlap wit
9dd0: 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20  h this mask */. 
9de0: 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20   u32 op,        
9df0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
9e00: 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64  f WO_xx values d
9e10: 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74  escribing operat
9e20: 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  or */.  Index *p
9e30: 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx           /*
9e40: 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   Must be compati
9e50: 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e  ble with this in
9e60: 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  dex, if not NULL
9e70: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
9e80: 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b  rm *pResult = 0;
9e90: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b  .  WhereTerm *p;
9ea0: 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61  .  WhereScan sca
9eb0: 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53  n;..  p = whereS
9ec0: 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
9ed0: 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d  WC, iCur, iColum
9ee0: 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20  n, op, pIdx);.  
9ef0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
9f00: 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52 69  if( (p->prereqRi
9f10: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  ght & notReady)=
9f20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
9f30: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d  p->prereqRight==
9f40: 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61 74  0 && (p->eOperat
9f50: 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b 0a  or&WO_EQ)!=0 ){.
9f60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
9f70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9f80: 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29  if( pResult==0 )
9f90: 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20   pResult = p;.  
9fa0: 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72    }.    p = wher
9fb0: 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
9fc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9fd0: 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Result;.}../* Fo
9fe0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
9ff0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
a000: 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69  xprAnalyze(SrcLi
a010: 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  st*, WhereClause
a020: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
a030: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
a040: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
a050: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
a060: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69    .*/.static voi
a070: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c  d exprAnalyzeAll
a080: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  (.  SrcList *pTa
a090: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  bList,       /* 
a0a0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
a0b0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
a0c0: 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a   *pWC         /*
a0d0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
a0e0: 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  e to be analyzed
a0f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
a100: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
a110: 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rm-1; i>=0; i--)
a120: 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  {.    exprAnalyz
a130: 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43 2c  e(pTabList, pWC,
a140: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e   i);.  }.}..#ifn
a150: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a160: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
a170: 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  N./*.** Check to
a180: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
a190: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
a1a0: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f  a LIKE or GLOB o
a1b0: 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20  perator that.** 
a1c0: 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  can be optimized
a1d0: 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69 74   using inequalit
a1e0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  y constraints.  
a1f0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
a200: 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66  t is.** so and f
a210: 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  alse if not..**.
a220: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  ** In order for 
a230: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  the operator to 
a240: 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20  be optimizible, 
a250: 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65 20  the RHS must be 
a260: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65  a string.** lite
a270: 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ral that does no
a280: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 77  t begin with a w
a290: 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74  ildcard.  .*/.st
a2a0: 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f  atic int isLikeO
a2b0: 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20 2a  rGlob(.  Parse *
a2c0: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
a2d0: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
a2e0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
a2f0: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
a300: 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74  pr,      /* Test
a310: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
a320: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 50   */.  Expr **ppP
a330: 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e 74  refix,  /* Point
a340: 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47 20  er to TK_STRING 
a350: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
a360: 70 61 74 74 65 72 6e 20 70 72 65 66 69 78 20 2a  pattern prefix *
a370: 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70  /.  int *pisComp
a380: 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69 66  lete, /* True if
a390: 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61   the only wildca
a3a0: 72 64 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c  rd is % in the l
a3b0: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f  ast character */
a3c0: 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20  .  int *pnoCase 
a3d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
a3e0: 75 70 70 65 72 63 61 73 65 20 69 73 20 65 71 75  uppercase is equ
a3f0: 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72  ivalent to lower
a400: 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  case */.){.  con
a410: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 20  st char *z = 0; 
a420: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
a430: 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b 45  g on RHS of LIKE
a440: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45   operator */.  E
a450: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
a460: 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69 67  eft;      /* Rig
a470: 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a 65  ht and left size
a480: 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f   of LIKE operato
a490: 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  r */.  ExprList 
a4a0: 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
a4b0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70 65    /* List of ope
a4c0: 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49 4b  rands to the LIK
a4d0: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
a4e0: 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20 20  int c;          
a4f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
a500: 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  e character in z
a510: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  [] */.  int cnt;
a520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a530: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a540: 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65  non-wildcard pre
a550: 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20 2a  fix characters *
a560: 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 20  /.  char wc[3]; 
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a580: 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61 72 61  * Wildcard chara
a590: 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  cters */.  sqlit
a5a0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
a5b0: 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
a5c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
a5d0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
a5e0: 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pVal = 0;.  int
a5f0: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
a600: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64          /* Opcod
a610: 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a 0a  e of pRight */..
a620: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
a630: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c  LikeFunction(db,
a640: 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c   pExpr, pnoCase,
a650: 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75   wc) ){.    retu
a660: 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66  rn 0;.  }.#ifdef
a670: 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 20   SQLITE_EBCDIC. 
a680: 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29 20   if( *pnoCase ) 
a690: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
a6a0: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
a6b0: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c 65  ->x.pList;.  pLe
a6c0: 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d  ft = pList->a[1]
a6d0: 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4c  .pExpr;.  if( pL
a6e0: 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  eft->op!=TK_COLU
a6f0: 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65  MN .   || sqlite
a700: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c  3ExprAffinity(pL
a710: 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46  eft)!=SQLITE_AFF
a720: 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20 49 73 56  _TEXT .   || IsV
a730: 69 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70 54  irtual(pLeft->pT
a740: 61 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ab).  ){.    /* 
a750: 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39 34  IMP: R-02065-494
a760: 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  65 The left-hand
a770: 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49 4b   side of the LIK
a780: 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74  E or GLOB operat
a790: 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  or must.    ** b
a7a0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  e the name of an
a7b0: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20   indexed column 
a7c0: 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e 69  with TEXT affini
a7d0: 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ty. */.    retur
a7e0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 0;.  }.  asser
a7f0: 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  t( pLeft->iColum
a800: 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65  n!=(-1) ); /* Be
a810: 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72 20  cause IPK never 
a820: 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a  has AFF_TEXT */.
a830: 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73  .  pRight = pLis
a840: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
a850: 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70   op = pRight->op
a860: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
a870: 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 6f  EGISTER ){.    o
a880: 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 32 3b  p = pRight->op2;
a890: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
a8a0: 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20  K_VARIABLE ){.  
a8b0: 20 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61    Vdbe *pReprepa
a8c0: 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65  re = pParse->pRe
a8d0: 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74  prepare;.    int
a8e0: 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e   iCol = pRight->
a8f0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61  iColumn;.    pVa
a900: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  l = sqlite3VdbeG
a910: 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 52 65  etBoundValue(pRe
a920: 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53  prepare, iCol, S
a930: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b  QLITE_AFF_NONE);
a940: 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26  .    if( pVal &&
a950: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
a960: 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54  ype(pVal)==SQLIT
a970: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
a980: 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  z = (char *)sqli
a990: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
a9a0: 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
a9b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
a9c0: 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
a9d0: 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  dbe, iCol);.    
a9e0: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e  assert( pRight->
a9f0: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
aa00: 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  || pRight->op==T
aa10: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
aa20: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
aa30: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a  _STRING ){.    z
aa40: 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f   = pRight->u.zTo
aa50: 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ken;.  }.  if( z
aa60: 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b   ){.    cnt = 0;
aa70: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a  .    while( (c=z
aa80: 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d  [cnt])!=0 && c!=
aa90: 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31  wc[0] && c!=wc[1
aaa0: 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b  ] && c!=wc[2] ){
aab0: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
aac0: 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21    }.    if( cnt!
aad0: 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a  =0 && 255!=(u8)z
aae0: 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20  [cnt-1] ){.     
aaf0: 20 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a   Expr *pPrefix;.
ab00: 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65        *pisComple
ab10: 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26  te = c==wc[0] &&
ab20: 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20   z[cnt+1]==0;.  
ab30: 20 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71      pPrefix = sq
ab40: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
ab50: 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20  _STRING, z);.   
ab60: 20 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29     if( pPrefix )
ab70: 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b   pPrefix->u.zTok
ab80: 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20  en[cnt] = 0;.   
ab90: 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70     *ppPrefix = p
aba0: 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66  Prefix;.      if
abb0: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
abc0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  E ){.        Vdb
abd0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
abe0: 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Vdbe;.        sq
abf0: 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
ac00: 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69  ask(v, pRight->i
ac10: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
ac20: 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74   if( *pisComplet
ac30: 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a  e && pRight->u.z
ac40: 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20  Token[1] ){.    
ac50: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
ac60: 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20  rhs of the LIKE 
ac70: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
ac80: 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68  variable, and th
ac90: 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20  e current.      
aca0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
acb0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61  the variable mea
acc0: 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ns there is no n
acd0: 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  eed to invoke th
ace0: 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20  e LIKE.         
acf0: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68   ** function, th
ad00: 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c  en no OP_Variabl
ad10: 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  e will be added 
ad20: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
ad30: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
ad40: 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d  s causes problem
ad50: 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  s for the sqlite
ad60: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
ad70: 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20  _name().        
ad80: 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72    ** API. To wor
ad90: 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64  karound them, ad
ada0: 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72  d a dummy OP_Var
adb0: 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20  iable here..    
adc0: 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
add0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
ade0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
adf0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
ae00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
ae10: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
ae20: 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20  pRight, r1);.   
ae30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ae40: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71  beChangeP3(v, sq
ae50: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
ae60: 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20  Addr(v)-1, 0);. 
ae70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ae80: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
ae90: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
aea0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
aeb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
aec0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
aed0: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
aee0: 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74  ree(pVal);.  ret
aef0: 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65  urn (z!=0);.}.#e
af00: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
af10: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
af20: 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64  ATION */...#ifnd
af30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
af40: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
af50: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
af60: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
af70: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
af80: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
af90: 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48      column MATCH
afa0: 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69   expr.**.** If i
afb0: 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e  t is then return
afc0: 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20   TRUE.  If not, 
afd0: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
afe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61  .static int isMa
aff0: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45  tchOfColumn(.  E
b000: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
b010: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
b020: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
b030: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
b040: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ..  if( pExpr->o
b050: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p!=TK_FUNCTION )
b060: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
b070: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
b080: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
b090: 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22  u.zToken,"match"
b0a0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
b0b0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
b0c0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
b0d0: 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  st;.  if( pList-
b0e0: 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20  >nExpr!=2 ){.   
b0f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
b100: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d   if( pList->a[1]
b110: 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b  .pExpr->op != TK
b120: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72  _COLUMN ){.    r
b130: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
b140: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
b150: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
b160: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
b170: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ../*.** If the p
b180: 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  Base expression 
b190: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
b1a0: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
b1b0: 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69  ause of.** a joi
b1c0: 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  n, then transfer
b1d0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
b1e0: 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74   markings over t
b1f0: 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74  o derived..*/.st
b200: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66  atic void transf
b210: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45  erJoinMarkings(E
b220: 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45  xpr *pDerived, E
b230: 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70  xpr *pBase){.  p
b240: 44 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c  Derived->flags |
b250: 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26  = pBase->flags &
b260: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20   EP_FromJoin;.  
b270: 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74  pDerived->iRight
b280: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73  JoinTable = pBas
b290: 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
b2a0: 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  le;.}..#if !defi
b2b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b2c0: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
b2d0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
b2e0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b2f0: 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  Y)./*.** Analyze
b300: 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e   a term that con
b310: 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20  sists of two or 
b320: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
b330: 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20  d.** subterms.  
b340: 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  So in:.**.**    
b350: 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35   ... WHERE  (a=5
b360: 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d  ) AND (b=7 OR c=
b370: 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28  9 OR d=13) AND (
b380: 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20  d=13).**        
b390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3a0: 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e    ^^^^^^^^^^^^^^
b3b0: 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69  ^^^^^^.**.** Thi
b3c0: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
b3d0: 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  es terms such as
b3e0: 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d   the middle term
b3f0: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78   in the above ex
b400: 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72  ample..** A Wher
b410: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  eOrTerm object i
b420: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61  s computed and a
b430: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
b440: 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61  erm under.** ana
b450: 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73  lysis, regardles
b460: 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
b470: 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73   of the analysis
b480: 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20  .  Hence:.**.** 
b490: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74      WhereTerm.wt
b4a0: 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d  Flags   |=  TERM
b4b0: 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57  _ORINFO.**     W
b4c0: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
b4d0: 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63  fo  =  a dynamic
b4e0: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
b4f0: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
b500: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  t.**.** The term
b510: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
b520: 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72  must have two or
b530: 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e   more of OR-conn
b540: 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a  ected subterms..
b550: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74  ** A single subt
b560: 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73  erm might be a s
b570: 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63  et of AND-connec
b580: 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73  ted sub-subterms
b590: 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66  ..** Examples of
b5a0: 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61   terms under ana
b5b0: 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lysis:.**.**    
b5c0: 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (A)     t1.x=t2
b5d0: 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20  .y OR t1.x=t2.z 
b5e0: 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31  OR t1.y=15 OR t1
b5f0: 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20  .z=t3.a+5.**    
b600: 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31   (B)     x=expr1
b610: 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78   OR expr2=x OR x
b620: 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43  =expr3.**     (C
b630: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
b640: 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e  OR (t1.x=t2.z AN
b650: 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20  D t1.y=15).**   
b660: 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72    (D)     x=expr
b670: 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79  1 OR (y>11 AND y
b680: 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27  <22 AND z LIKE '
b690: 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20  *hello*').**    
b6a0: 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20   (E)     (p.a=1 
b6b0: 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e  AND q.b=2 AND r.
b6c0: 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41  c=3) OR (p.x=4 A
b6d0: 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a  ND q.y=5 AND r.z
b6e0: 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31  =6).**.** CASE 1
b6f0: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
b700: 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  ubterms are of t
b710: 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72  he form T.C=expr
b720: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
b730: 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64   column of C and
b740: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
b750: 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69  le T (as shown i
b760: 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76  n example B abov
b770: 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e) then create a
b780: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
b790: 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20  term that is an 
b7a0: 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78  equivalent IN ex
b7b0: 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74  pression.  In ot
b7c0: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
b7d0: 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20  e term.** being 
b7e0: 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a  analyzed is:.**.
b7f0: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
b800: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
b810: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
b820: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  **.** then creat
b830: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
b840: 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a  term like this:.
b850: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
b860: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
b870: 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32  r3).**.** CASE 2
b880: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
b890: 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65  ubterms are inde
b8a0: 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c  xable by a singl
b8b0: 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  e table T, then 
b8c0: 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  set.**.**     Wh
b8d0: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
b8e0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  r              =
b8f0: 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57    WO_OR.**     W
b900: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
b910: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c  fo->indexable  |
b920: 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  =  the cursor nu
b930: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54  mber for table T
b940: 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  .**.** A subterm
b950: 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20   is "indexable" 
b960: 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20  if it is of the 
b970: 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70  form.** "T.C <op
b980: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
b990: 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  C is any column 
b9a0: 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a  of table T and .
b9b0: 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  ** <op> is one o
b9c0: 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22  f "=", "<", "<="
b9d0: 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53  , ">", ">=", "IS
b9e0: 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e   NULL", or "IN".
b9f0: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
ba00: 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20   also indexable 
ba10: 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20  if it is an AND 
ba20: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  of two or more.*
ba30: 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74  * subsubterms at
ba40: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68   least one of wh
ba50: 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ich is indexable
ba60: 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44  .  Indexable AND
ba70: 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61   .** subterms ha
ba80: 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74  ve their eOperat
ba90: 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44  or set to WO_AND
baa0: 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a   and they have.*
bab0: 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74  * u.pAndInfo set
bac0: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
bad0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
bae0: 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e  eAndTerm object.
baf0: 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74  .**.** From anot
bb00: 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  her point of vie
bb10: 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d  w, "indexable" m
bb20: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
bb30: 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70  bterm could.** p
bb40: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73  otentially be us
bb50: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
bb60: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
bb70: 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e  te index exists.
bb80: 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69  .** This analysi
bb90: 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69  s does not consi
bba0: 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  der whether or n
bbb0: 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69  ot the index exi
bbc0: 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20  sts; that.** is 
bbd0: 64 65 63 69 64 65 64 20 65 6c 73 65 77 68 65 72  decided elsewher
bbe0: 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69  e.  This analysi
bbf0: 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20  s only looks at 
bc00: 77 68 65 74 68 65 72 20 73 75 62 74 65 72 6d 73  whether subterms
bc10: 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
bc20: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69  for indexing exi
bc30: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78  st..**.** All ex
bc40: 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68  amples A through
bc50: 20 45 20 61 62 6f 76 65 20 73 61 74 69 73 66 79   E above satisfy
bc60: 20 63 61 73 65 20 32 2e 20 20 42 75 74 20 69 66   case 2.  But if
bc70: 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20   a term.** also 
bc80: 73 74 61 74 69 73 66 69 65 73 20 63 61 73 65 20  statisfies case 
bc90: 31 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65  1 (such as B) we
bca0: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
bcb0: 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a  ptimizer will.**
bcc0: 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63   always prefer c
bcd0: 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61  ase 1, so in tha
bce0: 74 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e  t case we preten
bcf0: 64 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73  d that case 2 is
bd00: 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65   not.** satisfie
bd10: 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68  d..**.** It migh
bd20: 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
bd30: 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c  at multiple tabl
bd40: 65 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  es are indexable
bd50: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  .  For example,.
bd60: 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20  ** (E) above is 
bd70: 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62  indexable on tab
bd80: 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e  les P, Q, and R.
bd90: 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61  .**.** Terms tha
bda0: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  t satisfy case 2
bdb0: 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20   are candidates 
bdc0: 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73  for lookup by us
bdd0: 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  ing.** separate 
bde0: 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20  indices to find 
bdf0: 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20  rowids for each 
be00: 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70  subterm and comp
be10: 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69  osing.** the uni
be20: 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73  on of all rowids
be30: 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20   using a RowSet 
be40: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73  object.  This is
be50: 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22   similar.** to "
be60: 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20  bitmap indices" 
be70: 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  in other databas
be80: 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a  e engines..**.**
be90: 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a   OTHERWISE:.**.*
bea0: 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73  * If neither cas
beb0: 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61  e 1 nor case 2 a
bec0: 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65  pply, then leave
bed0: 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73   the eOperator s
bee0: 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20  et to.** zero.  
bef0: 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74  This term is not
bf00: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72   useful for sear
bf10: 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ch..*/.static vo
bf20: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72  id exprAnalyzeOr
bf30: 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20  Term(.  SrcList 
bf40: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
bf50: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
bf60: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
bf70: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
bf80: 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c      /* the compl
bf90: 65 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ete WHERE clause
bfa0: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
bfb0: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
bfc0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
bfd0: 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  OR-term to be an
bfe0: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
bff0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
c000: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
c010: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
c020: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
c030: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  g context */.  P
c040: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
c050: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
c060: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
c070: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
c080: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c090: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
c0a0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
c0b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
c0c0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
c0d0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
c0e0: 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65  Term];    /* The
c0f0: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
c100: 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  yzed */.  Expr *
c110: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
c120: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
c130: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
c140: 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20  ion of the term 
c150: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c180: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
c190: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
c1a0: 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20  pOrWc;       /* 
c1b0: 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d  Breakup of pTerm
c1c0: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
c1d0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
c1e0: 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a  OrTerm;       /*
c1f0: 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68   A Sub-term with
c200: 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a  in the pOrWc */.
c210: 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70    WhereOrInfo *p
c220: 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41  OrInfo;     /* A
c230: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
c240: 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ation associated
c250: 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20   with pTerm */. 
c260: 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49   Bitmask chngToI
c270: 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  N;         /* Ta
c280: 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20  bles that might 
c290: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a  satisfy case 1 *
c2a0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
c2b0: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  xable;        /*
c2c0: 20 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65   Tables that are
c2d0: 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69   indexable, sati
c2e0: 73 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f  sfying case 2 */
c2f0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61  ..  /*.  ** Brea
c300: 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  k the OR clause 
c310: 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74  into its separat
c320: 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65  e subterms.  The
c330: 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20   subterms are.  
c340: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57  ** stored in a W
c350: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
c360: 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
c370: 77 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65  within the Where
c380: 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65  OrInfo.  ** obje
c390: 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63  ct that is attac
c3a0: 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69  hed to the origi
c3b0: 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65  nal OR clause te
c3c0: 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  rm..  */.  asser
c3d0: 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  t( (pTerm->wtFla
c3e0: 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d  gs & (TERM_DYNAM
c3f0: 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54  IC|TERM_ORINFO|T
c400: 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30  ERM_ANDINFO))==0
c410: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
c420: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
c430: 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  ;.  pTerm->u.pOr
c440: 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d  Info = pOrInfo =
c450: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c460: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
c470: 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66  *pOrInfo));.  if
c480: 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72  ( pOrInfo==0 ) r
c490: 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e  eturn;.  pTerm->
c4a0: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
c4b0: 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20  ORINFO;.  pOrWc 
c4c0: 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  = &pOrInfo->wc;.
c4d0: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
c4e0: 74 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29  t(pOrWc, pWInfo)
c4f0: 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70  ;.  whereSplit(p
c500: 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f  OrWc, pExpr, TK_
c510: 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79  OR);.  exprAnaly
c520: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57  zeAll(pSrc, pOrW
c530: 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  c);.  if( db->ma
c540: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
c550: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
c560: 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29  OrWc->nTerm>=2 )
c570: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d  ;..  /*.  ** Com
c580: 70 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20  pute the set of 
c590: 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68  tables that migh
c5a0: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20  t satisfy cases 
c5b0: 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69  1 or 2..  */.  i
c5c0: 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74  ndexable = ~(Bit
c5d0: 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f  mask)0;.  chngTo
c5e0: 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  IN = ~(Bitmask)0
c5f0: 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d  ;.  for(i=pOrWc-
c600: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
c610: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
c620: 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69   && indexable; i
c630: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
c640: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
c650: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
c660: 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20  _SINGLE)==0 ){. 
c670: 20 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66       WhereAndInf
c680: 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20  o *pAndInfo;.   
c690: 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54     assert( (pOrT
c6a0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
c6b0: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52  TERM_ANDINFO|TER
c6c0: 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b  M_ORINFO))==0 );
c6d0: 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20  .      chngToIN 
c6e0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49  = 0;.      pAndI
c6f0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
c700: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
c710: 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b  eof(*pAndInfo));
c720: 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 49  .      if( pAndI
c730: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57  nfo ){.        W
c740: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64  hereClause *pAnd
c750: 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72  WC;.        Wher
c760: 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b  eTerm *pAndTerm;
c770: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
c780: 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
c790: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
c7a0: 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
c7b0: 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20  fo = pAndInfo;. 
c7c0: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
c7d0: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
c7e0: 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20  ANDINFO;.       
c7f0: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
c800: 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20  tor = WO_AND;.  
c810: 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26        pAndWC = &
c820: 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
c830: 20 20 20 20 20 20 77 68 65 72 65 43 6c 61 75 73        whereClaus
c840: 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57  eInit(pAndWC, pW
c850: 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  C->pWInfo);.    
c860: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
c870: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
c880: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
c890: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
c8a0: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
c8b0: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41  dWC);.        pA
c8c0: 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70  ndWC->pOuter = p
c8d0: 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  WC;.        test
c8e0: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
c8f0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
c900: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
c910: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
c920: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41       for(j=0, pA
c930: 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61  ndTerm=pAndWC->a
c940: 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72  ; j<pAndWC->nTer
c950: 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d  m; j++, pAndTerm
c960: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
c970: 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72   assert( pAndTer
c980: 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
c990: 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f          if( allo
c9a0: 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e  wedOp(pAndTerm->
c9b0: 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20  pExpr->op) ){.  
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
c9d0: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
c9e0: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64  ->sMaskSet, pAnd
c9f0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
ca00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
ca10: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ca20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
ca30: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
ca40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
ca50: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
ca60: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
ca70: 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  IED ){.      /* 
ca80: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66  Skip this term f
ca90: 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69  or now.  We revi
caa0: 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70  sit it when we p
cab0: 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20  rocess the.     
cac0: 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   ** correspondin
cad0: 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74  g TERM_VIRTUAL t
cae0: 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  erm */.    }else
caf0: 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
cb00: 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74  b;.      b = get
cb10: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
cb20: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
cb30: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
cb40: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
cb50: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
cb60: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
cb70: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
cb80: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
cb90: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
cba0: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
cbb0: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
cbc0: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68  ->sMaskSet, pOth
cbd0: 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  er->leftCursor);
cbe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
cbf0: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
cc00: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
cc10: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
cc20: 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20  O_EQ)==0 ){.    
cc30: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
cc40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cc50: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
cc60: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
cc70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
cc80: 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65  ** Record the se
cc90: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
cca0: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e   satisfy case 2.
ccb0: 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20    The set might 
ccc0: 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20  be.  ** empty.. 
ccd0: 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69   */.  pOrInfo->i
cce0: 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78  ndexable = index
ccf0: 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65  able;.  pTerm->e
cd00: 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78  Operator = index
cd10: 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f  able==0 ? 0 : WO
cd20: 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  _OR;..  /*.  ** 
cd30: 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61  chngToIN holds a
cd40: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
cd50: 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69  hat *might* sati
cd60: 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74  sfy case 1.  But
cd70: 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f  .  ** we have to
cd80: 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f   do some additio
cd90: 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  nal checking to 
cda0: 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65  see if case 1 re
cdb0: 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74  ally.  ** is sat
cdc0: 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  isfied..  **.  *
cdd0: 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20  * chngToIN will 
cde0: 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31  hold either 0, 1
cdf0: 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68  , or 2 bits.  Th
ce00: 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61  e 0-bit case mea
ce10: 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ns.  ** that the
ce20: 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69  re is no possibi
ce30: 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72  lity of transfor
ce40: 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75  ming the OR clau
ce50: 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20  se into an.  ** 
ce60: 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61  IN operator beca
ce70: 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  use one or more 
ce80: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20  terms in the OR 
ce90: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20  clause contain. 
cea0: 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74   ** something ot
ceb0: 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61  her than == on a
cec0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73   column in the s
ced0: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
cee0: 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73  e 1-bit.  ** cas
cef0: 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65  e means that eve
cf00: 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ry term of the O
cf10: 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74  R clause is of t
cf20: 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61  he form.  ** "ta
cf30: 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22  ble.column=expr"
cf40: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
cf50: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65   table.  The one
cf60: 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74   bit that is set
cf70: 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65  .  ** will corre
cf80: 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d  spond to the com
cf90: 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73  mon table.  We s
cfa0: 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65  till need to che
cfb0: 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  ck to make.  ** 
cfc0: 73 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f  sure the same co
cfd0: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20  lumn is used on 
cfe0: 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20  all terms.  The 
cff0: 32 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68  2-bit case is wh
d000: 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20  en.  ** the all 
d010: 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65  terms are of the
d020: 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f   form "table1.co
d030: 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75  lumn=table2.colu
d040: 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69  mn".  It.  ** mi
d050: 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  ght be possible 
d060: 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70  to form an IN op
d070: 65 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68  erator with eith
d080: 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e  er table1.column
d090: 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e  .  ** or table2.
d0a0: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48  column as the LH
d0b0: 53 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63  S if either is c
d0c0: 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74  ommon to every t
d0d0: 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  erm of.  ** the 
d0e0: 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OR clause..  **.
d0f0: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
d100: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
d110: 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d   "table.column1=
d120: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28  table.column2" (
d130: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61  the.  ** same ta
d140: 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65  ble on both size
d150: 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e  s of the ==) can
d160: 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  not be optimized
d170: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e  ..  */.  if( chn
d180: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74  gToIN ){.    int
d190: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
d1a0: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
d1b0: 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  f the conversion
d1c0: 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20   to IN is valid 
d1d0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75  */.    int iColu
d1e0: 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  mn = -1;        
d1f0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78   /* Column index
d200: 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70   on lhs of IN op
d210: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e  erator */.    in
d220: 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20  t iCursor = -1; 
d230: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
d240: 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74   cursor common t
d250: 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20  o all terms */. 
d260: 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20     int j = 0;   
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d280: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
d290: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
d2a0: 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63  or a table and c
d2b0: 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61  olumn that appea
d2c0: 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f  rs on one side o
d2d0: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68  r the.    ** oth
d2e0: 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65  er of the == ope
d2f0: 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73  rator in every s
d300: 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61  ubterm.  That ta
d310: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20  ble and column. 
d320: 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
d330: 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f  corded in iCurso
d340: 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20  r and iColumn.  
d350: 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20  There might not 
d360: 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75  be any.    ** su
d370: 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ch table and col
d380: 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68  umn.  Set okToCh
d390: 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70  ngToIN if an app
d3a0: 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20  ropriate table. 
d3b0: 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e     ** and column
d3c0: 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65   is found but le
d3d0: 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  ave okToChngToIN
d3e0: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f   false if not fo
d3f0: 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  und..    */.    
d400: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20  for(j=0; j<2 && 
d410: 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a  !okToChngToIN; j
d420: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65  ++){.      pOrTe
d430: 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20  rm = pOrWc->a;. 
d440: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63       for(i=pOrWc
d450: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
d460: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
d470: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
d480: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
d490: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
d4a0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
d4b0: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
d4c0: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
d4d0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
d4e0: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
d4f0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
d500: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d  * This is the 2-
d510: 62 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20  bit case and we 
d520: 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  are on the secon
d530: 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a  d iteration and.
d540: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
d550: 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f  rent term is fro
d560: 6d 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  m the first iter
d570: 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20  ation.  So skip 
d580: 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  this term. */.  
d590: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d5a0: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
d5b0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
d5c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
d5d0: 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65  ( (chngToIN & ge
d5e0: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
d5f0: 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d  MaskSet, pOrTerm
d600: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d  ->leftCursor))==
d610: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
d620: 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74  * This term must
d630: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
d640: 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65  t1.a==t2.b where
d650: 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20   t2 is in the.  
d660: 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54          ** chngT
d670: 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69  oIN set but t1 i
d680: 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72  s not.  This ter
d690: 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72  m will be either
d6a0: 20 70 72 65 63 65 65 64 65 64 0a 20 20 20 20 20   preceeded.     
d6b0: 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77       ** or follw
d6c0: 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65  ed by an inverte
d6d0: 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31  d copy (t2.b==t1
d6e0: 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20  .a).  Skip this 
d6f0: 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20  term .          
d700: 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20 69  ** and use its i
d710: 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20  nversion. */.   
d720: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
d730: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
d740: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  s & TERM_COPIED 
d750: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
d760: 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e  tcase( pOrTerm->
d770: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
d780: 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
d790: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
d7a0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
d7b0: 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d  TERM_COPIED|TERM
d7c0: 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20  _VIRTUAL) );.   
d7d0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
d7e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d7f0: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72     iColumn = pOr
d800: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
d810: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72  mn;.        iCur
d820: 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c  sor = pOrTerm->l
d830: 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  eftCursor;.     
d840: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d850: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30 20  }.      if( i<0 
d860: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ){.        /* No
d870: 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65   candidate table
d880: 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e  +column was foun
d890: 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  d.  This can onl
d8a0: 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20  y occur.        
d8b0: 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  ** on the second
d8c0: 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
d8d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d        assert( j=
d8e0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =1 );.        as
d8f0: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
d900: 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a  wo(chngToIN) );.
d910: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d920: 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73  chngToIN==getMas
d930: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
d940: 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b  Set, iCursor) );
d950: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
d970: 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a  stcase( j==1 );.
d980: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76  .      /* We hav
d990: 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64  e found a candid
d9a0: 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  ate table and co
d9b0: 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20  lumn.  Check to 
d9c0: 73 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20  see if that.    
d9d0: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63    ** table and c
d9e0: 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20  olumn is common 
d9f0: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
da00: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a   the OR clause *
da10: 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67  /.      okToChng
da20: 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  ToIN = 1;.      
da30: 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b  for(; i>=0 && ok
da40: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c  ToChngToIN; i--,
da50: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
da60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
da70: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
da80: 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
da90: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
daa0: 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
dab0: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
dac0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
dad0: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
dae0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
daf0: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  if( pOrTerm->u.l
db00: 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  eftColumn!=iColu
db10: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
db20: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
db30: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
db40: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61  .          int a
db50: 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74  ffLeft, affRight
db60: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;.          /* I
db70: 66 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  f the right-hand
db80: 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20   side is also a 
db90: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65  column, then the
dba0: 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20   affinities.    
dbb0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68        ** of both
dbc0: 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   right and left 
dbd0: 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75  sides must be su
dbe0: 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a  ch that no type.
dbf0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
dc00: 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71  versions are req
dc10: 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67  uired on the rig
dc20: 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32  ht.  (Ticket #22
dc30: 34 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  49).          */
dc40: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69  .          affRi
dc50: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
dc60: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
dc70: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
dc80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  );.          aff
dc90: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
dca0: 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65  prAffinity(pOrTe
dcb0: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
dcc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
dcd0: 20 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20   affRight!=0 && 
dce0: 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66  affRight!=affLef
dcf0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
dd00: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
dd10: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
dd20: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
dd30: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
dd40: 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a   |= TERM_OR_OK;.
dd50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
dd60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
dd70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
dd80: 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43  his point, okToC
dd90: 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20  hngToIN is true 
dda0: 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72  if original pTer
ddb0: 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20  m satisfies.    
ddc0: 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74  ** case 1.  In t
ddd0: 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72  hat case, constr
dde0: 75 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61  uct a new virtua
ddf0: 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a  l term that is .
de00: 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e      ** pTerm con
de10: 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49  verted into an I
de20: 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  N operator..    
de30: 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43  */.    if( okToC
de40: 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20  hngToIN ){.     
de50: 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20   Expr *pDup;    
de60: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61          /* A tra
de70: 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65  nsient duplicate
de80: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
de90: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
dea0: 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54  List = 0;   /* T
deb0: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
dec0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
ded0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
dee0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65   0;       /* The
def0: 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
df00: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
df10: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
df20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
df30: 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61  omplete IN opera
df40: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  tor */..      fo
df50: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
df60: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
df70: 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  c->a; i>=0; i--,
df80: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
df90: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
dfa0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
dfb0: 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f  M_OR_OK)==0 ) co
dfc0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
dfd0: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
dfe0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
dff0: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EQ );.        as
e000: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  sert( pOrTerm->l
e010: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
e020: 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  or );.        as
e030: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75  sert( pOrTerm->u
e040: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
e050: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
e060: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
e070: 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72  prDup(db, pOrTer
e080: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
e090: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  , 0);.        pL
e0a0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
e0b0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57 49 6e  rListAppend(pWIn
e0c0: 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73  fo->pParse, pLis
e0d0: 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  t, pDup);.      
e0e0: 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72    pLeft = pOrTer
e0f0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  m->pExpr->pLeft;
e100: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
e110: 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20  ssert( pLeft!=0 
e120: 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20  );.      pDup = 
e130: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
e140: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
e150: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
e160: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
e170: 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20  TK_IN, pDup, 0, 
e180: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
e190: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ew ){.        in
e1a0: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
e1b0: 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61    transferJoinMa
e1c0: 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78  rkings(pNew, pEx
e1d0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  pr);.        ass
e1e0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
e1f0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
e200: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
e210: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
e220: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  st = pList;.    
e230: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
e240: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
e250: 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56  WC, pNew, TERM_V
e260: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
e270: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MIC);.        te
e280: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
e290: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  0 );.        exp
e2a0: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
e2b0: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
e2c0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
e2d0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
e2e0: 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64         pWC->a[id
e2f0: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
e300: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  idxTerm;.       
e310: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
e320: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
e330: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e340: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
e350: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  b, pList);.     
e360: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
e370: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e  eOperator = WO_N
e380: 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20  OOP;  /* case 1 
e390: 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f  trumps case 2 */
e3a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
e3b0: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
e3c0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
e3d0: 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  ION && !SQLITE_O
e3e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
e3f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
e400: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
e410: 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d   is an WhereTerm
e420: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
e430: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78  only the.** "pEx
e440: 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  pr" field filled
e450: 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66   in.  The job of
e460: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e470: 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a   to analyze the.
e480: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
e490: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c   and populate al
e4a0: 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c  l the other fiel
e4b0: 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54  ds of the WhereT
e4c0: 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  erm.** structure
e4d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
e4e0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
e4f0: 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e  the form "<expr>
e500: 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73   <op> X" it gets
e510: 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20   commuted.** to 
e520: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72  the standard for
e530: 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78  m of "X <op> <ex
e540: 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pr>"..**.** If t
e550: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
e560: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
e570: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
e580: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a  th X and Y are.*
e590: 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  * columns, then 
e5a0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
e5b0: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
e5c0: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
e5d0: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f  irtual.** term o
e5e0: 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f  f the form "Y <o
e5f0: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
e600: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
e610: 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a  se and.** analyz
e620: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
e630: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
e640: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
e650: 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20   TERM_COPIED.** 
e660: 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d  and the new term
e670: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
e680: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65  TERM_DYNAMIC (be
e690: 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72  cause it's pExpr
e6a0: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
e6b0: 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57  freed with the W
e6c0: 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20  hereClause) and 
e6d0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65  TERM_VIRTUAL (be
e6e0: 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61  cause it.** is a
e6f0: 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f   commuted copy o
e700: 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29  f a prior term.)
e710: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
e720: 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31  erm has nChild=1
e730: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79  .** and the copy
e740: 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73   has idxParent s
e750: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
e760: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
e770: 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  term..*/.static 
e780: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
e790: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
e7a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
e7b0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
e7c0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
e7d0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
e7e0: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
e7f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
e800: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
e810: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
e820: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
e830: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
e840: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
e850: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
e860: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
e870: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
e880: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
e890: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
e8a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e8b0: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
e8c0: 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  zed */.  WhereMa
e8d0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
e8e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
e8f0: 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20   of table index 
e900: 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20  masks */.  Expr 
e910: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
e920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e930: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
e940: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
e950: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
e960: 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
e970: 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69     /* Prerequesi
e980: 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70 72  tes of the pExpr
e990: 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74  ->pLeft */.  Bit
e9a0: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e9c0: 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f   Prerequesites o
e9d0: 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74  f pExpr */.  Bit
e9e0: 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74 20  mask extraRight 
e9f0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
ea00: 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63   Extra dependenc
ea10: 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e  ies on LEFT JOIN
ea20: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72   */.  Expr *pStr
ea30: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
ea40: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
ea50: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
ea60: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  tor */.  int isC
ea70: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  omplete = 0;    
ea80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
ea90: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e   of LIKE/GLOB en
eaa0: 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72 64  ds with wildcard
eab0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65   */.  int noCase
eac0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ead0: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47         /* LIKE/G
eae0: 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68 65  LOB distinguishe
eaf0: 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  s case */.  int 
eb00: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eb20: 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74  Top-level operat
eb30: 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a  or.  pExpr->op *
eb40: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
eb50: 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
eb60: 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  se;  /* Parsing 
eb70: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
eb80: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
eb90: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a  e->db;        /*
eba0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
ebb0: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64  tion */..  if( d
ebc0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ebd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
ebe0: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
ebf0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
ec00: 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
ec10: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
ec20: 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e   pExpr = pTerm->
ec30: 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
ec40: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
ec50: 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d  S && pExpr->op!=
ec60: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20  TK_COLLATE );.  
ec70: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
ec80: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
ec90: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
eca0: 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  ft);.  op = pExp
ecb0: 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  r->op;.  if( op=
ecc0: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73  =TK_IN ){.    as
ecd0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
ece0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
ecf0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
ed00: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
ed10: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
ed20: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
ed30: 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54  ht = exprSelectT
ed40: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
ed50: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  et, pExpr->x.pSe
ed60: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
ed70: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
ed80: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
ed90: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
eda0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
edb0: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
edc0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
edd0: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
ede0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
edf0: 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ight = 0;.  }els
ee00: 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  e{.    pTerm->pr
ee10: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
ee20: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
ee30: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
ee40: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65  ht);.  }.  prere
ee50: 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65  qAll = exprTable
ee60: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
ee70: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78  pExpr);.  if( Ex
ee80: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
ee90: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
eea0: 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ) ){.    Bitmask
eeb0: 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   x = getMask(pMa
eec0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52  skSet, pExpr->iR
eed0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a  ightJoinTable);.
eee0: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
eef0: 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67   x;.    extraRig
ef00: 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e  ht = x-1;  /* ON
ef10: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
ef20: 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  y not be used wi
ef30: 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20  th an index.    
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef50: 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61     ** on left ta
ef60: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
ef70: 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  IN.  Ticket #301
ef80: 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d  5 */.  }.  pTerm
ef90: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
efa0: 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d  ereqAll;.  pTerm
efb0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d  ->leftCursor = -
efc0: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  1;.  pTerm->iPar
efd0: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  ent = -1;.  pTer
efe0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30  m->eOperator = 0
eff0: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f  ;.  if( allowedO
f000: 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70  p(op) ){.    Exp
f010: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
f020: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
f030: 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
f040: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
f050: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  t = sqlite3ExprS
f060: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
f070: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75  ->pRight);.    u
f080: 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65  16 opMask = (pTe
f090: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
f0a0: 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30  & prereqLeft)==0
f0b0: 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45   ? WO_ALL : WO_E
f0c0: 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c  QUIV;.    if( pL
f0d0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
f0e0: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  MN ){.      pTer
f0f0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
f100: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
f110: 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65       pTerm->u.le
f120: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
f130: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
f140: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
f150: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
f160: 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  (op) & opMask;. 
f170: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69     }.    if( pRi
f180: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f  ght && pRight->o
f190: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
f1a0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
f1b0: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
f1c0: 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75  r *pDup;.      u
f1d0: 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b  16 eExtraOp = 0;
f1e0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
f1f0: 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e   bits for pNew->
f200: 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20  eOperator */.   
f210: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
f220: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
f230: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
f240: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
f250: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
f260: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
f270: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
f280: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
f290: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f2a0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
f2b0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
f2c0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
f2d0: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
f2e0: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
f2f0: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
f300: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
f310: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
f320: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
f330: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
f340: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
f350: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
f360: 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65       pNew->iPare
f370: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
f380: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
f390: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
f3a0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
f3b0: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
f3c0: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
f3d0: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
f3e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
f3f0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20  xpr->op==TK_EQ. 
f400: 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
f410: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
f420: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
f430: 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
f440: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
f450: 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73  db, SQLITE_Trans
f460: 69 74 69 76 65 29 0a 20 20 20 20 20 20 20 20 29  itive).        )
f470: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  {.          pTer
f480: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20  m->eOperator |= 
f490: 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20  WO_EQUIV;.      
f4a0: 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d 20 57      eExtraOp = W
f4b0: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20  O_EQUIV;.       
f4c0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
f4d0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
f4e0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
f4f0: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
f500: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
f510: 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44  mmute(pParse, pD
f520: 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  up);.      pLeft
f530: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
f540: 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e  ipCollate(pDup->
f550: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e  pLeft);.      pN
f560: 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  ew->leftCursor =
f570: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
f580: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65        pNew->u.le
f590: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
f5a0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
f5b0: 20 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72   testcase( (prer
f5c0: 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69  eqLeft | extraRi
f5d0: 67 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65  ght) != prereqLe
f5e0: 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ft );.      pNew
f5f0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
f600: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
f610: 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70  raRight;.      p
f620: 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  New->prereqAll =
f630: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20   prereqAll;.    
f640: 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f    pNew->eOperato
f650: 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73  r = (operatorMas
f660: 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45  k(pDup->op) + eE
f670: 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b  xtraOp) & opMask
f680: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
f690: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f6a0: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
f6b0: 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20  ATION.  /* If a 
f6c0: 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57  term is the BETW
f6d0: 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72  EEN operator, cr
f6e0: 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72  eate two new vir
f6f0: 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20  tual terms.  ** 
f700: 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20  that define the 
f710: 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42  range that the B
f720: 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74  ETWEEN implement
f730: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
f740: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
f750: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
f760: 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63  c.  **.  ** is c
f770: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20  onverted into:. 
f780: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61   **.  **      (a
f790: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
f7a0: 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44  ) AND (a>=b) AND
f7b0: 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a   (a<=c).  **.  *
f7c0: 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65  * The two new te
f7d0: 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e  rms are added on
f7e0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
f7f0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
f800: 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
f810: 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79  ew terms are "dy
f820: 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63  namic" and are c
f830: 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f  hildren of the o
f840: 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a  riginal BETWEEN.
f850: 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74    ** term.  That
f860: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
f870: 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  he BETWEEN term 
f880: 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68  is coded, the ch
f890: 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20  ildren are.  ** 
f8a0: 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66  skipped.  Or, if
f8b0: 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72   the children ar
f8c0: 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61  e satisfied by a
f8d0: 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69  n index, the ori
f8e0: 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45  ginal.  ** BETWE
f8f0: 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70  EN term is skipp
f900: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
f910: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
f920: 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43  K_BETWEEN && pWC
f930: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
f940: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
f950: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
f960: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
f970: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
f980: 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b  t u8 ops[] = {TK
f990: 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20  _GE, TK_LE};.   
f9a0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
f9b0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
f9c0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
f9d0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
f9e0: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
f9f0: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
fa00: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  ;.      int idxN
fa10: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  ew;.      pNewEx
fa20: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
fa30: 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d  r(pParse, ops[i]
fa40: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa60: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
fa70: 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
fa80: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faa0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
fab0: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
fac0: 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a  .pExpr, 0), 0);.
fad0: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
fae0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
faf0: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
fb00: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
fb10: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
fb20: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
fb30: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ew==0 );.      e
fb40: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
fb50: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
fb60: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
fb70: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
fb80: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
fb90: 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew].iParent = id
fba0: 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  xTerm;.    }.   
fbb0: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
fbc0: 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   2;.  }.#endif /
fbd0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  * SQLITE_OMIT_BE
fbe0: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
fbf0: 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  ON */..#if !defi
fc00: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
fc10: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
fc20: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
fc30: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
fc40: 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  Y).  /* Analyze 
fc50: 61 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 63  a term that is c
fc60: 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f  omposed of two o
fc70: 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20  r more subterms 
fc80: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a  connected by.  *
fc90: 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72  * an OR operator
fca0: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
fcb0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
fcc0: 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OR ){.    assert
fcd0: 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  ( pWC->op==TK_AN
fce0: 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  D );.    exprAna
fcf0: 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c  lyzeOrTerm(pSrc,
fd00: 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a   pWC, idxTerm);.
fd10: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
fd20: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
fd30: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
fd40: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
fd50: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
fd60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fd70: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
fd80: 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74  N.  /* Add const
fd90: 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65  raints to reduce
fda0: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
fdb0: 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47  e on a LIKE or G
fdc0: 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  LOB.  ** operato
fdd0: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c  r..  **.  ** A l
fde0: 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74  ike pattern of t
fdf0: 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20  he form "x LIKE 
fe00: 27 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67  'abc%'" is chang
fe10: 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69  ed into constrai
fe20: 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  nts.  **.  **   
fe30: 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20         x>='abc' 
fe40: 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20  AND x<'abd' AND 
fe50: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20  x LIKE 'abc%'.  
fe60: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74  **.  ** The last
fe70: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
fe80: 65 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69  e prefix "abc" i
fe90: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f  s incremented to
fea0: 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74   form the.  ** t
feb0: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69  ermination condi
fec0: 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f  tion "abd"..  */
fed0: 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d  .  if( pWC->op==
fee0: 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73  TK_AND .   && is
fef0: 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73  LikeOrGlob(pPars
ff00: 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31  e, pExpr, &pStr1
ff10: 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26  , &isComplete, &
ff20: 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20  noCase).  ){.   
ff30: 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20   Expr *pLeft;   
ff40: 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49      /* LHS of LI
ff50: 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
ff60: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53   */.    Expr *pS
ff70: 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f  tr2;       /* Co
ff80: 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48  py of pStr1 - RH
ff90: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
ffa0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
ffb0: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a  xpr *pNewExpr1;.
ffc0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
ffd0: 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  pr2;.    int idx
ffe0: 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64  New1;.    int id
fff0: 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e  xNew2;.    Token
10000 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20   sCollSeqName;  
10010 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
10020 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
10030 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45  ..    pLeft = pE
10040 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
10050 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53  1].pExpr;.    pS
10060 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tr2 = sqlite3Exp
10070 72 44 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20  rDup(db, pStr1, 
10080 30 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d  0);.    if( !db-
10090 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
100a0 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43  .      u8 c, *pC
100b0 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  ;       /* Last 
100c0 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65  character before
100d0 20 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63   the first wildc
100e0 61 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20  ard */.      pC 
100f0 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75  = (u8*)&pStr2->u
10100 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53  .zToken[sqlite3S
10110 74 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75  trlen30(pStr2->u
10120 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20  .zToken)-1];.   
10130 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20     c = *pC;.    
10140 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a    if( noCase ){.
10150 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
10160 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65  oint is to incre
10170 6d 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68  ment the last ch
10180 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74  aracter before t
10190 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
101a0 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42   ** wildcard.  B
101b0 75 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65  ut if we increme
101c0 6e 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c  nt '@', that wil
101d0 6c 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74  l push it into t
101e0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  he.        ** al
101f0 70 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77  phabetic range w
10200 68 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72  here case conver
10210 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20  sions will mess 
10220 75 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  up the .        
10230 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  ** inequality.  
10240 54 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d  To avoid this, m
10250 61 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f  ake sure to also
10260 20 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20   run the full.  
10270 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e        ** LIKE on
10280 20 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65   all candidate e
10290 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c  xpressions by cl
102a0 65 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d  earing the isCom
102b0 70 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20  plete flag.     
102c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
102d0 28 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43  ( c=='A'-1 ) isC
102e0 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20  omplete = 0;.   
102f0 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
10300 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b  UpperToLower[c];
10310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
10320 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20  pC = c + 1;.    
10330 7d 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61  }.    sCollSeqNa
10340 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20  me.z = noCase ? 
10350 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41  "NOCASE" : "BINA
10360 52 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65  RY";.    sCollSe
10370 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20  qName.n = 6;.   
10380 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
10390 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
103a0 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70  pLeft, 0);.    p
103b0 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
103c0 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
103d0 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20  TK_GE, .        
103e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
103f0 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
10400 61 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26  arse,pNewExpr1,&
10410 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20  sCollSeqName),. 
10420 20 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c            pStr1,
10430 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31   0);.    idxNew1
10440 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
10450 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
10460 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  pr1, TERM_VIRTUA
10470 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
10480 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
10490 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20  dxNew1==0 );.   
104a0 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
104b0 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29  c, pWC, idxNew1)
104c0 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20  ;.    pNewExpr2 
104d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
104e0 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
104f0 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20      pNewExpr2 = 
10500 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
10510 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20  rse, TK_LT,.    
10520 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
10530 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
10540 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70  n(pParse,pNewExp
10550 72 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  r2,&sCollSeqName
10560 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ),.           pS
10570 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78  tr2, 0);.    idx
10580 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75  New2 = whereClau
10590 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
105a0 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49  ewExpr2, TERM_VI
105b0 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
105c0 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  IC);.    testcas
105d0 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b  e( idxNew2==0 );
105e0 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
105f0 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
10600 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  ew2);.    pTerm 
10610 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
10620 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f  m];.    if( isCo
10630 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  mplete ){.      
10640 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e  pWC->a[idxNew1].
10650 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
10660 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  m;.      pWC->a[
10670 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74  idxNew2].iParent
10680 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
10690 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
106a0 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 2;.    }.  }.#
106b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
106c0 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
106d0 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64  ZATION */..#ifnd
106e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
106f0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a  IRTUALTABLE.  /*
10700 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20   Add a WO_MATCH 
10710 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74  auxiliary term t
10720 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  o the constraint
10730 20 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a   set if the.  **
10740 20 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73   current express
10750 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
10760 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43  rm:  column MATC
10770 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69  H expr..  ** Thi
10780 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
10790 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65   used by the xBe
107a0 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20  stIndex methods 
107b0 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  of.  ** virtual 
107c0 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74  tables.  The nat
107d0 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69  ive query optimi
107e0 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74  zer does not att
107f0 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20  empt.  ** to do 
10800 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41  anything with MA
10810 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  TCH functions.. 
10820 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63   */.  if( isMatc
10830 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29  hOfColumn(pExpr)
10840 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e   ){.    int idxN
10850 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  ew;.    Expr *pR
10860 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20  ight, *pLeft;.  
10870 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65    WhereTerm *pNe
10880 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61  wTerm;.    Bitma
10890 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c  sk prereqColumn,
108a0 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20   prereqExpr;..  
108b0 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
108c0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
108d0 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74  pExpr;.    pLeft
108e0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
108f0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
10900 20 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20     prereqExpr = 
10910 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
10920 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29  MaskSet, pRight)
10930 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75  ;.    prereqColu
10940 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  mn = exprTableUs
10950 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c  age(pMaskSet, pL
10960 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70  eft);.    if( (p
10970 72 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72  rereqExpr & prer
10980 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a  eqColumn)==0 ){.
10990 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
109a0 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
109b0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
109c0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d  xpr(pParse, TK_M
109d0 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20  ATCH, .         
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45       0, sqlite3E
10a00 78 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68  xprDup(db, pRigh
10a10 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20  t, 0), 0);.     
10a20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
10a30 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
10a40 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f   pNewExpr, TERM_
10a50 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
10a60 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73  AMIC);.      tes
10a70 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30  tcase( idxNew==0
10a80 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   );.      pNewTe
10a90 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
10aa0 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
10ab0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
10ac0 74 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a  t = prereqExpr;.
10ad0 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
10ae0 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
10af0 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
10b00 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65    pNewTerm->u.le
10b10 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
10b20 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
10b30 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72   pNewTerm->eOper
10b40 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b  ator = WO_MATCH;
10b50 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
10b60 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  >iParent = idxTe
10b70 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  rm;.      pTerm 
10b80 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
10b90 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  m];.      pTerm-
10ba0 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
10bb0 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
10bc0 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
10bd0 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
10be0 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54  ->prereqAll = pT
10bf0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a  erm->prereqAll;.
10c00 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
10c10 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10c20 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
10c30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10c40 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 2f 2a  NABLE_STAT4.  /*
10c50 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61   When sqlite_sta
10c60 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  t3 histogram dat
10c70 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61  a is available a
10c80 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68  n operator of th
10c90 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49  e.  ** form "x I
10ca0 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20  S NOT NULL" can 
10cb0 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61  sometimes be eva
10cc0 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69  luated more effi
10cd0 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20  ciently.  ** as 
10ce0 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73  "x>NULL" if x is
10cf0 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
10d00 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f  PRIMARY KEY.  So
10d10 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a   construct a.  *
10d20 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f  * virtual term o
10d30 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a  f that form..  *
10d40 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
10d50 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72   the virtual ter
10d60 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64  m must be tagged
10d70 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c   with TERM_VNULL
10d80 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52  .  This.  ** TER
10d90 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c  M_VNULL tag will
10da0 20 73 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f   suppress the no
10db0 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20  t-null check at 
10dc0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
10dd0 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ** of the loop. 
10de0 20 57 69 74 68 6f 75 74 20 74 68 65 20 54 45 52   Without the TER
10df0 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68  M_VNULL flag, th
10e00 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b  e not-null check
10e10 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61   at.  ** the sta
10e20 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77  rt of the loop w
10e30 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20  ill prevent any 
10e40 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69  results from bei
10e50 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  ng returned..  *
10e60 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
10e70 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20  p==TK_NOTNULL.  
10e80 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
10e90 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
10ea0 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65     && pExpr->pLe
10eb0 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20  ft->iColumn>=0. 
10ec0 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
10ed0 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
10ee0 49 54 45 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a  ITE_Stat3).  ){.
10ef0 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
10f00 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  pr;.    Expr *pL
10f10 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
10f20 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  ft;.    int idxN
10f30 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  ew;.    WhereTer
10f40 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20  m *pNewTerm;..  
10f50 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
10f60 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
10f70 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20  , TK_GT,.       
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10fa0 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
10fb0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10fd0 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
10fe0 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20  se, TK_NULL, 0, 
10ff0 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20  0, 0), 0);..    
11000 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
11010 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
11020 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20  pNewExpr,.      
11030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11040 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52          TERM_VIR
11050 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
11060 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20  C|TERM_VNULL);. 
11070 20 20 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b     if( idxNew ){
11080 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20  .      pNewTerm 
11090 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
110a0 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ];.      pNewTer
110b0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
110c0 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   0;.      pNewTe
110d0 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
110e0 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
110f0 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
11100 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
11110 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
11120 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65       pNewTerm->e
11130 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54  Operator = WO_GT
11140 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
11150 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
11160 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
11170 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
11180 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm];.      pTerm
11190 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
111a0 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
111b0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
111c0 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  D;.      pNewTer
111d0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
111e0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b  Term->prereqAll;
111f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
11200 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
11210 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20 20 2f 2a  LE_STAT */..  /*
11220 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75   Prevent ON clau
11230 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45  se terms of a LE
11240 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69  FT JOIN from bei
11250 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69 76 65  ng used to drive
11260 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66  .  ** an index f
11270 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  or tables to the
11280 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
11290 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d  n..  */.  pTerm-
112a0 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20  >prereqRight |= 
112b0 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f  extraRight;.}../
112c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
112d0 6f 6e 20 73 65 61 72 63 68 65 73 20 70 4c 69 73  on searches pLis
112e0 74 20 66 6f 72 20 61 20 65 6e 74 72 79 20 74 68  t for a entry th
112f0 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
11300 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a  Col-th column.**
11310 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a   of index pIdx..
11320 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e  **.** If such an
11330 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
11340 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20  ound, its index 
11350 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73  in pList->a[] is
11360 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
11370 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69   no expression i
11380 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72  s found, -1 is r
11390 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
113a0 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78  ic int findIndex
113b0 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Col(.  Parse *pP
113c0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
113d0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
113e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
113f0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11410 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  Expression list 
11420 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
11430 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20  nt iBase,       
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11450 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62  * Cursor for tab
11460 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
11470 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  th pIdx */.  Ind
11480 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
11490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
114a0 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63  Index to match c
114b0 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e  olumn of */.  in
114c0 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
114d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
114e0 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   Column of index
114f0 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a   to match */.){.
11500 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
11510 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
11520 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c  Idx->azColl[iCol
11530 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ];..  for(i=0; i
11540 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
11550 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
11560 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
11570 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d  ipCollate(pList-
11580 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
11590 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
115a0 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70  COLUMN.     && p
115b0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ->iColumn==pIdx-
115c0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a  >aiColumn[iCol].
115d0 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c       && p->iTabl
115e0 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a  e==iBase.    ){.
115f0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
11600 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
11610 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
11620 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
11630 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
11640 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 26 26  ALWAYS(pColl) &&
11650 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
11660 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
11670 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
11680 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20     return i;.   
11690 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
116a0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
116b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
116c0 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
116d0 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73  T expression-lis
116e0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
116f0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a  third argument.*
11700 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a  * is redundant..
11710 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43 54  **.** A DISTINCT
11720 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64 61   list is redunda
11730 6e 74 20 69 66 20 74 68 65 20 64 61 74 61 62 61  nt if the databa
11740 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  se contains some
11750 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 63 6f   subset of.** co
11760 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 75  lumns that are u
11770 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e 2d 6e 75  nique and non-nu
11780 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
11790 74 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75  t isDistinctRedu
117a0 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  ndant(.  Parse *
117b0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
117c0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
117d0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
117e0 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
117f0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
11800 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
11810 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
11820 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
11830 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
11840 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69  ExprList *pDisti
11850 6e 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65  nct       /* The
11860 20 72 65 73 75 6c 74 20 73 65 74 20 74 68 61 74   result set that
11870 20 6e 65 65 64 73 20 74 6f 20 62 65 20 44 49 53   needs to be DIS
11880 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61  TINCT */.){.  Ta
11890 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
118a0 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20  ex *pIdx;.  int 
118b0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
118c0 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69              .  i
118d0 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20  nt iBase;..  /* 
118e0 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65  If there is more
118f0 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20   than one table 
11900 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e  or sub-select in
11910 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
11920 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75   of.  ** this qu
11930 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  ery, then it wil
11940 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
11950 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74  e to show that t
11960 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a  he DISTINCT .  *
11970 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75  * clause is redu
11980 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ndant. */.  if( 
11990 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d  pTabList->nSrc!=
119a0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
119b0 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74  iBase = pTabList
119c0 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[0].iCursor;.
119d0 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
119e0 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20  t->a[0].pTab;.. 
119f0 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   /* If any of th
11a00 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73  e expressions is
11a10 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f   an IPK column o
11a20 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74  n table iBase, t
11a30 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a  hen return .  **
11a40 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65   true. Note: The
11a50 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61   (p->iTable==iBa
11a60 73 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73  se) part of this
11a70 20 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c   test may be fal
11a80 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63  se if the.  ** c
11a90 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73  urrent SELECT is
11aa0 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
11ab0 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  b-query..  */.  
11ac0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74  for(i=0; i<pDist
11ad0 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  inct->nExpr; i++
11ae0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
11af0 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
11b00 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63  Collate(pDistinc
11b10 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
11b20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
11b30 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69  K_COLUMN && p->i
11b40 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20  Table==iBase && 
11b50 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72  p->iColumn<0 ) r
11b60 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
11b70 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
11b80 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74  all indices on t
11b90 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69  he table, checki
11ba0 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65 20 69  ng each to see i
11bb0 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20  f it makes.  ** 
11bc0 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
11bd0 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74  lifier redundant
11be0 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a  . It does so if:
11bf0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20  .  **.  **   1. 
11c00 54 68 65 20 69 6e 64 65 78 20 69 73 20 69 74 73  The index is its
11c10 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a  elf UNIQUE, and.
11c20 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41    **.  **   2. A
11c30 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ll of the column
11c40 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61  s in the index a
11c50 72 65 20 65 69 74 68 65 72 20 70 61 72 74 20 6f  re either part o
11c60 66 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a  f the pDistinct.
11c70 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20    **      list, 
11c80 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48 45 52  or else the WHER
11c90 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
11ca0 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  s a term of the 
11cb0 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20  form "col=X",.  
11cc0 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20 58 20  **      where X 
11cd0 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61  is a constant va
11ce0 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69  lue. The collati
11cf0 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20  on sequences of 
11d00 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f  the.  **      co
11d10 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c  mparison and sel
11d20 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73  ect-list express
11d30 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20  ions must match 
11d40 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64  those of the ind
11d50 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ex..  **.  **   
11d60 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20  3. All of those 
11d70 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f  index columns fo
11d80 72 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52  r which the WHER
11d90 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f  E clause does no
11da0 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74  t.  **      cont
11db0 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65  ain a "col=X" te
11dc0 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20 74  rm are subject t
11dd0 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e  o a NOT NULL con
11de0 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20  straint..  */.  
11df0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
11e00 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
11e10 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
11e20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
11e30 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29  Error==OE_None )
11e40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
11e50 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
11e60 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
11e70 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
11e80 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
11e90 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ];.      if( 0==
11ea0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42  findTerm(pWC, iB
11eb0 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74  ase, iCol, ~(Bit
11ec0 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70  mask)0, WO_EQ, p
11ed0 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
11ee0 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20 66 69  int iIdxCol = fi
11ef0 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73  ndIndexCol(pPars
11f00 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42  e, pDistinct, iB
11f10 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20  ase, pIdx, i);. 
11f20 20 20 20 20 20 20 20 69 66 28 20 69 49 64 78 43         if( iIdxC
11f30 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43  ol<0 || pTab->aC
11f40 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ol[pIdx->aiColum
11f50 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  n[i]].notNull==0
11f60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
11f70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
11f80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11f90 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43   if( i==pIdx->nC
11fa0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 2f  olumn ){.      /
11fb0 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70  * This index imp
11fc0 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49  lies that the DI
11fd0 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
11fe0 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
11ff0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  /.      return 1
12000 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
12010 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a  eturn 0;.}../* .
12020 2a 2a 20 46 69 6e 64 20 28 61 6e 20 61 70 70 72  ** Find (an appr
12030 6f 78 69 6d 61 74 65 29 20 73 75 6d 20 6f 66 20  oximate) sum of 
12040 74 77 6f 20 57 68 65 72 65 43 6f 73 74 73 2e 20  two WhereCosts. 
12050 20 54 68 69 73 20 63 6f 6d 70 75 74 61 74 69 6f   This computatio
12060 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 20 73 69  n is.** not a si
12070 6d 70 6c 65 20 22 2b 22 20 6f 70 65 72 61 74 6f  mple "+" operato
12080 72 20 62 65 63 61 75 73 65 20 57 68 65 72 65 43  r because WhereC
12090 6f 73 74 20 69 73 20 73 74 6f 72 65 64 20 61 73  ost is stored as
120a0 20 61 20 6c 6f 67 61 72 69 74 68 6d 69 63 0a 2a   a logarithmic.*
120b0 2a 20 76 61 6c 75 65 2e 0a 2a 2a 20 0a 2a 2f 0a  * value..** .*/.
120c0 73 74 61 74 69 63 20 57 68 65 72 65 43 6f 73 74  static WhereCost
120d0 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 57 68   whereCostAdd(Wh
120e0 65 72 65 43 6f 73 74 20 61 2c 20 57 68 65 72 65  ereCost a, Where
120f0 43 6f 73 74 20 62 29 7b 0a 20 20 73 74 61 74 69  Cost b){.  stati
12100 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
12110 20 63 68 61 72 20 78 5b 5d 20 3d 20 7b 0a 20 20   char x[] = {.  
12120 20 20 20 31 30 2c 20 31 30 2c 20 20 20 20 20 20     10, 10,      
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12140 20 20 20 2f 2a 20 30 2c 31 20 2a 2f 0a 20 20 20     /* 0,1 */.   
12150 20 20 20 39 2c 20 39 2c 20 20 20 20 20 20 20 20     9, 9,        
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12170 20 20 2f 2a 20 32 2c 33 20 2a 2f 0a 20 20 20 20    /* 2,3 */.    
12180 20 20 38 2c 20 38 2c 20 20 20 20 20 20 20 20 20    8, 8,         
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121a0 20 2f 2a 20 34 2c 35 20 2a 2f 0a 20 20 20 20 20   /* 4,5 */.     
121b0 20 37 2c 20 37 2c 20 37 2c 20 20 20 20 20 20 20   7, 7, 7,       
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121d0 2f 2a 20 36 2c 37 2c 38 20 2a 2f 0a 20 20 20 20  /* 6,7,8 */.    
121e0 20 20 36 2c 20 36 2c 20 36 2c 20 20 20 20 20 20    6, 6, 6,      
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12200 20 2f 2a 20 39 2c 31 30 2c 31 31 20 2a 2f 0a 20   /* 9,10,11 */. 
12210 20 20 20 20 20 35 2c 20 35 2c 20 35 2c 20 20 20       5, 5, 5,   
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12230 20 20 20 20 2f 2a 20 31 32 2d 31 34 20 2a 2f 0a      /* 12-14 */.
12240 20 20 20 20 20 20 34 2c 20 34 2c 20 34 2c 20 34        4, 4, 4, 4
12250 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12260 20 20 20 20 20 2f 2a 20 31 35 2d 31 38 20 2a 2f       /* 15-18 */
12270 0a 20 20 20 20 20 20 33 2c 20 33 2c 20 33 2c 20  .      3, 3, 3, 
12280 33 2c 20 33 2c 20 33 2c 20 20 20 20 20 20 20 20  3, 3, 3,        
12290 20 20 20 20 20 20 2f 2a 20 31 39 2d 32 34 20 2a        /* 19-24 *
122a0 2f 0a 20 20 20 20 20 20 32 2c 20 32 2c 20 32 2c  /.      2, 2, 2,
122b0 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 20 20 20   2, 2, 2, 2,    
122c0 20 20 20 20 20 20 20 2f 2a 20 32 35 2d 33 31 20         /* 25-31 
122d0 2a 2f 0a 20 20 7d 3b 0a 20 20 69 66 28 20 61 3e  */.  };.  if( a>
122e0 3d 62 20 29 7b 0a 20 20 20 20 69 66 28 20 61 3e  =b ){.    if( a>
122f0 62 2b 34 39 20 29 20 72 65 74 75 72 6e 20 61 3b  b+49 ) return a;
12300 0a 20 20 20 20 69 66 28 20 61 3e 62 2b 33 31 20  .    if( a>b+31 
12310 29 20 72 65 74 75 72 6e 20 61 2b 31 3b 0a 20 20  ) return a+1;.  
12320 20 20 72 65 74 75 72 6e 20 61 2b 78 5b 61 2d 62    return a+x[a-b
12330 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
12340 69 66 28 20 62 3e 61 2b 34 39 20 29 20 72 65 74  if( b>a+49 ) ret
12350 75 72 6e 20 62 3b 0a 20 20 20 20 69 66 28 20 62  urn b;.    if( b
12360 3e 61 2b 33 31 20 29 20 72 65 74 75 72 6e 20 62  >a+31 ) return b
12370 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62  +1;.    return b
12380 2b 78 5b 62 2d 61 5d 3b 0a 20 20 7d 0a 7d 0a 0a  +x[b-a];.  }.}..
12390 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e  /*.** Convert an
123a0 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
123b0 57 68 65 72 65 43 6f 73 74 2e 20 20 49 6e 20 6f  WhereCost.  In o
123c0 74 68 65 72 20 77 6f 72 64 73 2c 20 63 6f 6d 70  ther words, comp
123d0 75 74 65 20 61 0a 2a 2a 20 67 6f 6f 64 20 61 70  ute a.** good ap
123e0 70 72 6f 78 69 6d 61 74 61 74 69 6f 6e 20 66 6f  proximatation fo
123f0 72 20 31 30 2a 6c 6f 67 32 28 78 29 2e 0a 2a 2f  r 10*log2(x)..*/
12400 0a 73 74 61 74 69 63 20 57 68 65 72 65 43 6f 73  .static WhereCos
12410 74 20 77 68 65 72 65 43 6f 73 74 28 74 52 6f 77  t whereCost(tRow
12420 63 6e 74 20 78 29 7b 0a 20 20 73 74 61 74 69 63  cnt x){.  static
12430 20 57 68 65 72 65 43 6f 73 74 20 61 5b 5d 20 3d   WhereCost a[] =
12440 20 7b 20 30 2c 20 32 2c 20 33 2c 20 35 2c 20 36   { 0, 2, 3, 5, 6
12450 2c 20 37 2c 20 38 2c 20 39 20 7d 3b 0a 20 20 57  , 7, 8, 9 };.  W
12460 68 65 72 65 43 6f 73 74 20 79 20 3d 20 34 30 3b  hereCost y = 40;
12470 0a 20 20 69 66 28 20 78 3c 38 20 29 7b 0a 20 20  .  if( x<8 ){.  
12480 20 20 69 66 28 20 78 3c 32 20 29 20 72 65 74 75    if( x<2 ) retu
12490 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28  rn 0;.    while(
124a0 20 78 3c 38 20 29 7b 20 20 79 20 2d 3d 20 31 30   x<8 ){  y -= 10
124b0 3b 20 78 20 3c 3c 3d 20 31 3b 20 7d 0a 20 20 7d  ; x <<= 1; }.  }
124c0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
124d0 20 78 3e 32 35 35 20 29 7b 20 79 20 2b 3d 20 34   x>255 ){ y += 4
124e0 30 3b 20 78 20 3e 3e 3d 20 34 3b 20 7d 0a 20 20  0; x >>= 4; }.  
124f0 20 20 77 68 69 6c 65 28 20 78 3e 31 35 20 29 7b    while( x>15 ){
12500 20 20 79 20 2b 3d 20 31 30 3b 20 78 20 3e 3e 3d    y += 10; x >>=
12510 20 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75   1; }.  }.  retu
12520 72 6e 20 61 5b 78 26 37 5d 20 2b 20 79 20 2d 20  rn a[x&7] + y - 
12530 31 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  10;.}..#ifndef S
12540 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
12550 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f  ALTABLE./*.** Co
12560 6e 76 65 72 74 20 61 20 64 6f 75 62 6c 65 20 28  nvert a double (
12570 61 73 20 72 65 63 65 69 76 65 64 20 66 72 6f 6d  as received from
12580 20 78 42 65 73 74 49 6e 64 65 78 20 6f 66 20 61   xBestIndex of a
12590 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 29 0a   virtual table).
125a0 2a 2a 20 69 6e 74 6f 20 61 20 57 68 65 72 65 43  ** into a WhereC
125b0 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ost.  In other w
125c0 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65 20 61 6e  ords, compute an
125d0 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 66   approximation f
125e0 6f 72 0a 2a 2a 20 31 30 2a 6c 6f 67 32 28 78 29  or.** 10*log2(x)
125f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
12600 65 43 6f 73 74 20 77 68 65 72 65 43 6f 73 74 46  eCost whereCostF
12610 72 6f 6d 44 6f 75 62 6c 65 28 64 6f 75 62 6c 65  romDouble(double
12620 20 78 29 7b 0a 20 20 75 36 34 20 61 3b 0a 20 20   x){.  u64 a;.  
12630 57 68 65 72 65 43 6f 73 74 20 65 3b 0a 20 20 61  WhereCost e;.  a
12640 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
12650 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 61 29  ==8 && sizeof(a)
12660 3d 3d 38 20 29 3b 0a 20 20 69 66 28 20 78 3c 3d  ==8 );.  if( x<=
12670 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
12680 69 66 28 20 78 3c 3d 32 30 30 30 30 30 30 30 30  if( x<=200000000
12690 30 20 29 20 72 65 74 75 72 6e 20 77 68 65 72 65  0 ) return where
126a0 43 6f 73 74 28 28 74 52 6f 77 63 6e 74 29 78 29  Cost((tRowcnt)x)
126b0 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61 2c 20 26  ;.  memcpy(&a, &
126c0 78 2c 20 38 29 3b 0a 20 20 65 20 3d 20 28 61 3e  x, 8);.  e = (a>
126d0 3e 35 32 29 20 2d 20 31 30 32 32 3b 0a 20 20 72  >52) - 1022;.  r
126e0 65 74 75 72 6e 20 65 2a 31 30 3b 0a 7d 0a 23 65  eturn e*10;.}.#e
126f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12700 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
12710 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d   */../*.** Estim
12720 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74 68  ate the logarith
12730 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76  m of the input v
12740 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e 0a  alue to base 2..
12750 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43  */.static WhereC
12760 6f 73 74 20 65 73 74 4c 6f 67 28 57 68 65 72 65  ost estLog(Where
12770 43 6f 73 74 20 4e 29 7b 0a 20 20 57 68 65 72 65  Cost N){.  Where
12780 43 6f 73 74 20 78 20 3d 20 77 68 65 72 65 43 6f  Cost x = whereCo
12790 73 74 28 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20  st(N);.  return 
127a0 78 3e 33 33 20 3f 20 78 20 2d 20 33 33 20 3a 20  x>33 ? x - 33 : 
127b0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20  0;.}../*.** Two 
127c0 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69  routines for pri
127d0 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  nting the conten
127e0 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f  t of an sqlite3_
127f0 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74  index_info.** st
12800 72 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66  ructure.  Used f
12810 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
12820 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20  ebugging only.  
12830 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51  If neither.** SQ
12840 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c  LITE_TEST or SQL
12850 49 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65  ITE_DEBUG are de
12860 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73  fined, then thes
12870 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72  e routines.** ar
12880 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66  e no-ops..*/.#if
12890 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
128a0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
128b0 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 57  LE) && defined(W
128c0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
128d0 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  D).static void T
128e0 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
128f0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
12900 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
12910 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
12920 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
12930 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
12940 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
12950 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
12960 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
12970 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a   constraint[%d]:
12980 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25   col=%d termid=%
12990 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d  d op=%d usabled=
129a0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
129b0 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
129c0 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d  traint[i].iColum
129d0 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  n,.       p->aCo
129e0 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72  nstraint[i].iTer
129f0 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20  mOffset,.       
12a00 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
12a10 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ].op,.       p->
12a20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
12a30 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  sable);.  }.  fo
12a40 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64  r(i=0; i<p->nOrd
12a50 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
12a60 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
12a70 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64  tf("  orderby[%d
12a80 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25  ]: col=%d desc=%
12a90 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
12aa0 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72         p->aOrder
12ab0 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  By[i].iColumn,. 
12ac0 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
12ad0 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a  y[i].desc);.  }.
12ae0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  }.static void TR
12af0 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
12b00 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
12b10 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
12b20 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
12b30 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
12b40 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
12b50 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
12b60 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
12b70 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
12b80 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76   usage[%d]: argv
12b90 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e  Idx=%d omit=%d\n
12ba0 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
12bb0 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
12bc0 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
12bd0 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ndex,.       p->
12be0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
12bf0 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20  [i].omit);.  }. 
12c00 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
12c10 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64  ntf("  idxNum=%d
12c20 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b  \n", p->idxNum);
12c30 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
12c40 72 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d  rintf("  idxStr=
12c50 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72  %s\n", p->idxStr
12c60 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
12c70 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
12c80 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22  ByConsumed=%d\n"
12c90 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  , p->orderByCons
12ca0 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  umed);.  sqlite3
12cb0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65  DebugPrintf("  e
12cc0 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c  stimatedCost=%g\
12cd0 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
12ce0 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Cost);.}.#else.#
12cf0 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
12d00 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69  _INPUTS(A).#defi
12d10 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  ne TRACE_IDX_OUT
12d20 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a  PUTS(A).#endif..
12d30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12d40 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
12d50 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  DEX./*.** Return
12d60 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45   TRUE if the WHE
12d70 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  RE clause term p
12d80 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72  Term is of a for
12d90 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f  m where it.** co
12da0 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68  uld be used with
12db0 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63   an index to acc
12dc0 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69  ess pSrc, assumi
12dd0 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ng an appropriat
12de0 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74  e.** index exist
12df0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
12e00 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  t termCanDriveIn
12e10 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d  dex(.  WhereTerm
12e20 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *pTerm,        
12e30 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
12e40 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68  lause term to ch
12e50 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eck */.  struct 
12e60 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
12e70 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  rc,     /* Table
12e80 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
12e90 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69  o access */.  Bi
12ea0 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ec0 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20  Tables in outer 
12ed0 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69  loops of the joi
12ee0 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61  n */.){.  char a
12ef0 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d  ff;.  if( pTerm-
12f00 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72  >leftCursor!=pSr
12f10 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74  c->iCursor ) ret
12f20 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
12f30 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
12f40 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65 74   WO_EQ)==0 ) ret
12f50 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
12f60 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
12f70 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
12f80 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
12f90 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
12fa0 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
12fb0 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63   0;.  aff = pSrc
12fc0 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65  ->pTab->aCol[pTe
12fd0 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
12fe0 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
12ff0 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
13000 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d  ffinityOk(pTerm-
13010 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72  >pExpr, aff) ) r
13020 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
13030 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 1;.}.#endif...
13040 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13050 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
13060 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  DEX./*.** Genera
13070 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74  te code to const
13080 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
13090 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74  bject for an aut
130a0 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20  omatic index.** 
130b0 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68  and to set up th
130c0 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a  e WhereLevel obj
130d0 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68  ect pLevel so th
130e0 61 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  at the code gene
130f0 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75  rator.** makes u
13100 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61  se of the automa
13110 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  tic index..*/.st
13120 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72  atic void constr
13130 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
13140 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
13150 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
13160 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
13170 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
13180 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
13190 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
131a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
131b0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
131c0 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a  _item *pSrc,  /*
131d0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
131e0 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65   term to get the
131f0 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20   next index */. 
13200 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
13210 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
13220 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
13230 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61  that are not ava
13240 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72  ilable */.  Wher
13250 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20  eLevel *pLevel  
13260 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
13270 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20   new index here 
13280 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c  */.){.  int nCol
13290 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  umn;            
132a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
132b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
132c0 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65  constructed inde
132d0 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  x */.  WhereTerm
132e0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
132f0 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
13300 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
13310 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
13320 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20  reTerm *pWCEnd; 
13330 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
13340 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20  of pWC->a[] */. 
13350 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
13360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13370 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20 6e  Byte of memory n
13380 65 65 64 65 64 20 66 6f 72 20 70 49 64 78 20 2a  eeded for pIdx *
13390 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
133a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133b0 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69  /* Object descri
133c0 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65  bing the transie
133d0 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64  nt index */.  Vd
133e0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
133f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
13400 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
13410 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
13420 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  on */.  int addr
13430 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
13440 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
13450 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  f the initializa
13460 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70  tion bypass jump
13470 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
13480 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
13490 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62    /* The table b
134a0 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a  eing indexed */.
134b0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 69    KeyInfo *pKeyi
134c0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nfo;          /*
134d0 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   Key information
134e0 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a   for the index *
134f0 2f 20 20 20 0a 20 20 69 6e 74 20 61 64 64 72 54  /   .  int addrT
13500 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
13510 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
13520 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70   index fill loop
13530 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
13540 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
13550 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
13560 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72  lding an index r
13570 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
13580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13590 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
135a0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
135b0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
135c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
135d0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
135e0 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20  nt mxBitCol;    
135f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
13600 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20  ximum column in 
13610 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f  pSrc->colUsed */
13620 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
13630 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
13640 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
13650 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c  ence to on a col
13660 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  umn */.  WhereLo
13670 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
13680 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70       /* The Loop
13690 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 42 69 74   object */.  Bit
136a0 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20  mask idxCols;   
136b0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
136c0 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73  ap of columns us
136d0 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  ed for indexing 
136e0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74  */.  Bitmask ext
136f0 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  raCols;         
13700 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64   /* Bitmap of ad
13710 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
13720 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72   */.  u8 sentWar
13730 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20  ning = 0;       
13740 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77    /* True if a w
13750 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e  arnning has been
13760 20 69 73 73 75 65 64 20 2a 2f 0a 0a 20 20 2f 2a   issued */..  /*
13770 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
13780 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20  o skip over the 
13790 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69  creation and ini
137a0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
137b0 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e  he.  ** transien
137c0 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61  t index on 2nd a
137d0 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74  nd subsequent it
137e0 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  erations of the 
137f0 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70  loop. */.  v = p
13800 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
13810 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
13820 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c    addrInit = sql
13830 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
13840 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  rse);..  /* Coun
13850 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
13860 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
13870 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  l be added to th
13880 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64  e index.  ** and
13890 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57   used to match W
138a0 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
138b0 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f  traints */.  nCo
138c0 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70 54 61 62  lumn = 0;.  pTab
138d0 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  le = pSrc->pTab;
138e0 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43  .  pWCEnd = &pWC
138f0 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b  ->a[pWC->nTerm];
13900 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
13910 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78  l->pWLoop;.  idx
13920 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Cols = 0;.  for(
13930 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
13940 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
13950 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65  m++){.    if( te
13960 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
13970 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74  pTerm, pSrc, not
13980 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20  Ready) ){.      
13990 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d  int iCol = pTerm
139a0 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
139b0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d        Bitmask cM
139c0 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20  ask = iCol>=BMS 
139d0 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  ? MASKBIT(BMS-1)
139e0 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29   : MASKBIT(iCol)
139f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13a00 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ( iCol==BMS );. 
13a10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
13a20 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
13a30 20 20 20 20 69 66 28 20 21 73 65 6e 74 57 61 72      if( !sentWar
13a40 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ning ){.        
13a50 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
13a60 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49  TE_WARNING_AUTOI
13a70 4e 44 45 58 2c 0a 20 20 20 20 20 20 20 20 20 20  NDEX,.          
13a80 20 20 22 61 75 74 6f 6d 61 74 69 63 20 69 6e 64    "automatic ind
13a90 65 78 20 6f 6e 20 25 73 28 25 73 29 22 2c 20 70  ex on %s(%s)", p
13aa0 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Table->zName,.  
13ab0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 6c 65            pTable
13ac0 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
13ad0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6e  me);.        sen
13ae0 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20  tWarning = 1;.  
13af0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13b00 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
13b10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
13b20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
13b30 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ize(pParse->db, 
13b40 70 4c 6f 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2b 31  pLoop, nColumn+1
13b50 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
13b60 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
13b70 6d 5b 6e 43 6f 6c 75 6d 6e 2b 2b 5d 20 3d 20 70  m[nColumn++] = p
13b80 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64  Term;.        id
13b90 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
13ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13bb0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c  }.  assert( nCol
13bc0 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70  umn>0 );.  pLoop
13bd0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
13be0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
13bf0 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 4c 6f 6f 70  nColumn;.  pLoop
13c00 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
13c10 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48  E_COLUMN_EQ | WH
13c20 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
13c30 48 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20  HERE_INDEXED.   
13c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c50 20 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49    | WHERE_AUTO_I
13c60 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  NDEX;..  /* Coun
13c70 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
13c80 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
13c90 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65  ns needed to cre
13ca0 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72  ate a.  ** cover
13cb0 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63  ing index.  A "c
13cc0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69  overing index" i
13cd0 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
13ce0 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a  contains all.  *
13cf0 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  * columns that a
13d00 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
13d10 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20   query.  With a 
13d20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
13d30 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
13d40 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65  l table never ne
13d50 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73  eds to be access
13d60 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69  ed.  Automatic i
13d70 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a  ndices must.  **
13d80 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69   be a covering i
13d90 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65  ndex because the
13da0 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20   index will not 
13db0 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68  be updated if th
13dc0 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
13dd0 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e  table changes an
13de0 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  d the index and 
13df0 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74  table cannot bot
13e00 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69  h be used.  ** i
13e10 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66  f they go out of
13e20 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78   sync..  */.  ex
13e30 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e  traCols = pSrc->
13e40 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43  colUsed & (~idxC
13e50 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d  ols | MASKBIT(BM
13e60 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f  S-1));.  mxBitCo
13e70 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f  l = (pTable->nCo
13e80 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d  l >= BMS-1) ? BM
13e90 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43  S-1 : pTable->nC
13ea0 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  ol;.  testcase( 
13eb0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d  pTable->nCol==BM
13ec0 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73  S-1 );.  testcas
13ed0 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  e( pTable->nCol=
13ee0 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28  =BMS-2 );.  for(
13ef0 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b  i=0; i<mxBitCol;
13f00 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65   i++){.    if( e
13f10 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42  xtraCols & MASKB
13f20 49 54 28 69 29 20 29 20 6e 43 6f 6c 75 6d 6e 2b  IT(i) ) nColumn+
13f30 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72  +;.  }.  if( pSr
13f40 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  c->colUsed & MAS
13f50 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20  KBIT(BMS-1) ){. 
13f60 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54     nColumn += pT
13f70 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53  able->nCol - BMS
13f80 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f   + 1;.  }.  pLoo
13f90 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  p->wsFlags |= WH
13fa0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20  ERE_COLUMN_EQ | 
13fb0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
13fc0 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
13fd0 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
13fe0 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69   to describe thi
13ff0 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 6e 42 79  s index */.  nBy
14000 74 65 20 3d 20 73 69 7a 65 6f 66 28 49 6e 64 65  te = sizeof(Inde
14010 78 29 3b 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e  x);.  nByte += n
14020 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 69 6e  Column*sizeof(in
14030 74 29 3b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  t);     /* Index
14040 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e  .aiColumn */.  n
14050 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a  Byte += nColumn*
14060 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 3b 20 20  sizeof(char*);  
14070 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c   /* Index.azColl
14080 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e   */.  nByte += n
14090 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
140a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
140b0 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20  .aSortOrder */. 
140c0 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 44   pIdx = sqlite3D
140d0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
140e0 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  se->db, nByte);.
140f0 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20    if( pIdx==0 ) 
14100 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f 70 2d  return;.  pLoop-
14110 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
14120 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e  = pIdx;.  pIdx->
14130 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a  azColl = (char**
14140 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20 70 49 64  )&pIdx[1];.  pId
14150 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  x->aiColumn = (i
14160 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a 43 6f 6c  nt*)&pIdx->azCol
14170 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49  l[nColumn];.  pI
14180 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  dx->aSortOrder =
14190 20 28 75 38 2a 29 26 70 49 64 78 2d 3e 61 69 43   (u8*)&pIdx->aiC
141a0 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a  olumn[nColumn];.
141b0 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20    pIdx->zName = 
141c0 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20  "auto-index";.  
141d0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  pIdx->nColumn = 
141e0 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49 64 78 2d  nColumn;.  pIdx-
141f0 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  >pTable = pTable
14200 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78  ;.  n = 0;.  idx
14210 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Cols = 0;.  for(
14220 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
14230 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
14240 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65  m++){.    if( te
14250 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
14260 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74  pTerm, pSrc, not
14270 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20  Ready) ){.      
14280 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d  int iCol = pTerm
14290 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
142a0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d        Bitmask cM
142b0 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20  ask = iCol>=BMS 
142c0 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  ? MASKBIT(BMS-1)
142d0 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29   : MASKBIT(iCol)
142e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
142f0 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
14300 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14310 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
14320 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73      if( (idxCols
14330 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   & cMask)==0 ){.
14340 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58          Expr *pX
14350 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
14360 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73  .        idxCols
14370 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20   |= cMask;.     
14380 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
14390 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  n[n] = pTerm->u.
143a0 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
143b0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
143c0 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
143d0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
143e0 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
143f0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
14400 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
14410 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20  = ALWAYS(pColl) 
14420 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
14430 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
14440 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     n++;.      }.
14450 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
14460 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f  rt( (u32)n==pLoo
14470 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29  p->u.btree.nEq )
14480 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69  ;..  /* Add addi
14490 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
144a0 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  eeded to make th
144b0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
144c0 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f  x into.  ** a co
144d0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  vering index */.
144e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
144f0 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
14500 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
14510 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20   MASKBIT(i) ){. 
14520 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
14530 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
14540 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
14550 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  ] = "BINARY";.  
14560 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
14570 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
14580 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
14590 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66  (BMS-1) ){.    f
145a0 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54  or(i=BMS-1; i<pT
145b0 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  able->nCol; i++)
145c0 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
145d0 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
145e0 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
145f0 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[n] = "BINARY";
14600 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
14610 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
14620 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20  n==nColumn );.. 
14630 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 61   /* Create the a
14640 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a  utomatic index *
14650 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20 3d 20 73  /.  pKeyinfo = s
14660 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
14670 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
14680 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76  ;.  assert( pLev
14690 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29  el->iIdxCur>=0 )
146a0 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ;.  pLevel->iIdx
146b0 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
146c0 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56  ab++;.  sqlite3V
146d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
146e0 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70  OpenAutoindex, p
146f0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
14700 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20  nColumn+1, 0,.  
14710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14720 20 20 28 63 68 61 72 2a 29 70 4b 65 79 69 6e 66    (char*)pKeyinf
14730 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
14740 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62 65 43 6f  NDOFF);.  VdbeCo
14750 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25  mment((v, "for %
14760 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  s", pTable->zNam
14770 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  e));..  /* Fill 
14780 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
14790 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74  dex with content
147a0 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20   */.  addrTop = 
147b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
147c0 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
147d0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29  pLevel->iTabCur)
147e0 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  ;.  regRecord = 
147f0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
14800 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
14810 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
14820 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64  xKey(pParse, pId
14830 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  x, pLevel->iTabC
14840 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31  ur, regRecord, 1
14850 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
14860 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14870 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65  IdxInsert, pLeve
14880 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52  l->iIdxCur, regR
14890 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
148a0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
148b0 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
148c0 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65  ESULT);.  sqlite
148d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
148e0 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e  P_Next, pLevel->
148f0 69 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70  iTabCur, addrTop
14900 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
14910 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
14920 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
14930 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71  AUTOINDEX);.  sq
14940 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14950 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  e(v, addrTop);. 
14960 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
14970 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
14980 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20  egRecord);.  .  
14990 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65  /* Jump here whe
149a0 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  n skipping the i
149b0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
149c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
149d0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
149e0 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  it);.}.#endif /*
149f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
14a00 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
14a10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14a20 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
14a30 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  E./*.** Allocate
14a40 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
14a50 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14a60 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49  nfo structure. I
14a70 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
14a80 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
14a90 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
14aa0 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
14ab0 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
14ac0 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
14ad0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
14ae0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
14af0 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  n to sqlite3_fre
14b00 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  e()..*/.static s
14b10 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
14b20 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  o *allocateIndex
14b30 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70  Info(.  Parse *p
14b40 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c  Parse,.  WhereCl
14b50 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72  ause *pWC,.  str
14b60 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
14b70 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69   *pSrc,.  ExprLi
14b80 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a  st *pOrderBy.){.
14b90 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
14ba0 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63  t nTerm;.  struc
14bb0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
14bc0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
14bd0 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
14be0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
14bf0 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42  erby *pIdxOrderB
14c00 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  y;.  struct sqli
14c10 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
14c20 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
14c30 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
14c40 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f  *pTerm;.  int nO
14c50 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65  rderBy;.  sqlite
14c60 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
14c70 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f  dxInfo;..  /* Co
14c80 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
14c90 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45  f possible WHERE
14ca0 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
14cb0 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20  nts referring.  
14cc0 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75  ** to this virtu
14cd0 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  al table */.  fo
14ce0 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65  r(i=nTerm=0, pTe
14cf0 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
14d00 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
14d10 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
14d20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
14d30 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
14d40 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
14d50 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
14d60 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65  erOfTwo(pTerm->e
14d70 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45  Operator & ~WO_E
14d80 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73  QUIV) );.    tes
14d90 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
14da0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
14db0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
14dc0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
14dd0 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
14de0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
14df0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
14e00 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e  ISNULL) ) contin
14e10 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
14e20 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
14e30 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
14e40 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b  ue;.    nTerm++;
14e50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
14e60 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
14e70 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
14e80 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
14e90 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72  urrent .  ** vir
14ea0 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20  tual table then 
14eb0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
14ec0 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20  or the aOrderBy 
14ed0 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65  part of.  ** the
14ee0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14ef0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20  nfo structure.. 
14f00 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   */.  nOrderBy =
14f10 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   0;.  if( pOrder
14f20 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  By ){.    int n 
14f30 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
14f40 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
14f50 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
14f60 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
14f70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
14f80 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
14f90 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
14fa0 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  UMN || pExpr->iT
14fb0 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
14fc0 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
14fd0 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29   }.    if( i==n)
14fe0 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79  {.      nOrderBy
14ff0 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
15000 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
15010 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
15020 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  _info structure.
15030 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20    */.  pIdxInfo 
15040 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
15050 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
15060 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e  , sizeof(*pIdxIn
15070 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo).            
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
15090 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f   (sizeof(*pIdxCo
150a0 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55  ns) + sizeof(*pU
150b0 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20  sage))*nTerm.   
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150d0 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
150e0 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e  (*pIdxOrderBy)*n
150f0 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28  OrderBy );.  if(
15100 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
15110 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15120 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74  Msg(pParse, "out
15130 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
15140 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
15150 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
15160 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
15170 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
15180 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
15190 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20  e contains.  ** 
151a0 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74  many fields that
151b0 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63   are declared "c
151c0 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74  onst" to prevent
151d0 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d   xBestIndex from
151e0 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  .  ** changing t
151f0 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f  hem.  We have to
15200 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63   do some funky c
15210 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20  asting in order 
15220 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  to.  ** initiali
15230 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e  ze those fields.
15240 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73  .  */.  pIdxCons
15250 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
15260 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
15270 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31  int*)&pIdxInfo[1
15280 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79  ];.  pIdxOrderBy
15290 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
152a0 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
152b0 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72  *)&pIdxCons[nTer
152c0 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28  m];.  pUsage = (
152d0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
152e0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
152f0 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65  usage*)&pIdxOrde
15300 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20  rBy[nOrderBy];. 
15310 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
15320 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->nConstraint =
15330 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a   nTerm;.  *(int*
15340 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  )&pIdxInfo->nOrd
15350 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b  erBy = nOrderBy;
15360 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
15370 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
15380 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
15390 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->aConstraint = 
153a0 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74  pIdxCons;.  *(st
153b0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
153c0 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49  ex_orderby**)&pI
153d0 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79  dxInfo->aOrderBy
153e0 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a   = pIdxOrderBy;.
153f0 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
15400 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
15410 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64  int_usage**)&pId
15420 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
15430 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20  ntUsage =.      
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55 73               pUs
15480 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d  age;..  for(i=j=
15490 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
154a0 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
154b0 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
154c0 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66 28    u8 op;.    if(
154d0 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
154e0 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
154f0 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
15500 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
15510 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
15520 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
15530 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
15540 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
15550 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
15560 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
15570 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
15580 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
15590 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
155a0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
155b0 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69  _ISNULL) ) conti
155c0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
155d0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
155e0 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
155f0 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  nue;.    pIdxCon
15600 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  s[j].iColumn = p
15610 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
15620 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  mn;.    pIdxCons
15630 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20  [j].iTermOffset 
15640 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75  = i;.    op = (u
15650 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  8)pTerm->eOperat
15660 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20  or & WO_ALL;.   
15670 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29   if( op==WO_IN )
15680 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20   op = WO_EQ;.   
15690 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
156a0 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65  = op;.    /* The
156b0 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65   direct assignme
156c0 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  nt in the previo
156d0 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69  us line is possi
156e0 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65  ble only because
156f0 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20  .    ** the WO_ 
15700 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
15710 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
15720 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
15730 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f  .  The.    ** fo
15740 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
15750 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
15760 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
15770 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
15780 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
15790 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
157a0 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
157b0 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
157c0 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LT );.    asser
157d0 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
157e0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
157f0 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LE );.    asse
15800 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
15810 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
15820 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_GT );.    ass
15830 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49  ert( WO_GE==SQLI
15840 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
15850 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73  INT_GE );.    as
15860 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d  sert( WO_MATCH==
15870 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
15880 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b  STRAINT_MATCH );
15890 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
158a0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
158b0 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f  (WO_IN|WO_EQ|WO_
158c0 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
158d0 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
158e0 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
158f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
15900 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
15910 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
15920 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
15930 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  pr;.    pIdxOrde
15940 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
15950 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
15960 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
15970 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
15980 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
15990 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
159a0 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a  rn pIdxInfo;.}..
159b0 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
159c0 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65  object reference
159d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
159e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
159f0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
15a00 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e  ** must represen
15a10 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
15a20 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
15a30 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65   invokes the xBe
15a40 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74  stIndex().** met
15a50 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
15a60 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  al table with th
15a70 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
15a80 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  info object that
15a90 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20  .** comes in as 
15aa0 74 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74  the 3rd argument
15ab0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
15ac0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  n..**.** If an e
15ad0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61  rror occurs, pPa
15ae0 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  rse is populated
15af0 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
15b00 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20  essage and a.** 
15b10 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
15b20 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
15b30 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
15b40 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74  rned and the out
15b50 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74  put.** part of t
15b60 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
15b70 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
15b80 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65  is left populate
15b90 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
15ba0 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   or not an error
15bb0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
15bc0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
15bd0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
15be0 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
15bf0 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64  ually free p->id
15c00 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54  xStr if p->needT
15c10 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69  oFreeIdxStr indi
15c20 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  cates.** that th
15c30 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  is is required..
15c40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
15c50 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73  abBestIndex(Pars
15c60 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
15c70 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f   *pTab, sqlite3_
15c80 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
15c90 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
15ca0 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
15cb0 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d  etVTable(pParse-
15cc0 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61  >db, pTab)->pVta
15cd0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
15ce0 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49  t rc;..  TRACE_I
15cf0 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
15d00 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
15d10 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
15d20 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
15d30 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
15d40 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
15d50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
15d60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
15d70 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MEM ){.      pPa
15d80 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
15d90 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
15da0 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
15db0 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
15dc0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15dd0 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
15de0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
15df0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
15e00 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15e10 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
15e20 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
15e30 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
15e40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
15e50 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
15e60 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
15e70 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
15e80 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
15e90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
15ea0 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
15eb0 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
15ec0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
15ed0 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
15ee0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15ef0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15f00 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
15f10 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
15f20 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
15f30 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
15f40 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
15f50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
15f60 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23  Parse->nErr;.}.#
15f70 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
15f80 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
15f90 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
15fa0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15fb0 4e 41 42 4c 45 5f 53 54 41 54 34 0a 2f 2a 0a 2a  NABLE_STAT4./*.*
15fc0 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
15fd0 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72  ocation of a par
15fe0 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e  ticular key amon
15ff0 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e  g all keys in an
16000 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72  .** index.  Stor
16010 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
16020 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77   aStat as follow
16030 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61  s:.**.**    aSta
16040 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[0]      Est. n
16050 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65  umber of rows le
16060 73 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a 2a 20  ss than pVal.** 
16070 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20     aStat[1]     
16080 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
16090 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 56  rows equal to pV
160a0 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  al.**.** Return 
160b0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
160c0 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
160d0 76 6f 69 64 20 77 68 65 72 65 4b 65 79 53 74 61  void whereKeySta
160e0 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ts(.  Parse *pPa
160f0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
16100 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
16110 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  nnection */.  In
16120 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
16130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
16140 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64  ex to consider d
16150 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e  omain of */.  Un
16160 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
16170 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63  ec,       /* Vec
16180 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f  tor of values to
16190 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69   consider */.  i
161a0 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20  nt roundUp,     
161b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
161c0 75 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e 20  und up if true. 
161d0 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66   Round down if f
161e0 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  alse */.  tRowcn
161f0 74 20 2a 61 53 74 61 74 20 20 20 20 20 20 20 20  t *aStat        
16200 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74        /* OUT: st
16210 61 74 73 20 77 72 69 74 74 65 6e 20 68 65 72 65  ats written here
16220 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61   */.){.  IndexSa
16230 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20  mple *aSample = 
16240 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20  pIdx->aSample;. 
16250 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 65 63   int iCol = pRec
16260 2d 3e 6e 46 69 65 6c 64 2d 31 3b 20 20 2f 2a 20  ->nField-1;  /* 
16270 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72 65  Index of require
16280 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b  d stats in anEq[
16290 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  ] etc. */.  int 
162a0 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  iMin = 0;       
162b0 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c          /* Small
162c0 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79  est sample not y
162d0 65 74 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69  et tested */.  i
162e0 6e 74 20 69 20 3d 20 70 49 64 78 2d 3e 6e 53 61  nt i = pIdx->nSa
162f0 6d 70 6c 65 3b 20 20 20 20 20 20 2f 2a 20 53 6d  mple;      /* Sm
16300 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61  allest sample la
16310 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  rger than or equ
16320 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20  al to pRec */.  
16330 69 6e 74 20 69 54 65 73 74 3b 20 20 20 20 20 20  int iTest;      
16340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16350 65 78 74 20 73 61 6d 70 6c 65 20 74 6f 20 74 65  ext sample to te
16360 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b  st */.  int res;
16370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16380 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
16390 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
163a0 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65  ation */..  asse
163b0 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  rt( pIdx->nSampl
163c0 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
163d0 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20   pRec->nField>0 
163e0 26 26 20 69 43 6f 6c 3c 3d 70 49 64 78 2d 3e 6e  && iCol<=pIdx->n
163f0 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 64 6f 7b 0a  Column );.  do{.
16400 20 20 20 20 69 54 65 73 74 20 3d 20 28 69 4d 69      iTest = (iMi
16410 6e 2b 69 29 2f 32 3b 0a 20 20 20 20 72 65 73 20  n+i)/2;.    res 
16420 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
16430 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
16440 6c 65 5b 69 54 65 73 74 5d 2e 6e 2c 20 61 53 61  le[iTest].n, aSa
16450 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 70 2c 20 70  mple[iTest].p, p
16460 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72 65  Rec);.    if( re
16470 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4d 69  s<0 ){.      iMi
16480 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20  n = iTest+1;.   
16490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 20   }else{.      i 
164a0 3d 20 69 54 65 73 74 3b 0a 20 20 20 20 7d 0a 20  = iTest;.    }. 
164b0 20 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26 20   }while( res && 
164c0 69 4d 69 6e 3c 69 20 29 3b 0a 0a 23 69 66 64 65  iMin<i );..#ifde
164d0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
164e0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
164f0 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
16500 6e 74 73 20 63 68 65 63 6b 20 74 68 61 74 20 74  nts check that t
16510 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  he binary search
16520 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65   code.  ** above
16530 20 66 6f 75 6e 64 20 74 68 65 20 72 69 67 68 74   found the right
16540 20 61 6e 73 77 65 72 2e 20 54 68 69 73 20 62 6c   answer. This bl
16550 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f 20 70 75  ock serves no pu
16560 72 70 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a  rpose other.  **
16570 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20   than to invoke 
16580 74 68 65 20 61 73 73 65 72 74 73 2e 20 20 2a 2f  the asserts.  */
16590 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b  .  if( res==0 ){
165a0 0a 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d  .    /* If (res=
165b0 3d 30 29 20 69 73 20 74 72 75 65 2c 20 74 68 65  =0) is true, the
165c0 6e 20 73 61 6d 70 6c 65 20 24 69 20 6d 75 73 74  n sample $i must
165d0 20 62 65 20 65 71 75 61 6c 20 74 6f 20 70 52 65   be equal to pRe
165e0 63 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  c */.    assert(
165f0 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
16600 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16610 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65  0==sqlite3VdbeRe
16620 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
16630 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
16640 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 29 3b  e[i].p, pRec) );
16650 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
16660 20 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63   Otherwise, pRec
16670 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72   must be smaller
16680 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20   than sample $i 
16690 61 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a  and larger than.
166a0 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24      ** sample ($
166b0 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73  i-1).  */.    as
166c0 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e  sert( i==pIdx->n
166d0 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20  Sample .        
166e0 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52   || sqlite3VdbeR
166f0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
16700 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
16710 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30  le[i].p, pRec)>0
16720 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16730 69 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  i==0.         ||
16740 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
16750 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
16760 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c  e[i-1].n, aSampl
16770 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c  e[i-1].p, pRec)<
16780 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  0 );.  }.#endif 
16790 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
167a0 44 45 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20 41  DEBUG */..  /* A
167b0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53  t this point, aS
167c0 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20  ample[i] is the 
167d0 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61  first sample tha
167e0 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
167f0 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20  n.  ** or equal 
16800 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20  to pVal.  Or if 
16810 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
16820 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c  , then all sampl
16830 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a  es are less.  **
16840 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20   than pVal.  If 
16850 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c  aSample[i]==pVal
16860 2c 20 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a 20  , then res==0.. 
16870 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30   */.  if( res==0
16880 20 29 7b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d   ){.    aStat[0]
16890 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
168a0 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53  Lt[iCol];.    aS
168b0 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65  tat[1] = aSample
168c0 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a  [i].anEq[iCol];.
168d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f    }else{.    tRo
168e0 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70  wcnt iLower, iUp
168f0 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69  per, iGap;.    i
16900 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
16910 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
16920 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d     iUpper = aSam
16930 70 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  ple[0].anLt[iCol
16940 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
16950 20 20 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d      iUpper = i>=
16960 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20  pIdx->nSample ? 
16970 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30  pIdx->aiRowEst[0
16980 5d 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] : aSample[i].a
16990 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  nLt[iCol];.     
169a0 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c   iLower = aSampl
169b0 65 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f 6c  e[i-1].anEq[iCol
169c0 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  ] + aSample[i-1]
169d0 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
169e0 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20   }.    aStat[1] 
169f0 3d 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  = (pIdx->nColumn
16a00 3e 69 43 6f 6c 20 3f 20 70 49 64 78 2d 3e 61 41  >iCol ? pIdx->aA
16a10 76 67 45 71 5b 69 43 6f 6c 5d 20 3a 20 31 29 3b  vgEq[iCol] : 1);
16a20 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  .    if( iLower>
16a30 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20  =iUpper ){.     
16a40 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d   iGap = 0;.    }
16a50 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
16a60 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77   = iUpper - iLow
16a70 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  er;.    }.    if
16a80 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20  ( roundUp ){.   
16a90 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a     iGap = (iGap*
16aa0 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  2)/3;.    }else{
16ab0 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47  .      iGap = iG
16ac0 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ap/3;.    }.    
16ad0 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65  aStat[0] = iLowe
16ae0 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 7d 0a  r + iGap;.  }.}.
16af0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
16b00 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 2a 2f  _ENABLE_STAT4 */
16b10 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
16b20 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
16b30 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
16b40 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
16b50 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65  t will be visite
16b60 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67  d.** by scanning
16b70 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20   an index for a 
16b80 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e  range of values.
16b90 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68   The range may h
16ba0 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20  ave an upper.** 
16bb0 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62  bound, a lower b
16bc0 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54  ound, or both. T
16bd0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
16be0 74 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74  terms that set t
16bf0 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20  he upper.** and 
16c00 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65  lower bounds are
16c10 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20   represented by 
16c20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
16c30 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  r respectively. 
16c40 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
16c50 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e  assuming that in
16c60 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61  dex p is on t1(a
16c70 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  ):.**.**   ... F
16c80 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
16c90 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
16ca0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16cb0 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20         |_____|  
16cc0 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20   |_____|.**     
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ce0 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a    |         |.**
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d00 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70       pLower    p
16d10 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65  Upper.**.** If e
16d20 69 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70  ither of the upp
16d30 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e  er or lower boun
16d40 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  d is not present
16d50 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70  , then NULL is p
16d60 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63  assed in.** plac
16d70 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70  e of the corresp
16d80 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d  onding WhereTerm
16d90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
16da0 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e  e in (pBuilder->
16db0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
16dc0 71 29 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  q) is the index 
16dd0 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  of the index.** 
16de0 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74  column subject t
16df0 6f 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  o the range cons
16e00 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69  traint. Or, equi
16e10 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75  valently, the nu
16e20 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c  mber of.** equal
16e30 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
16e40 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65  optimized by the
16e50 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20   proposed index 
16e60 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  scan. For exampl
16e70 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69  e,.** assuming i
16e80 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28  ndex p is on t1(
16e90 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53  a, b), and the S
16ea0 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  QL query is:.**.
16eb0 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
16ec0 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44   WHERE a = ? AND
16ed0 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f   b > ? AND b < ?
16ee0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
16ef0 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 31 20  nEq is set to 1 
16f00 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72 65  (as the range re
16f10 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c  stricted column,
16f20 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e   b, is the secon
16f30 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  d .** left-most 
16f40 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
16f50 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  dex). Or, if the
16f60 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
16f70 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
16f80 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
16f90 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
16fa0 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74  hen nEq is set t
16fb0 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  o 0..**.** When 
16fc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
16fd0 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20   called, *pnOut 
16fe0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 77 68  is set to the wh
16ff0 65 72 65 43 6f 73 74 28 29 20 6f 66 20 74 68 65  ereCost() of the
17000 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
17010 77 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ws that the inde
17020 78 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74  x scan is expect
17030 65 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68  ed to visit with
17040 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  out .** consider
17050 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f  ing the range co
17060 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45  nstraints. If nE
17070 71 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20  q is 0, this is 
17080 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  the number of .*
17090 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  * rows in the in
170a0 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f  dex. Assuming no
170b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
170c0 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65  pnOut is adjuste
170d0 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74  d (reduced).** t
170e0 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
170f0 65 20 72 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e  e range contrain
17100 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  ts pLower and pU
17110 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20  pper..** .** In 
17120 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
17130 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c  qlite_stat4 ANAL
17140 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20  YZE data, or if 
17150 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74  such data cannot
17160 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 65 61 63   be.** used, eac
17170 68 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69  h range inequali
17180 74 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73  ty reduces the s
17190 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61  earch space by a
171a0 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a   factor of 4. .*
171b0 2a 20 48 65 6e 63 65 20 61 20 70 61 69 72 20 6f  * Hence a pair o
171c0 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78  f constraints (x
171d0 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75  >? AND x<?) redu
171e0 63 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64  ces the expected
171f0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f   number of.** ro
17200 77 73 20 76 69 73 69 74 65 64 20 62 79 20 61 20  ws visited by a 
17210 66 61 63 74 6f 72 20 6f 66 20 31 36 2e 0a 2a 2f  factor of 16..*/
17220 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
17230 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20  eRangeScanEst(. 
17240 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
17250 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
17260 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
17270 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
17280 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
17290 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68   *pBuilder,.  Wh
172a0 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c  ereTerm *pLower,
172b0 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e     /* Lower boun
172c0 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
172d0 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68  ex: "x>123" Migh
172e0 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
172f0 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72  hereTerm *pUpper
17300 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75  ,   /* Upper bou
17310 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
17320 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67   ex: "x<455" Mig
17330 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
17340 57 68 65 72 65 43 6f 73 74 20 2a 70 6e 4f 75 74  WhereCost *pnOut
17350 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
17360 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76  Number of rows v
17370 69 73 69 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  isited */.){.  i
17380 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17390 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20  K;.  int nOut = 
173a0 28 69 6e 74 29 2a 70 6e 4f 75 74 3b 0a 0a 23 69  (int)*pnOut;..#i
173b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
173c0 4c 45 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78  LE_STAT4.  Index
173d0 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
173e0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
173f0 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
17400 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
17410 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a  ->u.btree.nEq;..
17420 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c    if( nEq==pBuil
17430 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 0a  der->nRecValid .
17440 20 20 20 26 26 20 70 2d 3e 6e 53 61 6d 70 6c 65     && p->nSample
17450 20 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61   .   && Optimiza
17460 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72  tionEnabled(pPar
17470 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 53  se->db, SQLITE_S
17480 74 61 74 33 29 20 0a 20 20 29 7b 0a 20 20 20 20  tat3) .  ){.    
17490 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
174a0 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
174b0 3e 70 52 65 63 3b 0a 20 20 20 20 74 52 6f 77 63  >pRec;.    tRowc
174c0 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 75 38 20  nt a[2];.    u8 
174d0 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d  aff = p->pTable-
174e0 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d  >aCol[p->aiColum
174f0 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  n[0]].affinity;.
17500 0a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  .    /* Variable
17510 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20   iLower will be 
17520 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
17530 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
17540 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20  r of rows in .  
17550 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74    ** the index t
17560 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68 61  hat are less tha
17570 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  n the lower boun
17580 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71  d of the range q
17590 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20 2a 2a  uery. The.    **
175a0 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69   lower bound bei
175b0 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  ng the concatena
175c0 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24  tion of $P and $
175d0 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74  L, where $P is t
175e0 68 65 0a 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72  he.    ** key-pr
175f0 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20 74  efix formed by t
17600 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d 61  he nEq values ma
17610 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 74 68  tched against th
17620 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a  e nEq left-most.
17630 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f      ** columns o
17640 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64  f the index, and
17650 20 24 4c 20 69 73 20 74 68 65 20 76 61 6c 75 65   $L is the value
17660 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20   in pLower..    
17670 2a 2a 0a 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66  **.    ** Or, if
17680 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20   pLower is NULL 
17690 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20  or $L cannot be 
176a0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
176b0 74 20 28 62 65 63 61 75 73 65 20 69 74 0a 20 20  t (because it.  
176c0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69    ** is not a si
176d0 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72  mple variable or
176e0 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c   literal value),
176f0 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
17700 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   of the.    ** r
17710 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65 20  ange is $P. Due 
17720 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68  to a quirk in th
17730 65 20 77 61 79 20 77 68 65 72 65 4b 65 79 53 74  e way whereKeySt
17740 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65  ats() works, eve
17750 6e 0a 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69  n.    ** if $L i
17760 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65  s available, whe
17770 72 65 4b 65 79 53 74 61 74 73 28 29 20 69 73 20  reKeyStats() is 
17780 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20  called for both 
17790 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20 2a 2a  ($P) and .    **
177a0 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65   ($P:$L) and the
177b0 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74   larger of the t
177c0 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  wo returned valu
177d0 65 73 20 75 73 65 64 2e 0a 20 20 20 20 2a 2a 0a  es used..    **.
177e0 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79      ** Similarly
177f0 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f 20 62  , iUpper is to b
17800 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  e set to the est
17810 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
17820 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20  ber of rows.    
17830 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ** less than the
17840 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
17850 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
17860 20 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72   Where the upper
17870 20 62 6f 75 6e 64 0a 20 20 20 20 2a 2a 20 69 73   bound.    ** is
17880 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72 20   either ($P) or 
17890 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20  ($P:$U). Again, 
178a0 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61 76  even if $U is av
178b0 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61  ailable, both va
178c0 6c 75 65 73 0a 20 20 20 20 2a 2a 20 6f 66 20 69  lues.    ** of i
178d0 55 70 70 65 72 20 61 72 65 20 72 65 71 75 65 73  Upper are reques
178e0 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79 53  ted of whereKeyS
178f0 74 61 74 73 28 29 20 61 6e 64 20 74 68 65 20 73  tats() and the s
17900 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20 20  maller used..   
17910 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20   */.    tRowcnt 
17920 69 4c 6f 77 65 72 3b 0a 20 20 20 20 74 52 6f 77  iLower;.    tRow
17930 63 6e 74 20 69 55 70 70 65 72 3b 0a 0a 20 20 20  cnt iUpper;..   
17940 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c   /* Determine iL
17950 6f 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20  ower and iUpper 
17960 75 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e  using ($P) only.
17970 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3d   */.    if( nEq=
17980 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77  =0 ){.      iLow
17990 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55  er = 0;.      iU
179a0 70 70 65 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45  pper = p->aiRowE
179b0 73 74 5b 30 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  st[0];.    }else
179c0 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a  {.      /* Note:
179d0 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64   this call could
179e0 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77   be optimized aw
179f0 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73  ay - since the s
17a00 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ame values must 
17a10 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62  .      ** have b
17a20 65 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68  een requested wh
17a30 65 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24  en testing key $
17a40 50 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53  P in whereEqualS
17a50 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20  canEst().  */.  
17a60 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74      whereKeyStat
17a70 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
17a80 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
17a90 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20  iLower = a[0];. 
17aa0 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b       iUpper = a[
17ab0 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 7d  0] + a[1];.    }
17ac0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73  ..    /* If poss
17ad0 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e  ible, improve on
17ae0 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74 69   the iLower esti
17af0 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24  mate using ($P:$
17b00 4c 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  L). */.    if( p
17b10 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 69  Lower ){.      i
17b20 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20  nt bOk;         
17b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
17b40 75 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65  ue if value is e
17b50 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45  xtracted from pE
17b60 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  xpr */.      Exp
17b70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65  r *pExpr = pLowe
17b80 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
17b90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17ba0 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74  (pLower->eOperat
17bb0 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  or & (WO_GT|WO_G
17bc0 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  E))!=0 );.      
17bd0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
17be0 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
17bf0 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
17c00 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71   pExpr, aff, nEq
17c10 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 69  , &bOk);.      i
17c20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17c30 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20   && bOk ){.     
17c40 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b     tRowcnt iNew;
17c50 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65  .        whereKe
17c60 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
17c70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
17c80 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b         iNew = a[
17c90 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65  0] + ((pLower->e
17ca0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54  Operator & WO_GT
17cb0 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20  ) ? a[1] : 0);. 
17cc0 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e         if( iNew>
17cd0 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20  iLower ) iLower 
17ce0 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a  = iNew;.      }.
17cf0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
17d00 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
17d10 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72  ve on the iUpper
17d20 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
17d30 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$U). */.    
17d40 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20  if( pUpper ){.  
17d50 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d70 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
17d80 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
17d90 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
17da0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
17db0 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pUpper->pExpr->p
17dc0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73  Right;.      ass
17dd0 65 72 74 28 20 28 70 55 70 70 65 72 2d 3e 65 4f  ert( (pUpper->eO
17de0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54  perator & (WO_LT
17df0 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20  |WO_LE))!=0 );. 
17e00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17e10 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
17e20 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
17e30 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66  pRec, pExpr, aff
17e40 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20  , nEq, &bOk);.  
17e50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17e60 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a  TE_OK && bOk ){.
17e70 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
17e80 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77 68  iNew;.        wh
17e90 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
17ea0 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20  se, p, pRec, 1, 
17eb0 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 77  a);.        iNew
17ec0 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70   = a[0] + ((pUpp
17ed0 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
17ee0 57 4f 5f 4c 45 29 20 3f 20 61 5b 31 5d 20 3a 20  WO_LE) ? a[1] : 
17ef0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
17f00 69 4e 65 77 3c 69 55 70 70 65 72 20 29 20 69 55  iNew<iUpper ) iU
17f10 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20  pper = iNew;.   
17f20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
17f30 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
17f40 20 70 52 65 63 3b 0a 20 20 20 20 69 66 28 20 72   pRec;.    if( r
17f50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17f60 20 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20        WhereCost 
17f70 6e 4e 65 77 3b 0a 20 20 20 20 20 20 69 66 28 20  nNew;.      if( 
17f80 69 55 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b  iUpper>iLower ){
17f90 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20  .        nNew = 
17fa0 77 68 65 72 65 43 6f 73 74 28 69 55 70 70 65 72  whereCost(iUpper
17fb0 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20   - iLower);.    
17fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17fd0 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20 20 20 20   nNew = 10;     
17fe0 20 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 77     assert( 10==w
17ff0 68 65 72 65 43 6f 73 74 28 32 29 20 29 3b 0a 20  hereCost(2) );. 
18000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18010 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20 20   nNew<nOut ){.  
18020 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65        nOut = nNe
18030 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  w;.      }.     
18040 20 2a 70 6e 4f 75 74 20 3d 20 28 57 68 65 72 65   *pnOut = (Where
18050 43 6f 73 74 29 6e 4f 75 74 3b 0a 20 20 20 20 20  Cost)nOut;.     
18060 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
18070 30 2c 20 28 22 72 61 6e 67 65 20 73 63 61 6e 20  0, ("range scan 
18080 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20  regions: %u..%u 
18090 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   est=%d\n",.    
180a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180b0 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72       (u32)iLower
180c0 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20 6e  , (u32)iUpper, n
180d0 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Out));.      ret
180e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
180f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
18100 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18110 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55  R(pParse);.  UNU
18120 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42  SED_PARAMETER(pB
18130 75 69 6c 64 65 72 29 3b 0a 23 65 6e 64 69 66 0a  uilder);.#endif.
18140 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
18150 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20 20   || pUpper );.  
18160 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 45 61 63 68  /* TUNING:  Each
18170 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
18180 74 72 61 69 6e 74 20 72 65 64 75 63 65 73 20 74  traint reduces t
18190 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
181a0 34 2d 66 6f 6c 64 2e 0a 20 20 2a 2a 20 41 20 42  4-fold..  ** A B
181b0 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c  ETWEEN operator,
181c0 20 74 68 65 72 65 66 6f 72 65 2c 20 72 65 64 75   therefore, redu
181d0 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73  ces the search s
181e0 70 61 63 65 20 31 36 2d 66 6f 6c 64 20 2a 2f 0a  pace 16-fold */.
181f0 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20    if( pLower && 
18200 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c 61 67 73  (pLower->wtFlags
18210 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
18220 30 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2d 3d  0 ){.    nOut -=
18230 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   20;        asse
18240 72 74 28 20 32 30 3d 3d 77 68 65 72 65 43 6f 73  rt( 20==whereCos
18250 74 28 34 29 20 29 3b 0a 20 20 7d 0a 20 20 69 66  t(4) );.  }.  if
18260 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
18270 6e 4f 75 74 20 2d 3d 20 32 30 3b 20 20 20 20 20  nOut -= 20;     
18280 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 77     assert( 20==w
18290 68 65 72 65 43 6f 73 74 28 34 29 20 29 3b 0a 20  hereCost(4) );. 
182a0 20 7d 0a 20 20 69 66 28 20 6e 4f 75 74 3c 31 30   }.  if( nOut<10
182b0 20 29 20 6e 4f 75 74 20 3d 20 31 30 3b 0a 20 20   ) nOut = 10;.  
182c0 2a 70 6e 4f 75 74 20 3d 20 28 57 68 65 72 65 43  *pnOut = (WhereC
182d0 6f 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75  ost)nOut;.  retu
182e0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
182f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
18300 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
18310 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
18320 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
18330 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
18340 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61  ed on.** an equa
18350 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
18360 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72  x=VALUE and wher
18370 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63  e that VALUE occ
18380 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69  urs in.** the hi
18390 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54  stogram data.  T
183a0 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77  his only works w
183b0 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66  hen x is the lef
183c0 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  t-most.** column
183d0 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64   of an index and
183e0 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69   sqlite_stat3 hi
183f0 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20  stogram data is 
18400 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72  available.** for
18410 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68   that index.  Wh
18420 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74  en pExpr==NULL t
18430 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  hat means the co
18440 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22  nstraint is.** "
18450 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65  x IS NULL" inste
18460 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e  ad of "x=VALUE".
18470 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
18480 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63   estimated row c
18490 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77  ount into *pnRow
184a0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
184b0 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e  TE_OK. .** If un
184c0 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20  able to make an 
184d0 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20  estimate, leave 
184e0 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64  *pnRow unchanged
184f0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
18500 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  on-zero..**.** T
18510 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
18520 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e  fail if it is un
18530 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63  able to load a c
18540 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
18550 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f  e.** required fo
18560 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69  r string compari
18570 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c  son, or if unabl
18580 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
18590 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54  mory.** for a UT
185a0 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71  F conversion req
185b0 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72  uired for compar
185c0 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  ison.  The error
185d0 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   is stored.** in
185e0 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
185f0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
18600 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53   int whereEqualS
18610 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
18620 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
18630 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
18640 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
18650 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
18660 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
18670 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45 78  der,.  Expr *pEx
18680 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45  pr,         /* E
18690 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41  xpression for VA
186a0 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c  LUE in the x=VAL
186b0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
186c0 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f  .  tRowcnt *pnRo
186d0 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  w       /* Write
186e0 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77   the revised row
186f0 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a   estimate here *
18700 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  /.){.  Index *p 
18710 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
18720 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
18730 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 42  ;.  int nEq = pB
18740 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
18750 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e 70  btree.nEq;.  Unp
18760 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65  ackedRecord *pRe
18770 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  c = pBuilder->pR
18780 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20 20 20  ec;.  u8 aff;   
18790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187a0 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  /* Column affini
187b0 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ty */.  int rc; 
187c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187d0 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
187e0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
187f0 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20    tRowcnt a[2]; 
18800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18810 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 69  tatistics */.  i
18820 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72  nt bOk;..  asser
18830 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61  t( nEq>=1 );.  a
18840 73 73 65 72 74 28 20 6e 45 71 3c 3d 28 70 2d 3e  ssert( nEq<=(p->
18850 6e 43 6f 6c 75 6d 6e 2b 31 29 20 29 3b 0a 20 20  nColumn+1) );.  
18860 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
18870 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
18880 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  t( p->nSample>0 
18890 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75  );.  assert( pBu
188a0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
188b0 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  <nEq );..  /* If
188c0 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20   values are not 
188d0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
188e0 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
188f0 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66  index to the lef
18900 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f  t.  ** of this o
18910 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20  ne, no estimate 
18920 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74  can be made. Ret
18930 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
18940 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42  UND. */.  if( pB
18950 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
18960 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20  d<(nEq-1) ){.   
18970 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
18980 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20  OTFOUND;.  }..  
18990 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  /* This is an op
189a0 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e  timization only.
189b0 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
189c0 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
189d0 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65  tValue().  ** be
189e0 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e  low would return
189f0 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e   the same value.
18a00 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 70    */.  if( nEq>p
18a10 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
18a20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20   *pnRow = 1;.   
18a30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18a40 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20  K;.  }..  aff = 
18a50 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  p->pTable->aCol[
18a60 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d  p->aiColumn[nEq-
18a70 31 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  1]].affinity;.  
18a80 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
18a90 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
18aa0 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
18ab0 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71   pExpr, aff, nEq
18ac0 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75  -1, &bOk);.  pBu
18ad0 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52  ilder->pRec = pR
18ae0 65 63 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ec;.  if( rc!=SQ
18af0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
18b00 20 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d   rc;.  if( bOk==
18b10 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
18b20 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42  E_NOTFOUND;.  pB
18b30 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
18b40 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72  d = nEq;..  wher
18b50 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
18b60 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29  , p, pRec, 0, a)
18b70 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
18b80 78 31 30 30 2c 28 22 65 71 75 61 6c 69 74 79 20  x100,("equality 
18b90 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64  scan regions: %d
18ba0 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29  \n", (int)a[1]))
18bb0 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31  ;.  *pnRow = a[1
18bc0 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72  ];.  .  return r
18bd0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64  c;.}.#endif /* d
18be0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
18bf0 41 42 4c 45 5f 53 54 41 54 34 29 20 2a 2f 0a 0a  ABLE_STAT4) */..
18c00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
18c10 41 42 4c 45 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a  ABLE_STAT4./*.**
18c20 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   Estimate the nu
18c30 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
18c40 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
18c50 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  ed based on.** a
18c60 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20  n IN constraint 
18c70 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d  where the right-
18c80 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
18c90 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
18ca0 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c  is a list of val
18cb0 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ues.  Example:.*
18cc0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52  *.**        WHER
18cd0 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29  E x IN (1,2,3,4)
18ce0 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
18cf0 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63   estimated row c
18d00 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77  ount into *pnRow
18d10 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
18d20 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e  TE_OK. .** If un
18d30 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20  able to make an 
18d40 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20  estimate, leave 
18d50 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64  *pnRow unchanged
18d60 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
18d70 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  on-zero..**.** T
18d80 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
18d90 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e  fail if it is un
18da0 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63  able to load a c
18db0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
18dc0 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f  e.** required fo
18dd0 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69  r string compari
18de0 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c  son, or if unabl
18df0 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
18e00 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54  mory.** for a UT
18e10 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71  F conversion req
18e20 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72  uired for compar
18e30 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  ison.  The error
18e40 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   is stored.** in
18e50 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
18e60 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
18e70 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e   int whereInScan
18e80 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
18e90 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
18ea0 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
18eb0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
18ec0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
18ed0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
18ee0 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  ,.  ExprList *pL
18ef0 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ist,     /* The 
18f00 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68  value list on th
18f10 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28  e RHS of "x IN (
18f20 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a  v1,v2,v3,...)" *
18f30 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52  /.  tRowcnt *pnR
18f40 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ow       /* Writ
18f50 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
18f60 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
18f70 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
18f80 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
18f90 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
18fa0 78 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c  x;.  int nRecVal
18fb0 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e  id = pBuilder->n
18fc0 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20  RecValid;.  int 
18fd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
18fe0 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
18ff0 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
19000 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74  /.  tRowcnt nEst
19010 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
19020 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f  umber of rows fo
19030 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  r a single term 
19040 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f  */.  tRowcnt nRo
19050 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  wEst = 0;    /* 
19060 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20  New estimate of 
19070 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
19080 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ws */.  int i;  
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190a0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
190b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
190c0 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
190d0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
190e0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69  LITE_OK && i<pLi
190f0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
19100 0a 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61  .    nEst = p->a
19110 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20  iRowEst[0];.    
19120 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
19130 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
19140 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e  Builder, pList->
19150 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73  a[i].pExpr, &nEs
19160 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  t);.    nRowEst 
19170 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75  += nEst;.    pBu
19180 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
19190 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20   = nRecValid;.  
191a0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
191b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
191c0 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61  ( nRowEst > p->a
191d0 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f  iRowEst[0] ) nRo
191e0 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45  wEst = p->aiRowE
191f0 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f  st[0];.    *pnRo
19200 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
19210 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
19220 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  0,("IN row estim
19230 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20  ate: est=%g\n", 
19240 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
19250 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
19260 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52  r->nRecValid==nR
19270 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74  ecValid );.  ret
19280 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
19290 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
192a0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 29  TE_ENABLE_STAT4)
192b0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62   */../*.** Disab
192c0 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  le a term in the
192d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
192e0 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64  Except, do not d
192f0 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a  isable the term.
19300 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c  ** if it control
19310 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  s a LEFT OUTER J
19320 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e  OIN and it did n
19330 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
19340 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49  the ON.** or USI
19350 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  NG clause of tha
19360 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f  t join..**.** Co
19370 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20  nsider the term 
19380 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65  t2.z='ok' in the
19390 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69   following queri
193a0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  es:.**.**   (1) 
193b0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
193c0 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
193d0 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52  N t1.a=t2.x WHER
193e0 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  E t2.z='ok'.**  
193f0 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (2)  SELECT * F
19400 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
19410 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
19420 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
19430 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20  *   (3)  SELECT 
19440 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48  * FROM t1, t2 WH
19450 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e  ERE t1.a=t2.x AN
19460 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a  D t2.z='ok'.**.*
19470 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20  * The t2.z='ok' 
19480 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74  is disabled in t
19490 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73  he in (2) becaus
194a0 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a  e it originates.
194b0 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ** in the ON cla
194c0 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69  use.  The term i
194d0 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33  s disabled in (3
194e0 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  ) because it is 
194f0 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61  not part.** of a
19500 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
19510 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74  .  In (1), the t
19520 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62  erm is not disab
19530 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62  led..**.** Disab
19540 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73  ling a term caus
19550 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20  es that term to 
19560 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e  not be tested in
19570 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
19580 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
19590 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e   Disabling is an
195a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
195b0 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73  When terms are s
195c0 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69  atisfied.** by i
195d0 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62  ndices, we disab
195e0 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65  le them to preve
195f0 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73  nt redundant tes
19600 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a  ts in the inner.
19610 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75  ** loop.  We wou
19620 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65  ld get the corre
19630 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f  ct results if no
19640 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20  thing were ever 
19650 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74  disabled,.** but
19660 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e   joins might run
19670 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
19680 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20  .  The trick is 
19690 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75  to disable as mu
196a0 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20  ch.** as we can 
196b0 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e  without disablin
196c0 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20  g too much.  If 
196d0 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  we disabled in (
196e0 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20  1), we'd get.** 
196f0 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72  the wrong answer
19700 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38  .  See ticket #8
19710 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  13..*/.static vo
19720 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57  id disableTerm(W
19730 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
19740 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  l, WhereTerm *pT
19750 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72  erm){.  if( pTer
19760 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72  m.      && (pTer
19770 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
19780 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20  M_CODED)==0.    
19790 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c    && (pLevel->iL
197a0 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78  eftJoin==0 || Ex
197b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
197c0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
197d0 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20  romJoin)).  ){. 
197e0 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
197f0 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
19800 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
19810 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20  iParent>=0 ){.  
19820 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
19830 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e  Other = &pTerm->
19840 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50  pWC->a[pTerm->iP
19850 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66  arent];.      if
19860 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68  ( (--pOther->nCh
19870 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ild)==0 ){.     
19880 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
19890 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a  Level, pOther);.
198a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
198b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  }.}../*.** Code 
198c0 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  an OP_Affinity o
198d0 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20 74  pcode to apply t
198e0 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  he column affini
198f0 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a  ty string zAff.*
19900 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69 73  * to the n regis
19910 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  ters starting at
19920 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73   base. .**.** As
19930 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
19940 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  , SQLITE_AFF_NON
19950 45 20 65 6e 74 72 69 65 73 20 28 77 68 69 63 68  E entries (which
19960 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20   are no-ops) at 
19970 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67  the.** beginning
19980 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66 66   and end of zAff
19990 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 49   are ignored.  I
199a0 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  f all entries in
199b0 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c   zAff are.** SQL
199c0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68  ITE_AFF_NONE, th
199d0 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73 20  en no code gets 
199e0 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  generated..**.**
199f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
19a00 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  kes its own copy
19a10 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61 74   of zAff so that
19a20 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 66   the caller is f
19a30 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79  ree.** to modify
19a40 20 7a 41 66 66 20 61 66 74 65 72 20 74 68 69 73   zAff after this
19a50 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
19a60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19a70 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69   codeApplyAffini
19a80 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ty(Parse *pParse
19a90 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20  , int base, int 
19aa0 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a  n, char *zAff){.
19ab0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
19ac0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
19ad0 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20   zAff==0 ){.    
19ae0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
19af0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19b00 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
19b10 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76 21    }.  assert( v!
19b20 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75  =0 );..  /* Adju
19b30 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74 6f  st base and n to
19b40 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49 54   skip over SQLIT
19b50 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69  E_AFF_NONE entri
19b60 65 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  es at the beginn
19b70 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64  ing.  ** and end
19b80 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74 79   of the affinity
19b90 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20   string..  */.  
19ba0 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41  while( n>0 && zA
19bb0 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46  ff[0]==SQLITE_AF
19bc0 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d  F_NONE ){.    n-
19bd0 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20  -;.    base++;. 
19be0 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20     zAff++;.  }. 
19bf0 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
19c00 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45  Aff[n-1]==SQLITE
19c10 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
19c20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   n--;.  }..  /* 
19c30 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66 69  Code the OP_Affi
19c40 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20 74  nity opcode if t
19c50 68 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67  here is anything
19c60 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a   left to do. */.
19c70 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
19c80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19c90 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74  p2(v, OP_Affinit
19ca0 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20  y, base, n);.   
19cb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
19cc0 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66  geP4(v, -1, zAff
19cd0 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , n);.    sqlite
19ce0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
19cf0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
19d00 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d   base, n);.  }.}
19d10 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
19d20 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  e code for a sin
19d30 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  gle equality ter
19d40 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
19d50 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c  lause.  An equal
19d60 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20  ity.** term can 
19d70 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70 72  be either X=expr
19d80 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20   or X IN (...). 
19d90 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20 74    pTerm is the t
19da0 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  erm to be .** co
19db0 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ded..**.** The c
19dc0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72  urrent value for
19dd0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
19de0 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  is left in regis
19df0 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20  ter iReg..**.** 
19e00 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  For a constraint
19e10 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65   of the form X=e
19e20 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73 73  xpr, the express
19e30 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64  ion is evaluated
19e40 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75   and its.** resu
19e50 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68  lt is left on th
19e60 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f  e stack.  For co
19e70 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65  nstraints of the
19e80 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29   form X IN (...)
19e90 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
19ea0 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20   sets up a loop 
19eb0 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74  that will iterat
19ec0 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65  e over all value
19ed0 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69  s of X..*/.stati
19ee0 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c 69  c int codeEquali
19ef0 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  tyTerm(.  Parse 
19f00 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
19f10 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
19f20 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
19f30 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a  erm *pTerm,   /*
19f40 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65   The term of the
19f50 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
19f60 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57   be coded */.  W
19f70 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
19f80 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20  l, /* The level 
19f90 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
19fa0 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  se we are workin
19fb0 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45  g on */.  int iE
19fc0 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  q,            /*
19fd0 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 65 71   Index of the eq
19fe0 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69 74 68  uality term with
19ff0 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f  in this level */
1a000 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20  .  int bRev,    
1a010 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
1a020 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72  or reverse-order
1a030 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a   IN operations *
1a040 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74 20  /.  int iTarget 
1a050 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d          /* Attem
1a060 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75  pt to leave resu
1a070 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67 69  lts in this regi
1a080 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ster */.){.  Exp
1a090 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
1a0a0 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20  Expr;.  Vdbe *v 
1a0b0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1a0c0 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20  .  int iReg;    
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a0e0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
1a0f0 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20  g results */..  
1a100 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e  assert( iTarget>
1a110 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f  0 );.  if( pX->o
1a120 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20  p==TK_EQ ){.    
1a130 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  iReg = sqlite3Ex
1a140 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1a150 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
1a160 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c   iTarget);.  }el
1a170 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54  se if( pX->op==T
1a180 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  K_ISNULL ){.    
1a190 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
1a1a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a1b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1a1c0 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e  , 0, iReg);.#ifn
1a1d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a1e0 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65  SUBQUERY.  }else
1a1f0 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b  {.    int eType;
1a200 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  .    int iTab;. 
1a210 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
1a220 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65 72 65   *pIn;.    Where
1a230 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c  Loop *pLoop = pL
1a240 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20  evel->pWLoop;.. 
1a250 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
1a260 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
1a270 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 0a  IRTUALTABLE)==0.
1a280 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e        && pLoop->
1a290 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d  u.btree.pIndex!=
1a2a0 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70  0.      && pLoop
1a2b0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1a2c0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 45 71  ->aSortOrder[iEq
1a2d0 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74  ].    ){.      t
1a2e0 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d 30 20  estcase( iEq==0 
1a2f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a300 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20  e( bRev );.     
1a310 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20   bRev = !bRev;. 
1a320 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1a330 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
1a340 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  ;.    iReg = iTa
1a350 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20  rget;.    eType 
1a360 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  = sqlite3FindInI
1a370 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c  ndex(pParse, pX,
1a380 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65 54 79   0);.    if( eTy
1a390 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe==IN_INDEX_IND
1a3a0 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20  EX_DESC ){.     
1a3b0 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76 20   testcase( bRev 
1a3c0 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20  );.      bRev = 
1a3d0 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  !bRev;.    }.   
1a3e0 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62   iTab = pX->iTab
1a3f0 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  le;.    sqlite3V
1a400 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
1a410 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
1a420 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
1a430 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
1a440 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1a450 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29   WHERE_MULTI_OR)
1a460 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  ==0 );.    pLoop
1a470 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
1a480 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20  RE_IN_ABLE;.    
1a490 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  if( pLevel->u.in
1a4a0 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .nIn==0 ){.     
1a4b0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
1a4c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1a4d0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1a4e0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
1a4f0 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c  in.nIn++;.    pL
1a500 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
1a510 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69  op =.       sqli
1a520 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
1a530 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
1a540 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
1a550 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oop,.           
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a570 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c     sizeof(pLevel
1a580 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30  ->u.in.aInLoop[0
1a590 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  ])*pLevel->u.in.
1a5a0 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20  nIn);.    pIn = 
1a5b0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
1a5c0 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49  Loop;.    if( pI
1a5d0 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b  n ){.      pIn +
1a5e0 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  = pLevel->u.in.n
1a5f0 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49  In - 1;.      pI
1a600 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a  n->iCur = iTab;.
1a610 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
1a620 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
1a630 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  ){.        pIn->
1a640 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
1a650 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a660 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c   OP_Rowid, iTab,
1a670 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65   iReg);.      }e
1a680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  lse{.        pIn
1a690 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
1a6a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1a6b0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
1a6c0 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20  ab, 0, iReg);.  
1a6d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d      }.      pIn-
1a6e0 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52  >eEndLoopOp = bR
1a6f0 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f  ev ? OP_Prev : O
1a700 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  P_Next;.      sq
1a710 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1a720 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52  v, OP_IsNull, iR
1a730 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eg);.    }else{.
1a740 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e        pLevel->u.
1a750 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20  in.nIn = 0;.    
1a760 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64  }.#endif.  }.  d
1a770 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1a780 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74  l, pTerm);.  ret
1a790 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  urn iReg;.}../*.
1a7a0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1a7b0 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
1a7c0 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49  ate all == and I
1a7d0 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  N constraints fo
1a7e0 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a  r an.** index..*
1a7f0 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1a800 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65  , consider table
1a810 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29   t1(a,b,c,d,e,f)
1a820 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61   with index i1(a
1a830 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73  ,b,c)..** Suppos
1a840 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
1a850 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d  se is this:  a==
1a860 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c  5 AND b IN (1,2,
1a870 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63  3) AND c>5 AND c
1a880 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  <10.** The index
1a890 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20   has as many as 
1a8a0 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63  three equality c
1a8b0 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20  onstraints, but 
1a8c0 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70  in this.** examp
1a8d0 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63  le, the third "c
1a8e0 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  " value is an in
1a8f0 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e  equality.  So on
1a900 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74  ly two .** const
1a910 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64  raints are coded
1a920 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1a930 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f  will generate co
1a940 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a  de to evaluate.*
1a950 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20  * a==5 and b IN 
1a960 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75  (1,2,3).  The cu
1a970 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72  rrent values for
1a980 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65   a and b will be
1a990 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f   stored.** in co
1a9a0 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
1a9b0 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ers and the inde
1a9c0 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  x of the first r
1a9d0 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72  egister is retur
1a9e0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ned..**.** In th
1a9f0 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20  e example above 
1aa00 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69  nEq==2.  But thi
1aa10 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72  s subroutine wor
1aa20 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65  ks for any value
1aa30 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75  .** of nEq inclu
1aa40 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d  ding 0.  If nEq=
1aa50 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  =0, this routine
1aa60 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d   is nearly a no-
1aa70 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  op..** The only 
1aa80 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73  thing it does is
1aa90 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c   allocate the pL
1aaa0 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72  evel->iMem memor
1aab0 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f  y cell and.** co
1aac0 6d 70 75 74 65 20 74 68 65 20 61 66 66 69 6e 69  mpute the affini
1aad0 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ty string..**.**
1aae0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
1aaf0 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61  ways allocates a
1ab00 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f  t least one memo
1ab10 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 74 75  ry cell and retu
1ab20 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rns.** the index
1ab30 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20   of that memory 
1ab40 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20 74  cell. The code t
1ab50 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69  hat.** calls thi
1ab60 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75  s routine will u
1ab70 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  se that memory c
1ab80 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ell to store the
1ab90 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20   termination.** 
1aba0 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  key value of the
1abb0 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f   loop.  If one o
1abc0 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74  r more IN operat
1abd0 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e  ors appear, then
1abe0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1abf0 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64   allocates an ad
1ac00 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d  ditional nEq mem
1ac10 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e  ory cells for in
1ac20 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a  ternal.** use..*
1ac30 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
1ac40 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73  rning, *pzAff is
1ac50 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1ac60 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
1ac70 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f  ning a.** copy o
1ac80 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  f the column aff
1ac90 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20  inity string of 
1aca0 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61  the index alloca
1acb0 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ted using.** sql
1acc0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20  ite3DbMalloc(). 
1acd0 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20  Except, entries 
1ace0 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  in the copy of t
1acf0 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69  he string associ
1ad00 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75  ated.** with equ
1ad10 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1ad20 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e 45 20  s that use NONE 
1ad30 61 66 66 69 6e 69 74 79 20 61 72 65 20 73 65 74  affinity are set
1ad40 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46   to.** SQLITE_AF
1ad50 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73 20  F_NONE. This is 
1ad60 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c  to deal with SQL
1ad70 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c   such as the fol
1ad80 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
1ad90 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1ada0 61 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b  a TEXT PRIMARY K
1adb0 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c  EY, b);.**   SEL
1adc0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
1add0 41 53 20 74 32 2c 20 74 31 20 57 48 45 52 45 20  AS t2, t1 WHERE 
1ade0 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a  t1.a = t2.b;.**.
1adf0 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
1ae00 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64  e above, the ind
1ae10 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20  ex on t1(a) has 
1ae20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42  TEXT affinity. B
1ae30 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20  ut since.** the 
1ae40 72 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20  right hand side 
1ae50 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  of the equality 
1ae60 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62  constraint (t2.b
1ae70 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e  ) has NONE affin
1ae80 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65  ity,.** no conve
1ae90 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  rsion should be 
1aea0 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65  attempted before
1aeb0 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61   using a t2.b va
1aec0 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a  lue as part of.*
1aed0 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63  * a key to searc
1aee0 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e  h the index. Hen
1aef0 63 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ce the first byt
1af00 65 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  e in the returne
1af10 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74  d affinity.** st
1af20 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61  ring in this exa
1af30 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65  mple would be se
1af40 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f  t to SQLITE_AFF_
1af50 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NONE..*/.static 
1af60 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  int codeAllEqual
1af70 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73  ityTerms(.  Pars
1af80 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1af90 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1afa0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
1afb0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20  evel *pLevel,   
1afc0 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20  /* Which nested 
1afd0 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d  loop of the FROM
1afe0 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a   we are coding *
1aff0 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20  /.  int bRev,   
1b000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76            /* Rev
1b010 65 72 73 65 20 74 68 65 20 6f 72 64 65 72 20 6f  erse the order o
1b020 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a  f IN operators *
1b030 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65  /.  int nExtraRe
1b040 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  g,        /* Num
1b050 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67  ber of extra reg
1b060 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
1b070 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  te */.  char **p
1b080 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a  zAff          /*
1b090 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69   OUT: Set to poi
1b0a0 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73  nt to affinity s
1b0b0 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
1b0c0 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  t nEq;          
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b0e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  he number of == 
1b0f0 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
1b100 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56  s to code */.  V
1b110 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1b120 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
1b130 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e  The vm under con
1b140 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  struction */.  I
1b150 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
1b160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b170 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20  The index being 
1b180 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f  used for this lo
1b190 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  op */.  WhereTer
1b1a0 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
1b1b0 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
1b1c0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  e constraint ter
1b1d0 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  m */.  WhereLoop
1b1e0 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
1b1f0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
1b200 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
1b210 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
1b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b230 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1b240 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
1b250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b260 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73     /* Base regis
1b270 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ter */.  int nRe
1b280 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
1b290 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b2a0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
1b2b0 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63   allocate */.  c
1b2c0 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20  har *zAff;      
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b2e0 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  Affinity string 
1b2f0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20  to return */..  
1b300 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69  /* This module i
1b310 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e  s only called on
1b320 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61   query plans tha
1b330 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20  t use an index. 
1b340 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  */.  pLoop = pLe
1b350 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61  vel->pWLoop;.  a
1b360 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
1b370 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
1b380 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
1b390 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70  );.  nEq = pLoop
1b3a0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
1b3b0 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
1b3c0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
1b3d0 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
1b3e0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   );..  /* Figure
1b3f0 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65   out how many me
1b400 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69  mory cells we wi
1b410 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c  ll need then all
1b420 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f  ocate them..  */
1b430 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61  .  regBase = pPa
1b440 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
1b450 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75   nReg = pLoop->u
1b460 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78  .btree.nEq + nEx
1b470 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65  traReg;.  pParse
1b480 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
1b490 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65  .  zAff = sqlite
1b4a0 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65  3DbStrDup(pParse
1b4b0 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64  ->db, sqlite3Ind
1b4c0 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c  exAffinityStr(v,
1b4d0 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21   pIdx));.  if( !
1b4e0 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72  zAff ){.    pPar
1b4f0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1b500 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  iled = 1;.  }.. 
1b510 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
1b520 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
1b530 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  aints.  */.  ass
1b540 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
1b550 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72  mn>=nEq );.  for
1b560 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b  (j=0; j<nEq; j++
1b570 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  ){.    int r1;. 
1b580 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
1b590 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
1b5a0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
1b5b0 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 );.    /* The 
1b5c0 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20 66  following true f
1b5d0 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74 68 20  or indices with 
1b5e0 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e  redundant column
1b5f0 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43  s. .    ** Ex: C
1b600 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
1b610 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c  N t1(a,b,a); SEL
1b620 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
1b630 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b  ERE a=0 AND b=0;
1b640 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65   */.    testcase
1b650 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
1b660 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21  s & TERM_CODED)!
1b670 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
1b680 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
1b690 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1b6a0 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f  L );.    r1 = co
1b6b0 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
1b6c0 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
1b6d0 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 72  evel, j, bRev, r
1b6e0 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69  egBase+j);.    i
1b6f0 66 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a  f( r1!=regBase+j
1b700 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52   ){.      if( nR
1b710 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  eg==1 ){.       
1b720 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1b730 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1b740 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20  egBase);.       
1b750 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20   regBase = r1;. 
1b760 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b770 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b780 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1b790 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a  y, r1, regBase+j
1b7a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1b7b0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1b7c0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1b7d0 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
1b7e0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1b7f0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1b800 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28  WO_IN );.    if(
1b810 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
1b820 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c  or & (WO_ISNULL|
1b830 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20  WO_IN))==0 ){.  
1b840 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
1b850 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
1b860 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73  >pRight;.      s
1b870 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73  qlite3ExprCodeIs
1b880 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67  NullJump(v, pRig
1b890 68 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70  ht, regBase+j, p
1b8a0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
1b8b0 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20  .      if( zAff 
1b8c0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
1b8d0 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1b8e0 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41  inity(pRight, zA
1b8f0 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  ff[j])==SQLITE_A
1b900 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  FF_NONE ){.     
1b910 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53       zAff[j] = S
1b920 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1b930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b940 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1b950 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
1b960 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a  Change(pRight, z
1b970 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20  Aff[j]) ){.     
1b980 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53       zAff[j] = S
1b990 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1b9a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b9b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  }.    }.  }.  *p
1b9c0 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72  zAff = zAff;.  r
1b9d0 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d  eturn regBase;.}
1b9e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1b9f0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
1ba00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ba10 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72   is a helper for
1ba20 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e   explainIndexRan
1ba30 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a  ge() below.**.**
1ba40 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20   pStr holds the 
1ba50 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65  text of an expre
1ba60 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72  ssion that we ar
1ba70 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e  e building up on
1ba80 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74  e term.** at a t
1ba90 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ime.  This routi
1baa0 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20 74 65  ne adds a new te
1bab0 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  rm to the end of
1bac0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
1bad0 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65  .** Terms are se
1bae0 70 61 72 61 74 65 64 20 62 79 20 41 4e 44 20 73  parated by AND s
1baf0 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44 22 20  o add the "AND" 
1bb00 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20  text for second 
1bb10 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  and subsequent.*
1bb20 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f  * terms only..*/
1bb30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
1bb40 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a  lainAppendTerm(.
1bb50 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72    StrAccum *pStr
1bb60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1bb70 20 54 68 65 20 74 65 78 74 20 65 78 70 72 65 73   The text expres
1bb80 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74  sion being built
1bb90 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c   */.  int iTerm,
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbb0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1bbc0 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20  is term.  First 
1bbd0 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e  is zero */.  con
1bbe0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
1bbf0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
1bc00 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a   of the column *
1bc10 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1bc20 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  zOp             
1bc30 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
1bc40 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20  perator */.){.  
1bc50 69 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69  if( iTerm ) sqli
1bc60 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1bc70 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c  d(pStr, " AND ",
1bc80 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   5);.  sqlite3St
1bc90 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
1bca0 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b  r, zColumn, -1);
1bcb0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1bcc0 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a  umAppend(pStr, z
1bcd0 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  Op, 1);.  sqlite
1bce0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
1bcf0 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d  pStr, "?", 1);.}
1bd00 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
1bd10 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65   pLevel describe
1bd20 73 20 61 20 73 74 72 61 74 65 67 79 20 66 6f 72  s a strategy for
1bd30 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20   scanning table 
1bd40 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66  pTab. This .** f
1bd50 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1bd60 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
1bd70 74 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f 6e  tring buffer con
1bd80 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72 69  taining a descri
1bd90 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ption.** of the 
1bda0 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65 20  subset of table 
1bdb0 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20  rows scanned by 
1bdc0 74 68 65 20 73 74 72 61 74 65 67 79 20 69 6e 20  the strategy in 
1bdd0 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a  the form of an.*
1bde0 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e  * SQL expression
1bdf0 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77  . Or, if all row
1be00 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e  s are scanned, N
1be10 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
1be20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1be30 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  le, if the query
1be40 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
1be50 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
1be60 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a   a=1 AND b>2;.**
1be70 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74  .** is run and t
1be80 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78  here is an index
1be90 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e   on (a, b), then
1bea0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1beb0 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69  eturns a.** stri
1bec0 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a  ng similar to:.*
1bed0 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20  *.**   "a=? AND 
1bee0 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  b>?".**.** The r
1bef0 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20  eturned pointer 
1bf00 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79  points to memory
1bf10 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
1bf20 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
1bf30 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72  ..** It is the r
1bf40 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
1bf50 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66   the caller to f
1bf60 72 65 65 20 74 68 65 20 62 75 66 66 65 72 20 77  ree the buffer w
1bf70 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20  hen it is.** no 
1bf80 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
1bf90 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1bfa0 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e  *explainIndexRan
1bfb0 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ge(sqlite3 *db, 
1bfc0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1bfd0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  , Table *pTab){.
1bfe0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
1bff0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
1c000 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
1c010 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
1c020 72 65 65 2e 6e 45 71 3b 0a 20 20 69 6e 74 20 69  ree.nEq;.  int i
1c030 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  , j;.  Column *a
1c040 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
1c050 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d  ;.  int *aiColum
1c060 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
1c070 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d  lumn;.  StrAccum
1c080 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71   txt;..  if( nEq
1c090 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77  ==0 && (pLoop->w
1c0a0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
1c0b0 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
1c0c0 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29  TOP_LIMIT))==0 )
1c0d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1c0e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
1c0f0 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c 20  AccumInit(&txt, 
1c100 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58  0, 0, SQLITE_MAX
1c110 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e  _LENGTH);.  txt.
1c120 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74  db = db;.  sqlit
1c130 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1c140 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29 3b  (&txt, " (", 2);
1c150 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45  .  for(i=0; i<nE
1c160 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78 70  q; i++){.    exp
1c170 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
1c180 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43  txt, i, aCol[aiC
1c190 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 2c  olumn[i]].zName,
1c1a0 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20   "=");.  }..  j 
1c1b0 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f 70  = i;.  if( pLoop
1c1c0 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
1c1d0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1c1e0 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70   char *z = (j==p
1c1f0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
1c200 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
1c210 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
1c220 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
1c230 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
1c240 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a  , i++, z, ">");.
1c250 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
1c260 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54  >wsFlags&WHERE_T
1c270 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
1c280 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49  char *z = (j==pI
1c290 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  ndex->nColumn ) 
1c2a0 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c  ? "rowid" : aCol
1c2b0 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  [aiColumn[j]].zN
1c2c0 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  ame;.    explain
1c2d0 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c  AppendTerm(&txt,
1c2e0 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d   i, z, "<");.  }
1c2f0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1c300 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
1c310 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e  )", 1);.  return
1c320 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1c330 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a  Finish(&txt);.}.
1c340 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1c350 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
1c360 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79  unless currently
1c370 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45   processing an E
1c380 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
1c390 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66  N.** command. If
1c3a0 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e 67   the query being
1c3b0 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20   compiled is an 
1c3c0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1c3d0 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  AN, a single.** 
1c3e0 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20  record is added 
1c3f0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f  to the output to
1c400 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61   describe the ta
1c410 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67  ble scan strateg
1c420 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e  y in .** pLevel.
1c430 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c440 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
1c450 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c470 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
1c480 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
1c490 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
1c4a0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1c4b0 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20   list this loop 
1c4c0 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57  refers to */.  W
1c4d0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1c4e0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
1c4f0 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20  * Scan to write 
1c500 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64  OP_Explain opcod
1c510 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  e for */.  int i
1c520 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
1c530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1c540 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20  lue for "level" 
1c550 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
1c560 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c580 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
1c590 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e  or "from" column
1c5a0 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
1c5b0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20  u16 wctrlFlags  
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5d0 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
1c5e0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
1c5f0 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69  egin() */.){.  i
1c600 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
1c610 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 73 74 72  in==2 ){.    str
1c620 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1c630 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
1c640 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
1c650 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20  From];.    Vdbe 
1c660 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1c670 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62  be;      /* VM b
1c680 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
1c690 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20   */.    sqlite3 
1c6a0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1c6b0 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
1c6c0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  e handle */.    
1c6d0 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20  char *zMsg;     
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c6f0 20 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20   Text to add to 
1c700 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  EQP output */.  
1c710 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72    int iId = pPar
1c720 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20  se->iSelectId;  
1c730 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65  /* Select id (le
1c740 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63  ft-most output c
1c750 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  olumn) */.    in
1c760 74 20 69 73 53 65 61 72 63 68 3b 20 20 20 20 20  t isSearch;     
1c770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c780 72 75 65 20 66 6f 72 20 61 20 53 45 41 52 43 48  rue for a SEARCH
1c790 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e  . False for SCAN
1c7a0 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f  . */.    WhereLo
1c7b0 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
1c7c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1c7d0 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c  ntrolling WhereL
1c7e0 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
1c7f0 20 20 75 33 32 20 66 6c 61 67 73 3b 20 20 20 20    u32 flags;    
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c810 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20 64 65  /* Flags that de
1c820 73 63 72 69 62 65 20 74 68 69 73 20 6c 6f 6f 70  scribe this loop
1c830 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d   */..    pLoop =
1c840 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
1c850 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f  .    flags = pLo
1c860 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20  op->wsFlags;.   
1c870 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
1c880 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28  E_MULTI_OR) || (
1c890 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
1c8a0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
1c8b0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69  ) return;..    i
1c8c0 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61 67 73  sSearch = (flags
1c8d0 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  &(WHERE_BTM_LIMI
1c8e0 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
1c8f0 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  T))!=0.         
1c900 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26 57 48     || ((flags&WH
1c910 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1c920 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  )==0 && (pLoop->
1c930 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29 29 0a  u.btree.nEq>0)).
1c940 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
1c950 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52  wctrlFlags&(WHER
1c960 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48  E_ORDERBY_MIN|WH
1c970 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29  ERE_ORDERBY_MAX)
1c980 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  );..    zMsg = s
1c990 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1c9a0 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72 63 68  , "%s", isSearch
1c9b0 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e 22  ?"SEARCH":"SCAN"
1c9c0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  );.    if( pItem
1c9d0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1c9e0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1c9f0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1ca00 73 67 2c 20 22 25 73 20 53 55 42 51 55 45 52 59  sg, "%s SUBQUERY
1ca10 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d   %d", zMsg,pItem
1ca20 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  ->iSelectId);.  
1ca30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
1ca40 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1ca50 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1ca60 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20 7a  "%s TABLE %s", z
1ca70 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  Msg, pItem->zNam
1ca80 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  e);.    }..    i
1ca90 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
1caa0 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
1cab0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1cac0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41  (db, zMsg, "%s A
1cad0 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74  S %s", zMsg, pIt
1cae0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
1caf0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67   }.    if( (flag
1cb00 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57  s & (WHERE_IPK|W
1cb10 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1cb20 45 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 41  E))==0.     && A
1cb30 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 75 2e 62  LWAYS(pLoop->u.b
1cb40 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 29 0a  tree.pIndex!=0).
1cb50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61      ){.      cha
1cb60 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c  r *zWhere = expl
1cb70 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62  ainIndexRange(db
1cb80 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e  , pLoop, pItem->
1cb90 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73  pTab);.      zMs
1cba0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1cbb0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 0a 20 20  ndf(db, zMsg,.  
1cbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 66               ((f
1cbd0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
1cbe0 4f 5f 49 4e 44 45 58 29 20 3f 20 0a 20 20 20 20  O_INDEX) ? .    
1cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1cc00 25 73 20 55 53 49 4e 47 20 41 55 54 4f 4d 41 54  %s USING AUTOMAT
1cc10 49 43 20 25 73 49 4e 44 45 58 25 2e 30 73 25 73  IC %sINDEX%.0s%s
1cc20 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  " :.            
1cc30 20 20 20 20 20 20 20 22 25 73 20 55 53 49 4e 47         "%s USING
1cc40 20 25 73 49 4e 44 45 58 20 25 73 25 73 22 29 2c   %sINDEX %s%s"),
1cc50 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1cc60 20 7a 4d 73 67 2c 20 28 28 66 6c 61 67 73 20 26   zMsg, ((flags &
1cc70 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
1cc80 20 3f 20 22 43 4f 56 45 52 49 4e 47 20 22 20 3a   ? "COVERING " :
1cc90 20 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20   ""),.          
1cca0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
1ccb0 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
1ccc0 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  e, zWhere);.    
1ccd0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1cce0 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20  db, zWhere);.   
1ccf0 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
1cd00 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d  s & WHERE_IPK)!=
1cd10 30 20 26 26 20 28 66 6c 61 67 73 20 26 20 57 48  0 && (flags & WH
1cd20 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21  ERE_CONSTRAINT)!
1cd30 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  =0 ){.      zMsg
1cd40 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1cd50 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1cd60 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50   USING INTEGER P
1cd70 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73  RIMARY KEY", zMs
1cd80 67 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66  g);..      if( f
1cd90 6c 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55  lags&(WHERE_COLU
1cda0 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_EQ|WHERE_COLU
1cdb0 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20  MN_IN) ){.      
1cdc0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1cdd0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1cde0 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29  g, "%s (rowid=?)
1cdf0 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
1ce00 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
1ce10 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  &WHERE_BOTH_LIMI
1ce20 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c  T)==WHERE_BOTH_L
1ce30 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
1ce40 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1ce50 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1ce60 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e   "%s (rowid>? AN
1ce70 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73  D rowid<?)", zMs
1ce80 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
1ce90 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f  if( flags&WHERE_
1cea0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1ceb0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1cec0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1ced0 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
1cee0 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  >?)", zMsg);.   
1cef0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
1cf00 41 59 53 28 66 6c 61 67 73 26 57 48 45 52 45 5f  AYS(flags&WHERE_
1cf10 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20  TOP_LIMIT) ){.  
1cf20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1cf30 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1cf40 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
1cf50 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d<?)", zMsg);.  
1cf60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e      }.    }.#ifn
1cf70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1cf80 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
1cf90 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73   else if( (flags
1cfa0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
1cfb0 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
1cfc0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1cfd0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1cfe0 73 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20  sg, "%s VIRTUAL 
1cff0 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25  TABLE INDEX %d:%
1d000 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20  s", zMsg,.      
1d010 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1d020 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
1d030 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  , pLoop->u.vtab.
1d040 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23  idxStr);.    }.#
1d050 65 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d  endif.    zMsg =
1d060 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1d070 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 22 2c  (db, zMsg, "%s",
1d080 20 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69   zMsg);.    sqli
1d090 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1d0a0 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64   OP_Explain, iId
1d0b0 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c  , iLevel, iFrom,
1d0c0 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
1d0d0 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
1d0e0 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
1d0f0 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c  OneScan(u,v,w,x,
1d100 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  y,z).#endif /* S
1d110 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
1d120 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  IN */.../*.** Ge
1d130 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1d140 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1d150 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20   iLevel-th loop 
1d160 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
1d170 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  use.** implement
1d180 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ation described 
1d190 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74  by pWInfo..*/.st
1d1a0 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64  atic Bitmask cod
1d1b0 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20  eOneLoopStart(. 
1d1c0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1d1d0 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74  fo,   /* Complet
1d1e0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
1d1f0 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  out the WHERE cl
1d200 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
1d210 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  evel,          /
1d220 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66  * Which level of
1d230 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f   pWInfo->a[] sho
1d240 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a  uld be coded */.
1d250 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
1d260 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20  dy     /* Which 
1d270 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72 65  tables are curre
1d280 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a  ntly available *
1d290 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b  /.){.  int j, k;
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1d2b0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
1d2c0 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
1d2d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
1d2e0 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
1d2f0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
1d300 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20   addrNxt;       
1d310 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75    /* Where to ju
1d320 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  mp to continue w
1d330 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
1d340 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d  case */.  int om
1d350 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f  itTable;       /
1d360 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65  * True if we use
1d370 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   the index only 
1d380 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20  */.  int bRev;  
1d390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d3a0 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
1d3b0 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  scan in reverse 
1d3c0 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  order */.  Where
1d3d0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
1d3e0 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65 76  /* The where lev
1d3f0 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  el to be coded *
1d400 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
1d410 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65 20  Loop;    /* The 
1d420 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1d430 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
1d440 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1d450 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70  WC;    /* Decomp
1d460 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  osition of the e
1d470 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75  ntire WHERE clau
1d480 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
1d490 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
1d4a0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45          /* A WHE
1d4b0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a  RE clause term *
1d4c0 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
1d4d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1d4e0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1d4f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
1d500 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
1d510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1d520 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1d530 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  on */.  Vdbe *v;
1d540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d550 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1d560 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64  repared stmt und
1d570 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73  er constructions
1d580 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1d590 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
1d5a0 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  tem;  /* FROM cl
1d5b0 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
1d5c0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  coded */.  int a
1d5d0 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
1d5e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
1d5f0 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
1d600 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
1d610 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
1d620 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
1d630 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
1d640 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
1d650 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  ith next cycle *
1d660 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65  /.  int iRowidRe
1d670 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  g = 0;        /*
1d680 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64   Rowid is stored
1d690 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
1d6a0 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a  r, if not zero *
1d6b0 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65  /.  int iRelease
1d6c0 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Reg = 0;      /*
1d6d0 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74   Temp register t
1d6e0 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65  o free before re
1d6f0 74 75 72 6e 69 6e 67 20 2a 2f 0a 20 20 42 69 74  turning */.  Bit
1d700 6d 61 73 6b 20 6e 65 77 4e 6f 74 52 65 61 64 79  mask newNotReady
1d710 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
1d720 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 70 50 61   value */..  pPa
1d730 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
1d740 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72  arse;.  v = pPar
1d750 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43  se->pVdbe;.  pWC
1d760 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
1d770 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1d780 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26  db;.  pLevel = &
1d790 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c  pWInfo->a[iLevel
1d7a0 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  ];.  pLoop = pLe
1d7b0 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70  vel->pWLoop;.  p
1d7c0 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66  TabItem = &pWInf
1d7d0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
1d7e0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
1d7f0 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
1d800 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65  ->iCursor;.  bRe
1d810 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76  v = (pWInfo->rev
1d820 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b  Mask>>iLevel)&1;
1d830 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28  .  omitTable = (
1d840 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1d850 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
1d860 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  !=0 .           
1d870 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
1d880 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46  lFlags & WHERE_F
1d890 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a  ORCE_TABLE)==0;.
1d8a0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1d8b0 74 28 28 76 2c 20 22 42 65 67 69 6e 20 4a 6f 69  t((v, "Begin Joi
1d8c0 6e 20 4c 6f 6f 70 20 25 64 22 2c 20 69 4c 65 76  n Loop %d", iLev
1d8d0 65 6c 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  el));..  /* Crea
1d8e0 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68  te labels for th
1d8f0 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63  e "break" and "c
1d900 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63  ontinue" instruc
1d910 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74  tions.  ** for t
1d920 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e  he current loop.
1d930 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72    Jump to addrBr
1d940 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  k to break out o
1d950 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a  f a loop..  ** J
1d960 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67  ump to cont to g
1d970 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  o immediately to
1d980 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
1d990 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
1d9a0 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  loop..  **.  ** 
1d9b0 57 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e  When there is an
1d9c0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65   IN operator, we
1d9d0 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64   also have a "ad
1d9e0 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61  drNxt" label tha
1d9f0 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20  t.  ** means to 
1da00 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
1da10 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20  e next IN value 
1da20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68  combination.  Wh
1da30 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72  en.  ** there ar
1da40 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72  e no IN operator
1da50 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  s in the constra
1da60 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e  ints, the "addrN
1da70 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69  xt" label.  ** i
1da80 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 22 61  s the same as "a
1da90 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20  ddrBrk"..  */.  
1daa0 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
1dab0 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76  ->addrBrk = pLev
1dac0 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71  el->addrNxt = sq
1dad0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1dae0 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e  el(v);.  addrCon
1daf0 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
1db00 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
1db10 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1db20 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1db30 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
1db40 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
1db50 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20   JOIN, allocate 
1db60 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  and.  ** initial
1db70 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ize a memory cel
1db80 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69  l that records i
1db90 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74  f this table mat
1dba0 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f  ches any.  ** ro
1dbb0 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61  w of the left ta
1dbc0 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  ble of the join.
1dbd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
1dbe0 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28  el->iFrom>0 && (
1dbf0 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e  pTabItem[0].join
1dc00 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
1dc10 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  =0 ){.    pLevel
1dc20 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b  ->iLeftJoin = ++
1dc30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1dc40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dc50 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1dc60 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  r, 0, pLevel->iL
1dc70 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64  eftJoin);.    Vd
1dc80 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
1dc90 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f  nit LEFT JOIN no
1dca0 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a  -match flag"));.
1dcb0 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
1dcc0 6c 20 63 61 73 65 20 6f 66 20 61 20 46 52 4f 4d  l case of a FROM
1dcd0 20 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79   clause subquery
1dce0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1dcf0 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
1dd00 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e    if( pTabItem->
1dd10 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  viaCoroutine ){.
1dd20 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64      int regYield
1dd30 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67   = pTabItem->reg
1dd40 52 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  Return;.    sqli
1dd50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1dd60 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61   OP_Integer, pTa
1dd70 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  bItem->addrFillS
1dd80 75 62 2d 31 2c 20 72 65 67 59 69 65 6c 64 29 3b  ub-1, regYield);
1dd90 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1dda0 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  =  sqlite3VdbeAd
1ddb0 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
1ddc0 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
1ddd0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1dde0 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 63 6f   "next row of co
1ddf0 2d 72 6f 75 74 69 6e 65 20 25 73 22 2c 20 70 54  -routine %s", pT
1de00 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e  abItem->pTab->zN
1de10 61 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ame));.    sqlit
1de20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1de30 4f 50 5f 49 66 2c 20 72 65 67 59 69 65 6c 64 2b  OP_If, regYield+
1de40 31 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  1, addrBrk);.   
1de50 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1de60 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a  _Goto;.  }else..
1de70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1de80 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1de90 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e  .  if(  (pLoop->
1dea0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1deb0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
1dec0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1ded0 31 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73  1:  The table is
1dee0 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65   a virtual-table
1def0 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74  .  Use the VFilt
1df00 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20  er and VNext.   
1df10 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20   **          to 
1df20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e  access the data.
1df30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
1df40 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61  iReg;   /* P3 Va
1df50 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74  lue for OP_VFilt
1df60 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
1df70 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20  drNotFound;.    
1df80 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  int nConstraint 
1df90 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b  = pLoop->nLTerm;
1dfa0 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ..    sqlite3Exp
1dfb0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1dfc0 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73  e);.    iReg = s
1dfd0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1dfe0 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73  ge(pParse, nCons
1dff0 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61  traint+2);.    a
1e000 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c  ddrNotFound = pL
1e010 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20  evel->addrBrk;. 
1e020 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
1e030 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b  onstraint; j++){
1e040 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 72 67  .      int iTarg
1e050 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20  et = iReg+j+2;. 
1e060 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f       pTerm = pLo
1e070 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
1e080 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
1e090 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1e0a0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
1e0b0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
1e0c0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1e0d0 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
1e0e0 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
1e0f0 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61  el, j, bRev, iTa
1e100 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61  rget);.        a
1e110 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c  ddrNotFound = pL
1e120 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
1e130 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e140 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e150 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  ode(pParse, pTer
1e160 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
1e170 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , iTarget);.    
1e180 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1e190 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e1a0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
1e1b0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1e1c0 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Num, iReg);.    
1e1d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e1e0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1e1f0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52   nConstraint, iR
1e200 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  eg+1);.    sqlit
1e210 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1e220 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72  OP_VFilter, iCur
1e230 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20  , addrNotFound, 
1e240 69 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20  iReg,.          
1e250 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1e260 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
1e270 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e280 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
1e290 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3f  .vtab.needFree ?
1e2a0 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34   P4_MPRINTF : P4
1e2b0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 70 4c  _STATIC);.    pL
1e2c0 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  oop->u.vtab.need
1e2d0 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Free = 0;.    fo
1e2e0 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72  r(j=0; j<nConstr
1e2f0 61 69 6e 74 20 26 26 20 6a 3c 31 36 3b 20 6a 2b  aint && j<16; j+
1e300 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
1e310 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  Loop->u.vtab.omi
1e320 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a 20  tMask>>j)&1 ){. 
1e330 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
1e340 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4c 6f 6f 70  rm(pLevel, pLoop
1e350 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b 0a 20 20  ->aLTerm[j]);.  
1e360 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1e370 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1e380 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  VNext;.    pLeve
1e390 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
1e3a0 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
1e3b0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1e3c0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
1e3d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1e3e0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52  Range(pParse, iR
1e3f0 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b  eg, nConstraint+
1e400 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  2);.    sqlite3E
1e410 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1e420 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a  se, 1);.  }else.
1e430 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1e440 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1e450 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4c  LE */..  if( (pL
1e460 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1e470 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20  HERE_IPK)!=0.   
1e480 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
1e490 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
1e4a0 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_IN|WHERE_COLU
1e4b0 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b 0a  MN_EQ))!=0.  ){.
1e4c0 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
1e4d0 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20  We can directly 
1e4e0 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67  reference a sing
1e4f0 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a  le row using an.
1e500 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1e510 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
1e520 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
1e530 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72  ROWID field.  Or
1e540 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1e550 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75   we reference mu
1e560 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e  ltiple rows usin
1e570 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e  g a "rowid IN (.
1e580 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20  ..)".    **     
1e590 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a       construct..
1e5a0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1e5b0 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  t( pLoop->u.btre
1e5c0 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20  e.nEq==1 );.    
1e5d0 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
1e5e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1e5f0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 54 65  pParse);.    pTe
1e600 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rm = pLoop->aLTe
1e610 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72  rm[0];.    asser
1e620 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
1e630 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
1e640 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ->pExpr!=0 );.  
1e650 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
1e660 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65  ble==0 );.    te
1e670 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
1e680 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1e690 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 69 52 6f  RTUAL );.    iRo
1e6a0 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75  widReg = codeEqu
1e6b0 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
1e6c0 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
1e6d0 20 30 2c 20 62 52 65 76 2c 20 69 52 65 6c 65 61   0, bRev, iRelea
1e6e0 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72  seReg);.    addr
1e6f0 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Nxt = pLevel->ad
1e700 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  drNxt;.    sqlit
1e710 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e720 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52  OP_MustBeInt, iR
1e730 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74  owidReg, addrNxt
1e740 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1e750 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
1e760 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20  otExists, iCur, 
1e770 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52  addrNxt, iRowidR
1e780 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg);.    sqlite3
1e790 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1e7a0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1e7b0 69 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20  iRowidReg, 1);. 
1e7c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e7d0 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
1e7e0 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
1e7f0 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43  dReg);.    VdbeC
1e800 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
1e810 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
1e820 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d  p = OP_Noop;.  }
1e830 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d  else if( (pLoop-
1e840 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1e850 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20  _IPK)!=0.       
1e860 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
1e870 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
1e880 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20  UMN_RANGE)!=0.  
1e890 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33  ){.    /* Case 3
1e8a0 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e  :  We have an in
1e8b0 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
1e8c0 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
1e8d0 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20  ROWID field..   
1e8e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74   */.    int test
1e8f0 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
1e900 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
1e910 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65   int memEndValue
1e920 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54   = 0;.    WhereT
1e930 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45  erm *pStart, *pE
1e940 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  nd;..    assert(
1e950 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
1e960 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
1e970 70 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20  pStart = pEnd = 
1e980 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  0;.    if( pLoop
1e990 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1e9a0 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53  E_BTM_LIMIT ) pS
1e9b0 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  tart = pLoop->aL
1e9c0 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69  Term[j++];.    i
1e9d0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1e9e0 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
1e9f0 4d 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f  MIT ) pEnd = pLo
1ea00 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1ea10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
1ea20 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d  art!=0 || pEnd!=
1ea30 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65  0 );.    if( bRe
1ea40 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  v ){.      pTerm
1ea50 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20   = pStart;.     
1ea60 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a   pStart = pEnd;.
1ea70 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65        pEnd = pTe
1ea80 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rm;.    }.    if
1ea90 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
1eaa0 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
1eab0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
1eac0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64  xpression that d
1ead0 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74  efines the start
1eae0 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
1eaf0 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20  int r1, rTemp;  
1eb00 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1eb10 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74  rs for holding t
1eb20 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72  he start boundar
1eb30 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  y */..      /* T
1eb40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
1eb50 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78  stant maps TK_xx
1eb60 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72   codes into corr
1eb70 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20  esponding .     
1eb80 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73   ** seek opcodes
1eb90 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e  .  It depends on
1eba0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72   a particular or
1ebb0 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a  dering of TK_xx.
1ebc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1ebd0 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b  onst u8 aMoveOp[
1ebe0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
1ebf0 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50   /* TK_GT */  OP
1ec00 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20  _SeekGt,.       
1ec10 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20      /* TK_LE */ 
1ec20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20   OP_SeekLe,.    
1ec30 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20         /* TK_LT 
1ec40 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20  */  OP_SeekLt,. 
1ec50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1ec60 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65  GE */  OP_SeekGe
1ec70 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
1ec80 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54  assert( TK_LE==T
1ec90 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f  K_GT+1 );      /
1eca0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1ecb0 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20  ordering.. */.  
1ecc0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1ecd0 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20  T==TK_GT+2 );   
1ece0 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68     /*  ... of th
1ecf0 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e  e TK_xx values..
1ed00 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1ed10 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b  t( TK_GE==TK_GT+
1ed20 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e  3 );      /*  ..
1ed30 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a  . is correcct. *
1ed40 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
1ed50 20 28 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67   (pStart->wtFlag
1ed60 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
1ed70 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1ed80 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74  case( pStart->wt
1ed90 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1eda0 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58  TUAL );.      pX
1edb0 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72   = pStart->pExpr
1edc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1edd0 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  pX!=0 );.      t
1ede0 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d  estcase( pStart-
1edf0 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
1ee00 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69  r ); /* transiti
1ee10 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ve constraints *
1ee20 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  /.      r1 = sql
1ee30 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1ee40 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
1ee50 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20  ght, &rTemp);.  
1ee60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ee70 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70  ddOp3(v, aMoveOp
1ee80 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20  [pX->op-TK_GT], 
1ee90 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72  iCur, addrBrk, r
1eea0 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
1eeb0 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
1eec0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1eed0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
1eee0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
1eef0 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 1);.      sql
1ef00 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1ef10 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70  eg(pParse, rTemp
1ef20 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65  );.      disable
1ef30 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74  Term(pLevel, pSt
1ef40 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  art);.    }else{
1ef50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ef60 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76  beAddOp2(v, bRev
1ef70 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f   ? OP_Last : OP_
1ef80 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64  Rewind, iCur, ad
1ef90 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  drBrk);.    }.  
1efa0 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20    if( pEnd ){.  
1efb0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
1efc0 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70      pX = pEnd->p
1efd0 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
1efe0 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
1eff0 20 20 20 61 73 73 65 72 74 28 20 28 70 45 6e 64     assert( (pEnd
1f000 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1f010 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20  _VNULL)==0 );.  
1f020 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
1f030 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  nd->leftCursor!=
1f040 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73  iCur ); /* Trans
1f050 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74  itive constraint
1f060 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  s */.      testc
1f070 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61  ase( pEnd->wtFla
1f080 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1f090 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e  L );.      memEn
1f0a0 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73  dValue = ++pPars
1f0b0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
1f0c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1f0d0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
1f0e0 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b  t, memEndValue);
1f0f0 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f  .      if( pX->o
1f100 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e  p==TK_LT || pX->
1f110 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20  op==TK_GT ){.   
1f120 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52       testOp = bR
1f130 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f  ev ? OP_Le : OP_
1f140 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  Ge;.      }else{
1f150 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
1f160 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a  = bRev ? OP_Lt :
1f170 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a   OP_Gt;.      }.
1f180 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
1f190 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b  m(pLevel, pEnd);
1f1a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74  .    }.    start
1f1b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1f1c0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1f1d0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62    pLevel->op = b
1f1e0 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
1f1f0 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  OP_Next;.    pLe
1f200 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
1f210 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
1f220 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73 73 65   start;.    asse
1f230 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d  rt( pLevel->p5==
1f240 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74 65 73  0 );.    if( tes
1f250 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
1f260 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20        iRowidReg 
1f270 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  = iReleaseReg = 
1f280 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1f290 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
1f2a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f2b0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
1f2c0 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
1f2d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f2e0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
1f2f0 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
1f300 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1f310 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f320 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d  Op3(v, testOp, m
1f330 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72  emEndValue, addr
1f340 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Brk, iRowidReg);
1f350 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f360 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
1f370 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
1f380 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   | SQLITE_JUMPIF
1f390 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NULL);.    }.  }
1f3a0 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  else if( pLoop->
1f3b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1f3c0 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 2f  INDEXED ){.    /
1f3d0 2a 20 43 61 73 65 20 34 3a 20 41 20 73 63 61 6e  * Case 4: A scan
1f3e0 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e   using an index.
1f3f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1f400 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45         The WHERE
1f410 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74   clause may cont
1f420 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ain zero or more
1f430 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a   equality .    *
1f440 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20  *         terms 
1f450 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70  ("==" or "IN" op
1f460 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65  erators) that re
1f470 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20  fer to the N.   
1f480 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74   **         left
1f490 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  -most columns of
1f4a0 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d   the index. It m
1f4b0 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a  ay also contain.
1f4c0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
1f4d0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1f4e0 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20  aints (>, <, >= 
1f4f0 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e  or <=) on the in
1f500 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dexed.    **    
1f510 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74       column that
1f520 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1f530 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c  lows the N equal
1f540 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20  ities. Only .   
1f550 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
1f560 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d  right-most colum
1f570 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71  n can be an ineq
1f580 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73  uality - the res
1f590 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20  t must.    **   
1f5a0 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d        use the "=
1f5b0 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72  =" and "IN" oper
1f5c0 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70  ators. For examp
1f5d0 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20  le, if the .    
1f5e0 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78  **         index
1f5f0 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20   is on (x,y,z), 
1f600 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
1f610 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61  ng clauses are a
1f620 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ll .    **      
1f630 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20     optimized:.  
1f640 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1f650 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a         x=5.    *
1f660 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1f670 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a   AND y=10.    **
1f680 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1f690 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
1f6a0 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1f6b0 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a  ND y>5 AND y<10.
1f6c0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1f6d0 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e    x=5 AND y=5 AN
1f6e0 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20  D z<=10.    **. 
1f6f0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
1f700 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74  e z<10 term of t
1f710 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e  he following can
1f720 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c  not be used, onl
1f730 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  y.    **        
1f740 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20   the x=5 term:. 
1f750 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1f760 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1f770 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20  z<10.    **.    
1f780 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79  **         N may
1f790 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72   be zero if ther
1f7a0 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79  e are inequality
1f7b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20   constraints..  
1f7c0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20    **         If 
1f7d0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65  there are no ine
1f7e0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1f7f0 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61  nts, then N is a
1f800 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
1f810 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20   least one..    
1f820 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1f830 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61    This case is a
1f840 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68  lso used when th
1f850 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
1f860 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20   clause.    **  
1f870 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
1f880 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20  ts but an index 
1f890 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77  is selected anyw
1f8a0 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20  ay, in order.   
1f8b0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66   **         to f
1f8c0 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20  orce the output 
1f8d0 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d  order to conform
1f8e0 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e   to an ORDER BY.
1f8f0 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74  .    */  .    st
1f900 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
1f910 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  tartOp[] = {.   
1f920 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20     0,.      0,. 
1f930 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20       OP_Rewind, 
1f940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
1f950 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  (!start_constrai
1f960 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26  nts && startEq &
1f970 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  &  !bRev) */.   
1f980 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20     OP_Last,     
1f990 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21          /* 3: (!
1f9a0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1f9b0 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
1f9c0 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
1f9d0 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20   OP_SeekGt,     
1f9e0 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61        /* 4: (sta
1f9f0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1fa00 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21  && !startEq && !
1fa10 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1fa20 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20  P_SeekLt,       
1fa30 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74      /* 5: (start
1fa40 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1fa50 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52   !startEq &&  bR
1fa60 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1fa70 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20  SeekGe,         
1fa80 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63    /* 6: (start_c
1fa90 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20  onstraints  &&  
1faa0 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76  startEq && !bRev
1fab0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1fac0 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20 20  ekLe            
1fad0 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 7: (start_con
1fae0 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
1faf0 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20  artEq &&  bRev) 
1fb00 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74  */.    };.    st
1fb10 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45  atic const u8 aE
1fb20 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndOp[] = {.     
1fb30 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20   OP_Noop,       
1fb40 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e        /* 0: (!en
1fb50 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a  d_constraints) *
1fb60 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45  /.      OP_IdxGE
1fb70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1fb80 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  1: (end_constrai
1fb90 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f  nts && !bRev) */
1fba0 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20  .      OP_IdxLT 
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
1fbc0 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
1fbd0 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20  ts && bRev) */. 
1fbe0 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45     };.    int nE
1fbf0 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
1fc00 65 65 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62  ee.nEq;  /* Numb
1fc10 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74  er of == or IN t
1fc20 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  erms */.    int 
1fc30 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20  isMinQuery = 0; 
1fc40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1fc50 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   this is an opti
1fc60 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e  mized SELECT min
1fc70 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  (x).. */.    int
1fc80 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
1fc90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73            /* Bas
1fca0 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
1fcb0 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61  ng constraint va
1fcc0 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lues */.    int 
1fcd0 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
1fce0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
1fcf0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20   register */.   
1fd00 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e   WhereTerm *pRan
1fd10 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a  geStart = 0;  /*
1fd20 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   Inequality cons
1fd30 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20  traint at range 
1fd40 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65  start */.    Whe
1fd50 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e  reTerm *pRangeEn
1fd60 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65  d = 0;    /* Ine
1fd70 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1fd80 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20  nt at range end 
1fd90 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
1fda0 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
1fdb0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1fdc0 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73 20  ange start uses 
1fdd0 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
1fde0 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20      int endEq;  
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67   /* True if rang
1fe10 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e  e end uses ==, >
1fe20 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69  = or <= */.    i
1fe30 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  nt start_constra
1fe40 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53  ints;       /* S
1fe50 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73  tart of range is
1fe60 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a   constrained */.
1fe70 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
1fe80 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  int;            
1fe90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
1fea0 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a  nstraint terms *
1feb0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
1fec0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
1fed0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
1fee0 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
1fef0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78   */.    int iIdx
1ff00 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
1ff10 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
1ff20 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1ff30 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
1ff40 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20   nExtraReg = 0; 
1ff50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1ff60 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67  ber of extra reg
1ff70 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f  isters needed */
1ff80 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  .    int op;    
1ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffa0 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e    /* Instruction
1ffb0 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63   opcode */.    c
1ffc0 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20  har *zStartAff; 
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1ffe0 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72  ffinity for star
1fff0 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74  t of range const
20000 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61  raint */.    cha
20010 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20 20  r *zEndAff;     
20020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
20030 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66  inity for end of
20040 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
20050 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d  t */..    pIdx =
20060 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
20070 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 49 64 78  pIndex;.    iIdx
20080 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
20090 64 78 43 75 72 3b 0a 0a 20 20 20 20 2f 2a 20 49  dxCur;..    /* I
200a0 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69  f this loop sati
200b0 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64  sfies a sort ord
200c0 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72 65  er (pOrderBy) re
200d0 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20 20  quest that .    
200e0 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74 6f  ** was passed to
200f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   this function t
20100 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53  o implement a "S
20110 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e  ELECT min(x) ...
20120 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c  " .    ** query,
20130 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
20140 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77   will only allow
20150 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e   the loop to run
20160 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69   for.    ** a si
20170 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20  ngle iteration. 
20180 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
20190 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72 65  the first row re
201a0 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68  turned.    ** sh
201b0 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20  ould not have a 
201c0 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65  NULL value store
201d0 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c  d in 'x'. If col
201e0 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a  umn 'x' is.    *
201f0 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20  * the first one 
20200 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71  after the nEq eq
20210 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
20220 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  ts in the index,
20230 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71  .    ** this req
20240 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69  uires some speci
20250 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20  al handling..   
20260 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49   */.    if( (pWI
20270 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26  nfo->wctrlFlags&
20280 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
20290 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  N)!=0.     && (p
202a0 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30  WInfo->bOBSat!=0
202b0 29 0a 20 20 20 20 20 26 26 20 28 70 49 64 78 2d  ).     && (pIdx-
202c0 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20  >nColumn>nEq).  
202d0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73    ){.      /* as
202e0 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
202f0 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20  nExpr==1 ); */. 
20300 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
20310 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70  pOrderBy->a[0].p
20320 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
20330 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  Idx->aiColumn[nE
20340 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 69  q] ); */.      i
20350 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20  sMinQuery = 1;. 
20360 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
20370 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
20380 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75  * Find any inequ
20390 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
203a0 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73   terms for the s
203b0 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20  tart and end .  
203c0 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67    ** of the rang
203d0 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6a  e. .    */.    j
203e0 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
203f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
20400 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
20410 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
20420 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61  Start = pLoop->a
20430 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20  LTerm[j++];.    
20440 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
20450 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
20460 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
20470 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
20480 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45  ){.      pRangeE
20490 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  nd = pLoop->aLTe
204a0 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e  rm[j++];.      n
204b0 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
204c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65    }..    /* Gene
204d0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
204e0 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72  luate all constr
204f0 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67  aint terms using
20500 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a   == or IN.    **
20510 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76   and store the v
20520 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74  alues of those t
20530 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79  erms in an array
20540 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
20550 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
20560 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f   regBase..    */
20570 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 63  .    regBase = c
20580 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
20590 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65 76 65  rms(pParse,pLeve
205a0 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52 65 67  l,bRev,nExtraReg
205b0 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  ,&zStartAff);.  
205c0 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c 69    zEndAff = sqli
205d0 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
205e0 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
205f0 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
20600 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20  ->addrNxt;..    
20610 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
20620 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64  ng a reverse ord
20630 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73  er scan on an as
20640 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f  cending index, o
20650 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61  r.    ** a forwa
20660 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  rd order scan on
20670 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
20680 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65  dex, interchange
20690 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61   the .    ** sta
206a0 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73  rt and end terms
206b0 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e   (pRangeStart an
206c0 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20  d pRangeEnd)..  
206d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45    */.    if( (nE
206e0 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  q<pIdx->nColumn 
206f0 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e  && bRev==(pIdx->
20700 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d  aSortOrder[nEq]=
20710 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29  =SQLITE_SO_ASC))
20720 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26  .     || (bRev &
20730 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  & pIdx->nColumn=
20740 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  =nEq).    ){.   
20750 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72     SWAP(WhereTer
20760 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20  m *, pRangeEnd, 
20770 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
20780 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73    }..    testcas
20790 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
207a0 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  & (pRangeStart->
207b0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
207c0 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  E)!=0 );.    tes
207d0 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
207e0 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61  rt && (pRangeSta
207f0 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
20800 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_GE)!=0 );.   
20810 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
20820 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45  eEnd && (pRangeE
20830 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
20840 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_LE)!=0 );.   
20850 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
20860 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45  eEnd && (pRangeE
20870 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
20880 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_GE)!=0 );.   
20890 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e   startEq = !pRan
208a0 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67  geStart || pRang
208b0 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
208c0 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
208d0 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20  );.    endEq =  
208e0 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70   !pRangeEnd || p
208f0 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
20900 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
20910 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63  GE);.    start_c
20920 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61  onstraints = pRa
20930 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e  ngeStart || nEq>
20940 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20  0;..    /* Seek 
20950 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
20960 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
20970 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20   the range. */. 
20980 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
20990 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
209a0 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20  angeStart ){.   
209b0 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
209c0 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70  = pRangeStart->p
209d0 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
209e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
209f0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
20a00 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29  ht, regBase+nEq)
20a10 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61  ;.      if( (pRa
20a20 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
20a30 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
20a40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
20a50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
20a60 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
20a70 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  t, regBase+nEq, 
20a80 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
20a90 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61  }.      if( zSta
20aa0 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20  rtAff ){.       
20ab0 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
20ac0 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
20ad0 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  ht, zStartAff[nE
20ae0 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  q])==SQLITE_AFF_
20af0 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20  NONE){.         
20b00 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   /* Since the co
20b10 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62  mparison is to b
20b20 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68  e performed with
20b30 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a   no conversions.
20b40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70            ** app
20b50 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72  lied to the oper
20b60 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66  ands, set the af
20b70 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20  finity to apply 
20b80 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20  to pRight to .  
20b90 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
20ba0 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a  E_AFF_NONE.  */.
20bb0 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74            zStart
20bc0 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
20bd0 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
20be0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
20bf0 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
20c00 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
20c10 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72  ge(pRight, zStar
20c20 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20  tAff[nEq]) ){.  
20c30 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
20c40 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
20c50 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
20c60 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20    }.      }  .  
20c70 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
20c80 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
20c90 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  e( pRangeStart->
20ca0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
20cb0 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65  IRTUAL );.    }e
20cc0 6c 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65  lse if( isMinQue
20cd0 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
20ce0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20cf0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
20d00 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
20d10 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
20d20 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20        startEq = 
20d30 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63  0;.      start_c
20d40 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a  onstraints = 1;.
20d50 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70      }.    codeAp
20d60 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
20d70 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
20d80 6e 73 74 72 61 69 6e 74 2c 20 7a 53 74 61 72 74  nstraint, zStart
20d90 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61  Aff);.    op = a
20da0 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63  StartOp[(start_c
20db0 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b  onstraints<<2) +
20dc0 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20   (startEq<<1) + 
20dd0 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72  bRev];.    asser
20de0 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20  t( op!=0 );.    
20df0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
20e00 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 74  _Rewind );.    t
20e10 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
20e20 4c 61 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  Last );.    test
20e30 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
20e40 6b 47 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  kGt );.    testc
20e50 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
20e60 47 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Ge );.    testca
20e70 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
20e80 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
20e90 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74  e( op==OP_SeekLt
20ea0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
20eb0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
20ec0 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
20ed0 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e  rNxt, regBase, n
20ee0 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20  Constraint);..  
20ef0 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61    /* Load the va
20f00 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71  lue for the ineq
20f10 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
20f20 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  t at the end of 
20f30 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65  the.    ** range
20f40 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a   (if any)..    *
20f50 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e  /.    nConstrain
20f60 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  t = nEq;.    if(
20f70 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20   pRangeEnd ){.  
20f80 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
20f90 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45   = pRangeEnd->pE
20fa0 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
20fb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
20fc0 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
20fd0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31  , regBase+nEq, 1
20fe0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20ff0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
21000 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
21010 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28  +nEq);.      if(
21020 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46   (pRangeEnd->wtF
21030 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
21040 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  L)==0 ){.       
21050 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21060 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52  IsNullJump(v, pR
21070 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
21080 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
21090 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
210a0 45 6e 64 41 66 66 20 29 7b 0a 20 20 20 20 20 20  EndAff ){.      
210b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
210c0 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
210d0 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71  ght, zEndAff[nEq
210e0 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
210f0 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ONE){.          
21100 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d  /* Since the com
21110 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65  parison is to be
21120 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20   performed with 
21130 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20  no conversions. 
21140 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c           ** appl
21150 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ied to the opera
21160 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66  nds, set the aff
21170 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74  inity to apply t
21180 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20  o pRight to .   
21190 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
211a0 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20  _AFF_NONE.  */. 
211b0 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66           zEndAff
211c0 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
211d0 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
211e0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
211f0 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
21200 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
21210 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b  pRight, zEndAff[
21220 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  nEq]) ){.       
21230 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20     zEndAff[nEq] 
21240 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
21250 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
21260 20 20 20 7d 20 20 0a 20 20 20 20 20 20 63 6f 64     }  .      cod
21270 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
21280 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
21290 6e 45 71 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b  nEq+1, zEndAff);
212a0 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
212b0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74  nt++;.      test
212c0 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d  case( pRangeEnd-
212d0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
212e0 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d  VIRTUAL );.    }
212f0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
21300 65 65 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66  ee(db, zStartAff
21310 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
21320 46 72 65 65 28 64 62 2c 20 7a 45 6e 64 41 66 66  Free(db, zEndAff
21330 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f  );..    /* Top o
21340 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20  f the loop body 
21350 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  */.    pLevel->p
21360 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
21370 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
21380 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
21390 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
213a0 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64   is past the end
213b0 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
213c0 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f  /.    op = aEndO
213d0 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20  p[(pRangeEnd || 
213e0 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76  nEq) * (1 + bRev
213f0 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  )];.    testcase
21400 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b  ( op==OP_Noop );
21410 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
21420 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20  p==OP_IdxGE );. 
21430 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
21440 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20  =OP_IdxLT );.   
21450 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70   if( op!=OP_Noop
21460 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21470 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
21480 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
21490 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
214a0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20   nConstraint);. 
214b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
214c0 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45  ChangeP5(v, endE
214d0 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20  q!=bRev ?1:0);. 
214e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
214f0 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
21500 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
21510 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
21520 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66   value.    ** of
21530 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
21540 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71 75  n that the inequ
21550 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20  ality contrains 
21560 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20  is not NULL..   
21570 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75   ** If it is, ju
21580 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
21590 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
215a0 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
215b0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
215c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
215d0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
215e0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
215f0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
21600 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
21610 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
21620 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
21630 54 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4c  T );.    if( (pL
21640 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
21650 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
21660 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
21670 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
21680 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
21690 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
216a0 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b  dxCur, nEq, r1);
216b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
216c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
216d0 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43  sNull, r1, addrC
216e0 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ont);.    }.    
216f0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
21700 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
21710 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20  );..    /* Seek 
21720 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  the table cursor
21730 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  , if required */
21740 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d  .    disableTerm
21750 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53  (pLevel, pRangeS
21760 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62  tart);.    disab
21770 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
21780 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 69  RangeEnd);.    i
21790 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b  f( !omitTable ){
217a0 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
217b0 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d   = iReleaseReg =
217c0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
217d0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
217e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
217f0 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
21800 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f  id, iIdxCur, iRo
21810 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
21820 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
21830 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
21840 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
21850 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21860 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21870 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f  _Seek, iCur, iRo
21880 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66  widReg);  /* Def
21890 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20  erred seek */.  
218a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f    }..    /* Reco
218b0 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  rd the instructi
218c0 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69  on used to termi
218d0 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44  nate the loop. D
218e0 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57  isable .    ** W
218f0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
21900 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74  s made redundant
21910 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 72 61   by the index ra
21920 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f  nge scan..    */
21930 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
21940 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21950 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  ONEROW ){.      
21960 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
21970 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Noop;.    }else 
21980 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
21990 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
219a0 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73  P_Prev;.    }els
219b0 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
219c0 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20  >op = OP_Next;. 
219d0 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
219e0 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  >p1 = iIdxCur;. 
219f0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
21a00 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
21a10 4f 4e 53 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b  ONSTRAINT)==0 ){
21a20 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
21a30 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
21a40 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
21a50 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  TEP;.    }else{.
21a60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
21a70 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
21a80 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69     }.  }else..#i
21a90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21aa0 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
21ab0 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  N.  if( pLoop->w
21ac0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
21ad0 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f  ULTI_OR ){.    /
21ae0 2a 20 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f  * Case 5:  Two o
21af0 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c  r more separatel
21b00 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20  y indexed terms 
21b10 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a  connected by OR.
21b20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
21b30 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
21b40 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
21b50 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b  BLE t1(a,b,c,d);
21b60 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
21b70 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
21b80 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  a);.    **   CRE
21b90 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20  ATE INDEX i2 ON 
21ba0 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(b);.    **   
21bb0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20  CREATE INDEX i3 
21bc0 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a  ON t1(c);.    **
21bd0 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
21be0 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
21bf0 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28   a=5 OR b=7 OR (
21c00 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20  c=11 AND d=13). 
21c10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
21c20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  the example, the
21c30 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64  re are three ind
21c40 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
21c50 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20  cted by OR..    
21c60 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  ** The top of th
21c70 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b  e loop looks lik
21c80 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
21c90 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
21ca0 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
21cb0 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
21cc0 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
21cd0 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20  reg 1.    **.   
21ce0 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61   ** Then, for ea
21cf0 63 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c  ch indexed term,
21d00 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20   the following. 
21d10 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
21d20 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65  .    ** RowSetTe
21d30 73 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74  st are such that
21d40 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
21d50 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
21d60 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a   inserted.    **
21d70 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74   into the RowSet
21d80 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
21d90 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74  dy present, cont
21da0 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20  rol skips the.  
21db0 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64    ** Gosub opcod
21dc0 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61  e and jumps stra
21dd0 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65  ight to the code
21de0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68   generated by Wh
21df0 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a  ereEnd()..    **
21e00 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73  .    **        s
21e10 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
21e20 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20  (<term>).    ** 
21e30 20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54           RowSetT
21e40 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  est             
21e50 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f       # Insert ro
21e60 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a  wid into rowset.
21e70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
21e80 47 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20  Gosub      2 A. 
21e90 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
21ea0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20  ite3WhereEnd(). 
21eb0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c     **.    ** Fol
21ec0 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65  lowing the above
21ed0 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e  , code to termin
21ee0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61  ate the loop. La
21ef0 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65  bel A, the targe
21f00 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
21f10 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d  Gosub above, jum
21f20 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75  ps to the instru
21f30 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65  ction right afte
21f40 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20  r the Goto..    
21f50 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
21f60 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
21f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
21f80 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
21f90 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
21fa0 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20            Goto  
21fb0 20 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20       B          
21fc0 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70        # The loop
21fd0 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20   is finished..  
21fe0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
21ff0 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e    A: <loop body>
22000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22010 20 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20   # Return data, 
22020 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a  whatever..    **
22030 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
22040 20 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20   Return     2   
22050 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a               # J
22060 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
22070 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20  Gosub.    **.   
22080 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66   **       B: <af
22090 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20  ter the loop>.  
220a0 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20    **.    */.    
220b0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
220c0 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  Wc;    /* The OR
220d0 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f  -clause broken o
220e0 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  ut into subterms
220f0 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20   */.    SrcList 
22100 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f  *pOrTab;       /
22110 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c  * Shortened tabl
22120 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61  e list or OR-cla
22130 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  use generation *
22140 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f  /.    Index *pCo
22150 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  v = 0;          
22160 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20     /* Potential 
22170 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28  covering index (
22180 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20  or NULL) */.    
22190 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50  int iCovCur = pP
221a0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f  arse->nTab++;  /
221b0 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f  * Cursor used fo
221c0 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69  r index scans (i
221d0 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69  f any) */..    i
221e0 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  nt regReturn = +
221f0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
22200 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
22210 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f  ster used with O
22220 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69  P_Gosub */.    i
22230 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30  nt regRowset = 0
22240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22250 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
22260 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20  ster for RowSet 
22270 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e  object */.    in
22280 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20  t regRowid = 0; 
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
222b0 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69  ter holding rowi
222c0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f  d */.    int iLo
222d0 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  opBody = sqlite3
222e0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
222f0 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c  ;  /* Start of l
22300 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20  oop body */.    
22310 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20  int iRetInit;   
22320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
22340 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72  ress of regRetur
22350 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e  n init */.    in
22360 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  t untestedTerms 
22370 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
22380 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e   /* Some terms n
22390 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65  ot completely te
223a0 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sted */.    int 
223b0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
223c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
223d0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
223e0 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64  /.    Expr *pAnd
223f0 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Expr = 0;       
22400 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22           /* An "
22410 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78  .. AND (...)" ex
22420 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a  pression */.   .
22430 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
22440 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20  p->aLTerm[0];.  
22450 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
22460 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
22470 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
22480 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20  or & WO_OR );.  
22490 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
224a0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
224b0 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20  _ORINFO)!=0 );. 
224c0 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72     pOrWc = &pTer
224d0 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
224e0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
224f0 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20   = OP_Return;.  
22500 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72    pLevel->p1 = r
22510 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f  egReturn;..    /
22520 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20 53  * Set up a new S
22530 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62  rcList in pOrTab
22540 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
22550 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e  table being scan
22560 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ned.    ** by th
22570 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61  is loop in the a
22580 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c  [0] slot and all
22590 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
225a0 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73   in a[1..] slots
225b0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65  ..    ** This be
225c0 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73  comes the SrcLis
225d0 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  t in the recursi
225e0 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ve call to sqlit
225f0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a  e3WhereBegin()..
22600 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
22610 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
22620 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f  ){.      int nNo
22630 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
22640 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
22650 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64  umber of notRead
22660 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  y tables */.    
22670 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
22680 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20  _item *origSrc; 
22690 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
226a0 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  list of tables *
226b0 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64  /.      nNotRead
226c0 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  y = pWInfo->nLev
226d0 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b  el - iLevel - 1;
226e0 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
226f0 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f  sqlite3StackAllo
22700 63 52 61 77 28 64 62 2c 0a 20 20 20 20 20 20 20  cRaw(db,.       
22710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22720 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72       sizeof(*pOr
22730 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a  Tab)+ nNotReady*
22740 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
22750 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [0]));.      if(
22760 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74   pOrTab==0 ) ret
22770 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20  urn notReady;.  
22780 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c      pOrTab->nAll
22790 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52 65  oc = (u8)(nNotRe
227a0 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  ady + 1);.      
227b0 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70  pOrTab->nSrc = p
227c0 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20  OrTab->nAlloc;. 
227d0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72 54       memcpy(pOrT
227e0 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c  ab->a, pTabItem,
227f0 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74 65   sizeof(*pTabIte
22800 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67 53  m));.      origS
22810 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  rc = pWInfo->pTa
22820 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  bList->a;.      
22830 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74  for(k=1; k<=nNot
22840 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20  Ready; k++){.   
22850 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72       memcpy(&pOr
22860 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67  Tab->a[k], &orig
22870 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46  Src[pLevel[k].iF
22880 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72  rom], sizeof(pOr
22890 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20  Tab->a[k]));.   
228a0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
228b0 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 70        pOrTab = p
228c0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
228d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
228e0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f  nitialize the ro
228f0 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74 6f  wset register to
22900 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41   contain NULL. A
22910 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20  n SQL NULL is . 
22920 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74     ** equivalent
22930 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f 77   to an empty row
22940 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  set..    **.    
22950 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69  ** Also initiali
22960 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20  ze regReturn to 
22970 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72  contain the addr
22980 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72  ess of the instr
22990 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69  uction .    ** i
229a0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
229b0 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75  wing the OP_Retu
229c0 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  rn at the bottom
229d0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68   of the loop. Th
229e0 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71  is.    ** is req
229f0 75 69 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f  uired in a few o
22a00 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e  bscure LEFT JOIN
22a10 20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e   cases where con
22a20 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a  trol jumps.    *
22a30 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f  * over the top o
22a40 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20  f the loop into 
22a50 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20  the body of it. 
22a60 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
22a70 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74   .    ** correct
22a80 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68   response for th
22a90 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f  e end-of-loop co
22aa0 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72  de (the OP_Retur
22ab0 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a  n) is to .    **
22ac0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
22ad0 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
22ae0 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61  ction, just as a
22af0 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69  n OP_Next does i
22b00 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20  f.    ** called 
22b10 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69  on an uninitiali
22b20 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20  zed cursor..    
22b30 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e  */.    if( (pWIn
22b40 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
22b50 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45   WHERE_DUPLICATE
22b60 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  S_OK)==0 ){.    
22b70 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b    regRowset = ++
22b80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
22b90 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b      regRowid = +
22ba0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
22bb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22bc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
22bd0 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29  l, 0, regRowset)
22be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74  ;.    }.    iRet
22bf0 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Init = sqlite3Vd
22c00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
22c10 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65  nteger, 0, regRe
22c20 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  turn);..    /* I
22c30 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57  f the original W
22c40 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a  HERE clause is z
22c50 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28   of the form:  (
22c60 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29  x1 OR x2 OR ...)
22c70 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68   AND y.    ** Th
22c80 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  en for every ter
22c90 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61  m xN, evaluate a
22ca0 73 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  s the subexpress
22cb0 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20  ion: xN AND z.  
22cc0 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74    ** That way, t
22cd0 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61  erms in y that a
22ce0 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f  re factored into
22cf0 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e   the disjunction
22d00 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
22d10 70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68 65  picked up by the
22d20 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
22d30 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
22d40 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20  Begin() below.. 
22d50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74     **.    ** Act
22d60 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65  ually, each sube
22d70 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
22d80 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e  verted to "xN AN
22d90 44 20 77 22 20 77 68 65 72 65 20 77 20 69 73 0a  D w" where w is.
22da0 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65      ** the "inte
22db0 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f  resting" terms o
22dc0 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74  f z - terms that
22dd0 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
22de0 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  te in the.    **
22df0 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
22e00 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
22e10 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68  IN, and terms th
22e20 61 74 20 61 72 65 20 75 73 61 62 6c 65 20 61 73  at are usable as
22e30 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73   .    ** indices
22e40 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
22e50 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  This optimizatio
22e60 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c  n also only appl
22e70 69 65 73 20 69 66 20 74 68 65 20 28 78 31 20 4f  ies if the (x1 O
22e80 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72  R x2 OR ...) ter
22e90 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  m.    ** is not 
22ea0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
22eb0 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
22ec0 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a  LEFT JOIN..    *
22ed0 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68 74 74  * See ticket htt
22ee0 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
22ef0 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36  rg/src/info/f236
22f00 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20  9304e4.    */.  
22f10 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
22f20 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
22f30 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72  iTerm;.      for
22f40 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c  (iTerm=0; iTerm<
22f50 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72  pWC->nTerm; iTer
22f60 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  m++){.        Ex
22f70 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d  pr *pExpr = pWC-
22f80 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b  >a[iTerm].pExpr;
22f90 0a 20 20 20 20 20 20 20 20 69 66 28 20 26 70 57  .        if( &pW
22fa0 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20 70  C->a[iTerm] == p
22fb0 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Term ) continue;
22fc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70  .        if( Exp
22fd0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
22fe0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
22ff0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23000 20 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b       if( pWC->a[
23010 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26  iTerm].wtFlags &
23020 20 28 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 20 29   (TERM_ORINFO) )
23030 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
23040 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69     if( (pWC->a[i
23050 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20  Term].eOperator 
23060 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63  & WO_ALL)==0 ) c
23070 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
23080 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
23090 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
230a0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  r, 0);.        p
230b0 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65  AndExpr = sqlite
230c0 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 41 6e  3ExprAnd(db, pAn
230d0 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20  dExpr, pExpr);. 
230e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
230f0 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20   pAndExpr ){.   
23100 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20       pAndExpr = 
23110 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
23120 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20  rse, TK_AND, 0, 
23130 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20 20  pAndExpr, 0);.  
23140 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
23150 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
23160 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b  rWc->nTerm; ii++
23170 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
23180 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70  rm *pOrTerm = &p
23190 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  OrWc->a[ii];.   
231a0 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
231b0 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
231c0 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f   || (pOrTerm->eO
231d0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44  perator & WO_AND
231e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
231f0 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57  WhereInfo *pSubW
23200 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
23210 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c  * Info for singl
23220 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a  e OR-term scan *
23230 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
23240 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72  pOrExpr = pOrTer
23250 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
23260 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 26    if( pAndExpr &
23270 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
23280 74 79 28 70 4f 72 45 78 70 72 2c 20 45 50 5f 46  ty(pOrExpr, EP_F
23290 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
232a0 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e        pAndExpr->
232b0 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72 3b  pLeft = pOrExpr;
232c0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 45 78  .          pOrEx
232d0 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20  pr = pAndExpr;. 
232e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
232f0 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
23300 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74   table entries t
23310 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70  hat match term p
23320 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  OrTerm. */.     
23330 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73     pSubWInfo = s
23340 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
23350 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c  (pParse, pOrTab,
23360 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a   pOrExpr, 0, 0,.
23370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23380 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 4d          WHERE_OM
23390 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c 20  IT_OPEN_CLOSE | 
233a0 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c  WHERE_AND_ONLY |
233b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
233c0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 46           WHERE_F
233d0 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48 45  ORCE_TABLE | WHE
233e0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
233f0 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20  , iCovCur);.    
23400 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
23410 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d  WInfo || pParse-
23420 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
23430 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
23440 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e       if( pSubWIn
23450 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
23460 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c  WhereLoop *pSubL
23470 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 65  oop;.          e
23480 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
23490 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
234a0 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53  rse, pOrTab, &pS
234b0 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69  ubWInfo->a[0], i
234c0 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69  Level, pLevel->i
234d0 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20  From, 0.        
234e0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
234f0 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
23500 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
23510 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30  UPLICATES_OK)==0
23520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23530 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d  int iSet = ((ii=
23540 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29  =pOrWc->nTerm-1)
23550 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20  ?-1:ii);.       
23560 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20       int r;.    
23570 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69          r = sqli
23580 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
23590 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61  lumn(pParse, pTa
235a0 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c  bItem->pTab, -1,
235b0 20 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20   iCur, .        
235c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235e0 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20   regRowid, 0);. 
235f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
23600 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
23610 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74  v, OP_RowSetTest
23620 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20  , regRowset,.   
23630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
23650 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
23660 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53  Addr(v)+2, r, iS
23670 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  et);.          }
23680 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23690 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
236a0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74  OP_Gosub, regRet
236b0 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  urn, iLoopBody);
236c0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
236d0 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  he pSubWInfo->un
236e0 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67  testedTerms flag
236f0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
23700 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20   OR term.       
23710 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20     ** contained 
23720 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20  one or more AND 
23730 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52  term from a notR
23740 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65  eady table.  The
23750 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
23760 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74  rms from the not
23770 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c  Ready table coul
23780 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  d not be tested 
23790 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  and will.       
237a0 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65     ** need to be
237b0 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20   tested later.. 
237c0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
237d0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
237e0 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
237f0 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72  ms ) untestedTer
23800 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  ms = 1;..       
23810 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20     /* If all of 
23820 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  the OR-connected
23830 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d   terms are optim
23840 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ized using the s
23850 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ame.          **
23860 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20   index, and the 
23870 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20  index is opened 
23880 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  using the same c
23890 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20  ursor number.   
238a0 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63         ** by eac
238b0 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  h call to sqlite
238c0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61  3WhereBegin() ma
238d0 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c  de by this loop,
238e0 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20   it may.        
238f0 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65    ** be possible
23900 20 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64   to use that ind
23910 65 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67  ex as a covering
23920 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
23930 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
23940 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  * If the call to
23950 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
23960 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c  in() above resul
23970 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68  ted in a scan th
23980 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
23990 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61  uses an index, a
239a0 6e 64 20 74 68 69 73 20 69 73 20 65 69 74 68 65  nd this is eithe
239b0 72 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63  r the first OR-c
239c0 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20  onnected term.  
239d0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
239e0 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65  ssed or the inde
239f0 78 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  x is the same as
23a00 20 74 68 61 74 20 75 73 65 64 20 62 79 20 61 6c   that used by al
23a10 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  l previous.     
23a20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73       ** terms, s
23a30 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63  et pCov to the c
23a40 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e  andidate coverin
23a50 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69  g index. Otherwi
23a60 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20  se, set .       
23a70 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55     ** pCov to NU
23a80 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  LL to indicate t
23a90 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65  hat no candidate
23aa0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
23ab0 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20  will .          
23ac0 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e  ** be available.
23ad0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
23ae0 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f 70          pSubLoop
23af0 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b   = pSubWInfo->a[
23b00 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20  0].pWLoop;.     
23b10 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53       assert( (pS
23b20 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  ubLoop->wsFlags 
23b30 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
23b40 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  EX)==0 );.      
23b50 20 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f 6f      if( (pSubLoo
23b60 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
23b70 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
23b80 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69 69            && (ii
23b90 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d  ==0 || pSubLoop-
23ba0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3d  >u.btree.pIndex=
23bb0 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20 20  =pCov).         
23bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23bd0 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66  assert( pSubWInf
23be0 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d  o->a[0].iIdxCur=
23bf0 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20  =iCovCur );.    
23c00 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70          pCov = p
23c10 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  SubLoop->u.btree
23c20 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  .pIndex;.       
23c30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23c40 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a        pCov = 0;.
23c50 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
23c60 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68         /* Finish
23c70 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67   the loop throug
23c80 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
23c90 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
23ca0 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
23cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
23cc0 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29  reEnd(pSubWInfo)
23cd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23ce0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c    }.    }.    pL
23cf0 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20  evel->u.pCovidx 
23d00 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28 20  = pCov;.    if( 
23d10 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69  pCov ) pLevel->i
23d20 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75 72  IdxCur = iCovCur
23d30 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45 78  ;.    if( pAndEx
23d40 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e 64  pr ){.      pAnd
23d50 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b  Expr->pLeft = 0;
23d60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
23d70 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41 6e  prDelete(db, pAn
23d80 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  dExpr);.    }.  
23d90 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
23da0 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69  ngeP1(v, iRetIni
23db0 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
23dc0 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20  rrentAddr(v));. 
23dd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23de0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
23df0 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72   0, pLevel->addr
23e00 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Brk);.    sqlite
23e10 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
23e20 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  l(v, iLoopBody);
23e30 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ..    if( pWInfo
23e40 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c  ->nLevel>1 ) sql
23e50 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62  ite3StackFree(db
23e60 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69  , pOrTab);.    i
23e70 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d  f( !untestedTerm
23e80 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28  s ) disableTerm(
23e90 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
23ea0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
23eb0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
23ec0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
23ed0 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73  ..  {.    /* Cas
23ee0 65 20 36 3a 20 20 54 68 65 72 65 20 69 73 20 6e  e 6:  There is n
23ef0 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20  o usable index. 
23f00 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f   We must do a co
23f10 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20  mplete.    **   
23f20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74         scan of t
23f30 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e  he entire table.
23f40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74  .    */.    stat
23f50 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65  ic const u8 aSte
23f60 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c  p[] = { OP_Next,
23f70 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20   OP_Prev };.    
23f80 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
23f90 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f  aStart[] = { OP_
23fa0 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20  Rewind, OP_Last 
23fb0 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  };.    assert( b
23fc0 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d  Rev==0 || bRev==
23fd0 31 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  1 );.    pLevel-
23fe0 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76  >op = aStep[bRev
23ff0 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  ];.    pLevel->p
24000 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
24010 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73  evel->p2 = 1 + s
24020 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24030 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d  (v, aStart[bRev]
24040 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
24050 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35  ;.    pLevel->p5
24060 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
24070 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
24080 45 50 3b 0a 20 20 7d 0a 20 20 6e 65 77 4e 6f 74  EP;.  }.  newNot
24090 52 65 61 64 79 20 3d 20 6e 6f 74 52 65 61 64 79  Ready = notReady
240a0 20 26 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49   & ~getMask(&pWI
240b0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
240c0 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65  Cur);..  /* Inse
240d0 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
240e0 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73  every subexpress
240f0 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20  ion that can be 
24100 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20  completely.  ** 
24110 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74  computed using t
24120 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f  he current set o
24130 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  f tables..  */. 
24140 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
24150 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, j=pWC->nTerm;
24160 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d   j>0; j--, pTerm
24170 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
24180 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  E;.    testcase(
24190 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
241a0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
241b0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
241c0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
241d0 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
241e0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
241f0 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
24200 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
24210 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
24220 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
24230 65 72 65 71 41 6c 6c 20 26 20 6e 65 77 4e 6f 74  ereqAll & newNot
24240 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20  Ready)!=0 ){.   
24250 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49     testcase( pWI
24260 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
24270 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ms==0.          
24280 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
24290 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
242a0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
242b0 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  Y)!=0 );.      p
242c0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
242d0 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  erms = 1;.      
242e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
242f0 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e      pE = pTerm->
24300 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
24310 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20  t( pE!=0 );.    
24320 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
24330 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61  tJoin && !ExprHa
24340 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
24350 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
24360 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
24370 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
24380 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
24390 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c  e, pE, addrCont,
243a0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
243b0 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  LL);.    pTerm->
243c0 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
243d0 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  CODED;.  }..  /*
243e0 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20   Insert code to 
243f0 74 65 73 74 20 66 6f 72 20 69 6d 70 6c 69 65 64  test for implied
24400 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 61 73   constraints bas
24410 65 64 20 6f 6e 20 74 72 61 6e 73 69 74 69 76 69  ed on transitivi
24420 74 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 22  ty.  ** of the "
24430 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  ==" operator..  
24440 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  **.  ** Example:
24450 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
24460 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 22 74  ause contains "t
24470 31 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20 22 74  1.a=t2.b" and "t
24480 32 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20 61 6e  2.b=123".  ** an
24490 64 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20  d we are coding 
244a0 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20  the t1 loop and 
244b0 74 68 65 20 74 32 20 6c 6f 6f 70 20 68 61 73 20  the t2 loop has 
244c0 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 2c 0a 20  not yet coded,. 
244d0 20 2a 2a 20 74 68 65 6e 20 77 65 20 63 61 6e 6e   ** then we cann
244e0 6f 74 20 75 73 65 20 74 68 65 20 22 74 31 2e 61  ot use the "t1.a
244f0 3d 74 32 2e 62 22 20 63 6f 6e 73 74 72 61 69 6e  =t2.b" constrain
24500 74 2c 20 62 75 74 20 77 65 20 63 61 6e 20 63 6f  t, but we can co
24510 64 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d 70 6c  de.  ** the impl
24520 69 65 64 20 22 74 31 2e 61 3d 31 32 33 22 20 63  ied "t1.a=123" c
24530 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a  onstraint..  */.
24540 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
24550 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, j=pWC->nTerm
24560 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72  ; j>0; j--, pTer
24570 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
24580 70 45 2c 20 2a 70 45 41 6c 74 3b 0a 20 20 20 20  pE, *pEAlt;.    
24590 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b  WhereTerm *pAlt;
245a0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
245b0 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
245c0 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
245d0 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
245e0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
245f0 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51  Operator!=(WO_EQ
24600 55 49 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e  UIV|WO_EQ) ) con
24610 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
24620 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
24630 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
24640 65 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  e;.    if( pLeve
24650 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63  l->iLeftJoin ) c
24660 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20  ontinue;.    pE 
24670 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
24680 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
24690 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
246a0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b   EP_FromJoin) );
246b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
246c0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
246d0 20 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21   & newNotReady)!
246e0 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20 3d  =0 );.    pAlt =
246f0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
24700 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  Cur, pTerm->u.le
24710 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61  ftColumn, notRea
24720 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
24730 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41 6c   0);.    if( pAl
24740 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
24750 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e 77  .    if( pAlt->w
24760 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43  tFlags & (TERM_C
24770 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
24780 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
24790 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pAlt->eOperator 
247a0 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 74  & WO_EQ );.    t
247b0 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
247c0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
247d0 20 29 3b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70   );.    VdbeNoop
247e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
247f0 69 6e 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f  in transitive co
24800 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a 20 20 20  nstraint"));.   
24810 20 70 45 41 6c 74 20 3d 20 73 71 6c 69 74 65 33   pEAlt = sqlite3
24820 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62  StackAllocRaw(db
24830 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c 74 29  , sizeof(*pEAlt)
24840 29 3b 0a 20 20 20 20 69 66 28 20 70 45 41 6c 74  );.    if( pEAlt
24850 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 41 6c 74   ){.      *pEAlt
24860 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b   = *pAlt->pExpr;
24870 0a 20 20 20 20 20 20 70 45 41 6c 74 2d 3e 70 4c  .      pEAlt->pL
24880 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b  eft = pE->pLeft;
24890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
248a0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
248b0 2c 20 70 45 41 6c 74 2c 20 61 64 64 72 43 6f 6e  , pEAlt, addrCon
248c0 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
248d0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
248e0 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62  ite3StackFree(db
248f0 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20 20 7d 0a  , pEAlt);.    }.
24900 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20    }..  /* For a 
24910 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c  LEFT OUTER JOIN,
24920 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
24930 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20  hat will record 
24940 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20  the fact that.  
24950 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
24960 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74  row of the right
24970 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68   table has match
24980 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  ed the left tabl
24990 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  e.  .  */.  if( 
249a0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
249b0 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n ){.    pLevel-
249c0 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c  >addrFirst = sql
249d0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
249e0 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
249f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
24a00 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
24a10 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
24a20 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  n);.    VdbeComm
24a30 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20  ent((v, "record 
24a40 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29  LEFT JOIN hit"))
24a50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
24a60 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
24a70 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  se);.    for(pTe
24a80 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20  rm=pWC->a, j=0; 
24a90 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b  j<pWC->nTerm; j+
24aa0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
24ab0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
24ac0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
24ad0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
24ae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
24af0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
24b00 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
24b10 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
24b20 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
24b30 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
24b40 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
24b50 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
24b60 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 65 77 4e  prereqAll & newN
24b70 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
24b80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
24b90 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
24ba0 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20  erms );.        
24bb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
24bc0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
24bd0 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  pTerm->pExpr );.
24be0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24bf0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
24c00 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61   pTerm->pExpr, a
24c10 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
24c20 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
24c30 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
24c40 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
24c50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
24c60 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
24c70 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65  eg(pParse, iRele
24c80 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74 75  aseReg);..  retu
24c90 72 6e 20 6e 65 77 4e 6f 74 52 65 61 64 79 3b 0a  rn newNotReady;.
24ca0 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
24cb0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
24cc0 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65  ** Print a Where
24cd0 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20  Loop object for 
24ce0 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73  debugging purpos
24cf0 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  es.*/.static voi
24d00 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74  d whereLoopPrint
24d10 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 53  (WhereLoop *p, S
24d20 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
24d30 29 7b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b  ){.  int nb = 1+
24d40 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b  (pTabList->nSrc+
24d50 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74 20 53  7)/8;.  struct S
24d60 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
24d70 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  em = pTabList->a
24d80 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61   + p->iTab;.  Ta
24d90 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65  ble *pTab = pIte
24da0 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  m->pTab;.  sqlit
24db0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
24dc0 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c  c%2d.%0*llx.%0*l
24dd0 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20  lx", p->cId,.   
24de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24df0 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70    p->iTab, nb, p
24e00 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20  ->maskSelf, nb, 
24e10 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73 71  p->prereq);.  sq
24e20 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24e30 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20  (" %12s",.      
24e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
24e50 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70  Item->zAlias ? p
24e60 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70  Item->zAlias : p
24e70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  Tab->zName);.  i
24e80 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
24e90 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
24ea0 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  BLE)==0 ){.    i
24eb0 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  f( p->u.btree.pI
24ec0 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 63 6f  ndex ){.      co
24ed0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
24ee0 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
24ef0 64 65 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  dex->zName;.    
24f00 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
24f10 20 7a 4e 61 6d 65 20 3d 20 22 69 70 6b 22 3b 0a   zName = "ipk";.
24f20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
24f30 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
24f40 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37  _autoindex_", 17
24f50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
24f60 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53  int i = sqlite3S
24f70 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d  trlen30(zName) -
24f80 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   1;.        whil
24f90 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27  e( zName[i]!='_'
24fa0 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20   ) i--;.        
24fb0 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20  zName += i;.    
24fc0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
24fd0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25  3DebugPrintf(".%
24fe0 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65  -16s %2d", zName
24ff0 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  , p->u.btree.nEq
25000 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25010 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
25020 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22  Printf("%20s",""
25030 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
25040 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  {.    char *z;. 
25050 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62     if( p->u.vtab
25060 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20  .idxStr ){.     
25070 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
25080 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22  intf("(%d,\"%s\"
25090 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20  ,%x)",.         
250a0 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62         p->u.vtab
250b0 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74  .idxNum, p->u.vt
250c0 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e  ab.idxStr, p->u.
250d0 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
250e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
250f0 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
25100 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20  intf("(%d,%x)", 
25110 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
25120 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  , p->u.vtab.omit
25130 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mask);.    }.   
25140 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25150 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29  ntf(" %-19s", z)
25160 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
25170 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ee(z);.  }.  sql
25180 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25190 22 20 66 20 25 30 34 78 20 4e 20 25 64 22 2c 20  " f %04x N %d", 
251a0 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e  p->wsFlags, p->n
251b0 4c 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65  LTerm);.  sqlite
251c0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63  3DebugPrintf(" c
251d0 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c  ost %d,%d,%d\n",
251e0 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72   p->rSetup, p->r
251f0 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 7d  Run, p->nOut);.}
25200 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
25210 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f  onvert bulk memo
25220 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20  ry into a valid 
25230 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63  WhereLoop that c
25240 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20  an be passed.** 
25250 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  to whereLoopClea
25260 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f  r harmlessly..*/
25270 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
25280 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65  reLoopInit(Where
25290 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61  Loop *p){.  p->a
252a0 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72  LTerm = p->aLTer
252b0 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54  mSpace;.  p->nLT
252c0 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c  erm = 0;.  p->nL
252d0 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
252e0 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  (p->aLTermSpace)
252f0 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d  ;.  p->wsFlags =
25300 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
25310 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ar the WhereLoop
25320 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65  .u union.  Leave
25330 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72   WhereLoop.pLTer
25340 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61  m intact..*/.sta
25350 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
25360 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c  opClearUnion(sql
25370 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
25380 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
25390 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
253a0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c  RE_VIRTUALTABLE|
253b0 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
253c0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  ) ){.    if( (p-
253d0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
253e0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
253f0 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e  0 && p->u.vtab.n
25400 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20  eedFree ){.     
25410 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
25420 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
25430 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
25440 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
25450 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
25460 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d  dxStr = 0;.    }
25470 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46  else if( (p->wsF
25480 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
25490 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  O_INDEX)!=0 && p
254a0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
254b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
254c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
254d0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
254e0 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20  ->zColAff);.    
254f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
25500 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  db, p->u.btree.p
25510 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  Index);.      p-
25520 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
25530 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
25540 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
25550 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f  te internal memo
25560 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65  ry used by a Whe
25570 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
25580 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
25590 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69  reLoopClear(sqli
255a0 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
255b0 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
255c0 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
255d0 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
255e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
255f0 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c  LTerm);.  whereL
25600 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
25610 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  , p);.  whereLoo
25620 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  pInit(p);.}../*.
25630 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  ** Increase the 
25640 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
25650 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54  n for pLoop->aLT
25660 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c  erm[] to be at l
25670 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69  east n..*/.stati
25680 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52  c int whereLoopR
25690 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64  esize(sqlite3 *d
256a0 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  b, WhereLoop *p,
256b0 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65   int n){.  Where
256c0 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20  Term **paNew;.  
256d0 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e  if( p->nLSlot>=n
256e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
256f0 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29  _OK;.  n = (n+7)
25700 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73  &~7;.  paNew = s
25710 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
25720 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  w(db, sizeof(p->
25730 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20  aLTerm[0])*n);. 
25740 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20   if( paNew==0 ) 
25750 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
25760 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61  MEM;.  memcpy(pa
25770 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20  New, p->aLTerm, 
25780 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
25790 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b  [0])*p->nLSlot);
257a0 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d  .  if( p->aLTerm
257b0 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  !=p->aLTermSpace
257c0 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
257d0 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b  (db, p->aLTerm);
257e0 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
257f0 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f  aNew;.  p->nLSlo
25800 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20  t = n;.  return 
25810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
25820 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e  .** Transfer con
25830 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65  tent from the se
25840 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20  cond pLoop into 
25850 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74  the first..*/.st
25860 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
25870 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a  opXfer(sqlite3 *
25880 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
25890 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  To, WhereLoop *p
258a0 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 77 68 65  From){.  if( whe
258b0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
258c0 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54   pTo, pFrom->nLT
258d0 65 72 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51  erm) ) return SQ
258e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 77 68  LITE_NOMEM;.  wh
258f0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
25900 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 6d 65  n(db, pTo);.  me
25910 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c  mcpy(pTo, pFrom,
25920 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52   WHERE_LOOP_XFER
25930 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  _SZ);.  memcpy(p
25940 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f  To->aLTerm, pFro
25950 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e  m->aLTerm, pTo->
25960 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54  nLTerm*sizeof(pT
25970 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a  o->aLTerm[0]));.
25980 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46    if( pFrom->wsF
25990 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
259a0 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
259b0 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e   pFrom->u.vtab.n
259c0 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  eedFree = 0;.  }
259d0 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d  else if( (pFrom-
259e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
259f0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
25a00 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e  ){.    pFrom->u.
25a10 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
25a20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
25a30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
25a40 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72  ** Delete a Wher
25a50 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
25a60 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
25a70 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69  eLoopDelete(sqli
25a80 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
25a90 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c  op *p){.  whereL
25aa0 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b  oopClear(db, p);
25ab0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
25ac0 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
25ad0 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e  * Free a WhereIn
25ae0 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a  fo structure.*/.
25af0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
25b00 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65  eInfoFree(sqlite
25b10 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f  3 *db, WhereInfo
25b20 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28   *pWInfo){.  if(
25b30 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20   ALWAYS(pWInfo) 
25b40 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75  ){.    whereClau
25b50 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d  seClear(&pWInfo-
25b60 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65  >sWC);.    while
25b70 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  ( pWInfo->pLoops
25b80 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c   ){.      WhereL
25b90 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d  oop *p = pWInfo-
25ba0 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70  >pLoops;.      p
25bb0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20  WInfo->pLoops = 
25bc0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
25bd0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
25be0 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ete(db, p);.    
25bf0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
25c00 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
25c10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
25c20 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20  sert or replace 
25c30 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  a WhereLoop entr
25c40 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70  y using the temp
25c50 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a  late supplied..*
25c60 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
25c70 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
25c80 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72   might be overwr
25c90 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77  itten if the new
25ca0 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20   template.** is 
25cb0 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66  better and has f
25cc0 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
25cd0 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c  s.  Or the templ
25ce0 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  ate will be igno
25cf0 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e  red.** and no in
25d00 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20  sert will occur 
25d10 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  if an existing W
25d20 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74  hereLoop is fast
25d30 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65  er and has.** fe
25d40 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
25d50 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61   than the templa
25d60 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61  te.  Otherwise a
25d70 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69   new WhereLoop i
25d80 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64  s.** added based
25d90 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65   on the template
25da0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c  ..**.** If pBuil
25db0 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e  der->pOrSet is n
25dc0 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20  ot NULL then we 
25dd0 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
25de0 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72  only the.** prer
25df0 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52  equisites and rR
25e00 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74  un and nOut cost
25e10 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20  s of the N best 
25e20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20  loops.  That.** 
25e30 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67  information is g
25e40 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70  athered in the p
25e50 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
25e60 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70  object.  This sp
25e70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73  ecial.** process
25e80 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
25e90 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61   only for OR cla
25ea0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
25eb0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d  **.** When accum
25ec0 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  ulating multiple
25ed0 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75   loops (when pBu
25ee0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
25ef0 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69   NULL) we.** sti
25f00 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ll might overwri
25f10 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73  te similar loops
25f20 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65   with the new te
25f30 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a  mplate if the.**
25f40 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74   template is bet
25f50 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20  ter.  Loops may 
25f60 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
25f70 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
25f80 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
25f90 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  re met:.**.**   
25fa0 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20   (1)  They have 
25fb0 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a  the same iTab..*
25fc0 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68  *    (2)  They h
25fd0 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f  ave the same iSo
25fe0 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29  rtIdx..**    (3)
25ff0 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
26000 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72  as same or fewer
26010 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
26020 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  an the current l
26030 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54  oop.**    (4)  T
26040 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20  he template has 
26050 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65  the same or lowe
26060 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20  r cost than the 
26070 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20  current loop.** 
26080 20 20 20 28 35 29 20 20 54 68 65 20 74 65 6d 70     (5)  The temp
26090 6c 61 74 65 20 75 73 65 73 20 6d 6f 72 65 20 74  late uses more t
260a0 65 72 6d 73 20 6f 66 20 74 68 65 20 73 61 6d 65  erms of the same
260b0 20 69 6e 64 65 78 20 62 75 74 20 68 61 73 20 6e   index but has n
260c0 6f 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  o additional.** 
260d0 20 20 20 20 20 20 20 20 64 65 70 65 6e 64 65 6e          dependen
260e0 63 69 65 73 20 20 20 20 20 20 20 20 20 20 0a 2a  cies          .*
260f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
26100 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65  reLoopInsert(Whe
26110 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
26120 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f  Builder, WhereLo
26130 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a  op *pTemplate){.
26140 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
26150 50 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65 78 74  Prev, *p, *pNext
26160 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 49 6e 66   = 0;.  WhereInf
26170 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
26180 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
26190 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
261a0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
261b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c  ;..  /* If pBuil
261c0 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64  der->pOrSet is d
261d0 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c  efined, then onl
261e0 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  y keep track of 
261f0 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61  the costs.  ** a
26200 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f  nd prereqs..  */
26210 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d  .  if( pBuilder-
26220 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23 69  >pOrSet!=0 ){.#i
26230 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
26240 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20 3d  BLED.    u16 n =
26250 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
26260 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20  t->n;.    int x 
26270 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65  =.#endif.    whe
26280 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c  reOrInsert(pBuil
26290 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65  der->pOrSet, pTe
262a0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20  mplate->prereq, 
262b0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
262c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262e0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
262f0 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45  nOut);.#if WHERE
26300 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
26310 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
26320 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
26330 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
26340 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20  bugPrintf(x?"   
26350 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72  or-%d:  ":"   or
26360 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20  -X:  ", n);.    
26370 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
26380 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e  (pTemplate, pWIn
26390 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20  fo->pTabList);. 
263a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
263b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
263c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72  ;.  }..  /* Sear
263d0 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ch for an existi
263e0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  ng WhereLoop to 
263f0 6f 76 65 72 77 72 69 74 65 2c 20 6f 72 20 77 68  overwrite, or wh
26400 69 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a 20 70  ich takes.  ** p
26410 72 69 6f 72 69 74 79 20 6f 76 65 72 20 70 54 65  riority over pTe
26420 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 66  mplate..  */.  f
26430 6f 72 28 70 70 50 72 65 76 3d 26 70 57 49 6e 66  or(ppPrev=&pWInf
26440 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70  o->pLoops, p=*pp
26450 50 72 65 76 3b 20 70 3b 20 70 70 50 72 65 76 3d  Prev; p; ppPrev=
26460 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70  &p->pNextLoop, p
26470 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69  =*ppPrev){.    i
26480 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
26490 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70  plate->iTab || p
264a0 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d  ->iSortIdx!=pTem
264b0 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20  plate->iSortIdx 
264c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65  ){.      /* If e
264d0 69 74 68 65 72 20 74 68 65 20 69 54 61 62 20 6f  ither the iTab o
264e0 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65  r iSortIdx value
264f0 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c  s for two WhereL
26500 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72 65 6e  oop are differen
26510 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  t.      ** then 
26520 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73  those WhereLoops
26530 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73   need to be cons
26540 69 64 65 72 65 64 20 73 65 70 61 72 61 74 65 6c  idered separatel
26550 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20  y.  Neither is. 
26560 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64       ** a candid
26570 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74  ate to replace t
26580 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20  he other. */.   
26590 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
265a0 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65   }.    /* In the
265b0 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
265c0 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65  ntation, the rSe
265d0 74 75 70 20 76 61 6c 75 65 20 69 73 20 65 69 74  tup value is eit
265e0 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20  her zero.    ** 
265f0 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62  or the cost of b
26600 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d  uilding an autom
26610 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67  atic index (Nlog
26620 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e  N) and the NlogN
26630 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73  .    ** is the s
26640 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62  ame for compatib
26650 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a  le WhereLoops. *
26660 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
26670 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54  >rSetup==0 || pT
26680 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d  emplate->rSetup=
26690 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
266a0 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75       || p->rSetu
266b0 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p==pTemplate->rS
266c0 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  etup );..    /* 
266d0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
266e0 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72  e() always gener
266f0 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73  ates and inserts
26700 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
26710 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65  ndex.    ** case
26720 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63   first.  Hence c
26730 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64  ompatible candid
26740 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e  ate WhereLoops n
26750 65 76 65 72 20 68 61 76 65 20 61 20 6c 61 72 67  ever have a larg
26760 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70  er.    ** rSetup
26770 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55  . Call this SETU
26780 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20  P-INVARIANT */. 
26790 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
267a0 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  etup>=pTemplate-
267b0 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20  >rSetup );..    
267c0 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26  if( (p->prereq &
267d0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
267e0 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20  eq)==p->prereq. 
267f0 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70      && p->rSetup
26800 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  <=pTemplate->rSe
26810 74 75 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72  tup.     && p->r
26820 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run<=pTemplate->
26830 72 52 75 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  rRun.    ){.    
26840 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
26850 20 74 61 6b 65 6e 20 77 68 65 6e 20 70 20 69 73   taken when p is
26860 20 65 71 75 61 6c 20 6f 72 20 62 65 74 74 65 72   equal or better
26870 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 20   than pTemplate 
26880 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  in .      ** all
26890 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64 65 6e   of (1) dependen
268a0 63 65 73 20 28 32 29 20 73 65 74 75 70 2d 63 6f  ces (2) setup-co
268b0 73 74 2c 20 61 6e 64 20 28 33 29 20 72 75 6e 2d  st, and (3) run-
268c0 63 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61  cost. */.      a
268d0 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
268e0 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  ==pTemplate->rSe
268f0 74 75 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28  tup );.      if(
26900 20 70 2d 3e 6e 4c 54 65 72 6d 3c 70 54 65 6d 70   p->nLTerm<pTemp
26910 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 0a 20 20 20  late->nLTerm.   
26920 20 20 20 20 26 26 20 28 70 2d 3e 77 73 46 6c 61      && (p->wsFla
26930 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
26940 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26  ED)!=0.       &&
26950 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46   (pTemplate->wsF
26960 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
26970 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
26980 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  && p->u.btree.pI
26990 6e 64 65 78 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  ndex==pTemplate-
269a0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 0a  >u.btree.pIndex.
269b0 20 20 20 20 20 20 20 26 26 20 70 2d 3e 70 72 65         && p->pre
269c0 72 65 71 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  req==pTemplate->
269d0 70 72 65 72 65 71 0a 20 20 20 20 20 20 29 7b 0a  prereq.      ){.
269e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 77          /* Overw
269f0 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67  rite an existing
26a00 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20   WhereLoop with 
26a10 61 6e 20 73 69 6d 69 6c 61 72 20 6f 6e 65 20 74  an similar one t
26a20 68 61 74 20 75 73 65 73 0a 20 20 20 20 20 20 20  hat uses.       
26a30 20 2a 2a 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f   ** more terms o
26a40 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  f the index */. 
26a50 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
26a60 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
26a70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26a80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26a90 20 2f 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73   /* pTemplate is
26aa0 20 6e 6f 74 20 68 65 6c 70 66 75 6c 2e 0a 20 20   not helpful..  
26ab0 20 20 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20        ** Return 
26ac0 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
26ad0 20 6f 72 20 61 64 64 69 6e 67 20 61 6e 79 74 68   or adding anyth
26ae0 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 67  ing */.        g
26af0 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  oto whereLoopIns
26b00 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20  ert_noop;.      
26b10 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
26b20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65  (p->prereq & pTe
26b30 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d  mplate->prereq)=
26b40 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72  =pTemplate->prer
26b50 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52  eq.     && p->rR
26b60 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un>=pTemplate->r
26b70 52 75 6e 0a 20 20 20 20 20 26 26 20 41 4c 57 41  Run.     && ALWA
26b80 59 53 28 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  YS(p->rSetup>=pT
26b90 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 29  emplate->rSetup)
26ba0 20 2f 2a 20 53 65 65 20 53 45 54 55 50 2d 49 4e   /* See SETUP-IN
26bb0 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f  VARIANT above */
26bc0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
26bd0 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78   Overwrite an ex
26be0 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
26bf0 20 77 69 74 68 20 61 20 62 65 74 74 65 72 20 6f   with a better o
26c00 6e 65 3a 20 6f 6e 65 20 74 68 61 74 20 69 73 0a  ne: one that is.
26c10 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20        ** better 
26c20 61 74 20 6f 6e 65 20 6f 66 20 28 31 29 20 64 65  at one of (1) de
26c30 70 65 6e 64 65 6e 63 65 73 2c 20 28 32 29 20 73  pendences, (2) s
26c40 65 74 75 70 2d 63 6f 73 74 2c 20 6f 72 20 28 33  etup-cost, or (3
26c50 29 20 72 75 6e 2d 63 6f 73 74 0a 20 20 20 20 20  ) run-cost.     
26c60 20 2a 2a 20 61 6e 64 20 69 73 20 6e 6f 20 77 6f   ** and is no wo
26c70 72 73 65 20 69 6e 20 61 6e 79 20 6f 66 20 74 68  rse in any of th
26c80 6f 73 65 20 63 61 74 65 67 6f 72 69 65 73 2e 20  ose categories. 
26c90 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  */.      pNext =
26ca0 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
26cb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26cc0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  }.  }..  /* If w
26cd0 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
26ce0 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  nt it means that
26cf0 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75   either p[] shou
26d00 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ld be overwritte
26d10 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d  n.  ** with pTem
26d20 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65  plate[] if p[] e
26d30 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d  xists, or if p==
26d40 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61  NULL then alloca
26d50 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68  te a new.  ** Wh
26d60 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65  ereLoop and inse
26d70 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20  rt it..  */.#if 
26d80 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
26d90 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
26da0 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
26db0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30   ){.    if( p!=0
26dc0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26dd0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
26de0 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20  s-del:  ");.    
26df0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
26e00 28 70 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  (p, pWInfo->pTab
26e10 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
26e20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
26e30 6e 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22  ntf("ins-new:  "
26e40 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  );.    whereLoop
26e50 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
26e60 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
26e70 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  t);.  }.#endif. 
26e80 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
26e90 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
26ea0 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
26eb0 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a  of(WhereLoop));.
26ec0 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
26ed0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
26ee0 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  EM;.    whereLoo
26ef0 70 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20  pInit(p);.  }.  
26f00 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62  whereLoopXfer(db
26f10 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  , p, pTemplate);
26f20 0a 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20  .  p->pNextLoop 
26f30 3d 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70 50 72  = pNext;.  *ppPr
26f40 65 76 20 3d 20 70 3b 0a 20 20 69 66 28 20 28 70  ev = p;.  if( (p
26f50 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
26f60 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
26f70 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  =0 ){.    Index 
26f80 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62  *pIndex = p->u.b
26f90 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
26fa0 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70   if( pIndex && p
26fb0 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29  Index->tnum==0 )
26fc0 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  {.      p->u.btr
26fd0 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
26fe0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
26ff0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
27000 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
27010 74 68 65 20 69 6e 73 65 72 74 20 69 73 20 61 20  the insert is a 
27020 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65 4c 6f  no-op */.whereLo
27030 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a 0a 23  opInsert_noop:.#
27040 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
27050 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
27060 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
27070 30 78 38 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  0x8 ){.    sqlit
27080 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69  e3DebugPrintf("i
27090 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20  ns-noop: ");.   
270a0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
270b0 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66  pTemplate, pWInf
270c0 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  o->pTabList);.  
270d0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
270e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 7d  n SQLITE_OK;  .}
270f0 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20  ../*.** We have 
27100 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20 70  so far matched p
27110 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
27120 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73  .btree.nEq terms
27130 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 70 49   of the index pI
27140 6e 64 65 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20  ndex..** Try to 
27150 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a  match one more..
27160 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d  **.** If pProbe-
27170 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d  >tnum==0, that m
27180 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61  eans pIndex is a
27190 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64   fake index used
271a0 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45   for the.** INTE
271b0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
271c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
271d0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
271e0 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f  Index(.  WhereLo
271f0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
27200 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  der,     /* The 
27210 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72  WhereLoop factor
27220 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  y */.  struct Sr
27230 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
27240 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  ,      /* FROM c
27250 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
27260 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49   analyzed */.  I
27270 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20  ndex *pProbe,   
27280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27290 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53  * An index on pS
272a0 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  rc */.  WhereCos
272b0 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20  t nInMul        
272c0 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e          /* log(N
272d0 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69  umber of iterati
272e0 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a  ons due to IN) *
272f0 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
27300 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
27310 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a  der->pWInfo;  /*
27320 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63   WHERE analyse c
27330 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
27340 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
27350 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  fo->pParse;     
27360 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
27370 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
27380 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
27390 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  >db;       /* Da
273a0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
273b0 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74  n malloc context
273c0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
273d0 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
273e0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
273f0 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65  e WhereLoop unde
27400 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
27410 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
27420 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
27430 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65      /* A WhereTe
27440 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65  rm under conside
27450 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
27460 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  opMask;         
27470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
27480 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66  alid operators f
27490 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  or constraints *
274a0 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  /.  WhereScan sc
274b0 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  an;             
274c0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
274d0 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73 20  for WHERE terms 
274e0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76  */.  Bitmask sav
274f0 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20  ed_prereq;      
27500 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
27510 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
27520 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20  prereq */.  u16 
27530 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20  saved_nLTerm;   
27540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
27550 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
27560 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f   pNew->nLTerm */
27570 0a 20 20 69 6e 74 20 73 61 76 65 64 5f 6e 45 71  .  int saved_nEq
27580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27590 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
275a0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e  alue of pNew->u.
275b0 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75  btree.nEq */.  u
275c0 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73  32 saved_wsFlags
275d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
275e0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
275f0 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67   of pNew->wsFlag
27600 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  s */.  WhereCost
27610 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20   saved_nOut;    
27620 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
27630 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
27640 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20  ->nOut */.  int 
27650 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
27660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
27670 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
27680 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
27690 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
276a0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
276b0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
276c0 6f 64 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ode */.  WhereCo
276d0 73 74 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20  st nRowEst;     
276e0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69           /* Esti
276f0 6d 61 74 65 64 20 69 6e 64 65 78 20 73 65 6c 65  mated index sele
27700 63 74 69 76 69 74 79 20 2a 2f 0a 20 20 57 68 65  ctivity */.  Whe
27710 72 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b  reCost rLogSize;
27720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27730 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62  Logarithm of tab
27740 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65  le size */.  Whe
27750 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30  reTerm *pTop = 0
27760 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20  , *pBtm = 0; /* 
27770 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72  Top and bottom r
27780 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
27790 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42   */..  pNew = pB
277a0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
277b0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
277c0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
277d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61  LITE_NOMEM;..  a
277e0 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
277f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
27800 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
27810 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  ;.  assert( (pNe
27820 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
27830 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
27840 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
27850 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27860 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
27870 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c   opMask = WO_LT|
27880 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69  WO_LE;.  }else i
27890 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c  f( pProbe->tnum<
278a0 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69  =0 || (pSrc->joi
278b0 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
278c0 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73  !=0 ){.    opMas
278d0 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  k = WO_EQ|WO_IN|
278e0 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
278f0 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65  T|WO_LE;.  }else
27900 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
27910 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53  O_EQ|WO_IN|WO_IS
27920 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  NULL|WO_GT|WO_GE
27930 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20  |WO_LT|WO_LE;.  
27940 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  }.  if( pProbe->
27950 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d  bUnordered ) opM
27960 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57  ask &= ~(WO_GT|W
27970 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
27980 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  );..  assert( pN
27990 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
279a0 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  =pProbe->nColumn
279b0 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
279c0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3c 20 70 50  u.btree.nEq < pP
279d0 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  robe->nColumn ){
279e0 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f  .    iCol = pPro
279f0 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65  be->aiColumn[pNe
27a00 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b  w->u.btree.nEq];
27a10 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 77  .    nRowEst = w
27a20 68 65 72 65 43 6f 73 74 28 70 50 72 6f 62 65 2d  hereCost(pProbe-
27a30 3e 61 69 52 6f 77 45 73 74 5b 70 4e 65 77 2d 3e  >aiRowEst[pNew->
27a40 75 2e 62 74 72 65 65 2e 6e 45 71 2b 31 5d 29 3b  u.btree.nEq+1]);
27a50 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74  .    if( nRowEst
27a60 3d 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f  ==0 && pProbe->o
27a70 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
27a80 29 20 6e 52 6f 77 45 73 74 20 3d 20 31 3b 0a 20  ) nRowEst = 1;. 
27a90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c   }else{.    iCol
27aa0 20 3d 20 2d 31 3b 0a 20 20 20 20 6e 52 6f 77 45   = -1;.    nRowE
27ab0 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54  st = 0;.  }.  pT
27ac0 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49  erm = whereScanI
27ad0 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c  nit(&scan, pBuil
27ae0 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e  der->pWC, pSrc->
27af0 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20  iCursor, iCol,. 
27b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b10 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70         opMask, p
27b20 50 72 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f  Probe);.  saved_
27b30 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74  nEq = pNew->u.bt
27b40 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64  ree.nEq;.  saved
27b50 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e  _nLTerm = pNew->
27b60 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f  nLTerm;.  saved_
27b70 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e  wsFlags = pNew->
27b80 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64  wsFlags;.  saved
27b90 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e  _prereq = pNew->
27ba0 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f  prereq;.  saved_
27bb0 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  nOut = pNew->nOu
27bc0 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  t;.  pNew->rSetu
27bd0 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a  p = 0;.  rLogSiz
27be0 65 20 3d 20 65 73 74 4c 6f 67 28 77 68 65 72 65  e = estLog(where
27bf0 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52  Cost(pProbe->aiR
27c00 6f 77 45 73 74 5b 30 5d 29 29 3b 0a 20 20 66 6f  owEst[0]));.  fo
27c10 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
27c20 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70  K && pTerm!=0; p
27c30 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
27c40 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20  Next(&scan)){.  
27c50 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23    int nIn = 0;.#
27c60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
27c70 42 4c 45 5f 53 54 41 54 34 0a 20 20 20 20 69 6e  BLE_STAT4.    in
27c80 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42  t nRecValid = pB
27c90 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
27ca0 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  d;.    assert( p
27cb0 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64  New->nOut==saved
27cc0 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28  _nOut );.    if(
27cd0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
27ce0 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d   & TERM_VNULL)!=
27cf0 30 20 26 26 20 70 53 72 63 2d 3e 70 54 61 62 2d  0 && pSrc->pTab-
27d00 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e  >aCol[iCol].notN
27d10 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ull ){.      con
27d20 74 69 6e 75 65 3b 20 2f 2a 20 73 6b 69 70 20 49  tinue; /* skip I
27d30 53 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  S NOT NULL const
27d40 72 61 69 6e 74 73 20 6f 6e 20 61 20 4e 4f 54 20  raints on a NOT 
27d50 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  NULL column */. 
27d60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
27d70 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
27d80 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
27d90 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
27da0 75 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ue;..    assert(
27db0 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76   pNew->nOut==sav
27dc0 65 64 5f 6e 4f 75 74 20 29 3b 0a 0a 20 20 20 20  ed_nOut );..    
27dd0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
27de0 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
27df0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
27e00 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71  .nEq = saved_nEq
27e10 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
27e20 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
27e30 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  m;.    if( where
27e40 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
27e50 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
27e60 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a  m+1) ) break; /*
27e70 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77   OOM */.    pNew
27e80 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
27e90 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d  LTerm++] = pTerm
27ea0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
27eb0 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72  eq = (saved_prer
27ec0 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  eq | pTerm->prer
27ed0 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77  eqRight) & ~pNew
27ee0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
27ef0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f  pNew->rRun = rLo
27f00 67 53 69 7a 65 3b 20 2f 2a 20 42 61 73 65 6c 69  gSize; /* Baseli
27f10 6e 65 20 63 6f 73 74 20 69 73 20 6c 6f 67 32 28  ne cost is log2(
27f20 4e 29 2e 20 20 41 64 6a 75 73 74 6d 65 6e 74 73  N).  Adjustments
27f30 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69 66   below */.    if
27f40 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
27f50 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  or & WO_IN ){.  
27f60 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
27f70 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
27f80 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
27f90 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
27fa0 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66  UMN_IN;.      if
27fb0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
27fc0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
27fd0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
27fe0 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45    /* "x IN (SELE
27ff0 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e  CT ...)":  TUNIN
28000 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  G: the SELECT re
28010 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
28020 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34  .        nIn = 4
28030 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d  6;  assert( 46==
28040 77 68 65 72 65 43 6f 73 74 28 32 35 29 20 29 3b  whereCost(25) );
28050 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
28060 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
28070 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d  .pList && pExpr-
28080 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
28090 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
280a0 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c  x IN (value, val
280b0 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20  ue, ...)" */.   
280c0 20 20 20 20 20 6e 49 6e 20 3d 20 77 68 65 72 65       nIn = where
280d0 43 6f 73 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c  Cost(pExpr->x.pL
280e0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
280f0 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
28100 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 3b 0a 20 20  >rRun += nIn;.  
28110 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
28120 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70  e.nEq++;.      p
28130 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77  New->nOut = nRow
28140 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e  Est + nInMul + n
28150 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  In;.    }else if
28160 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
28170 6f 72 20 26 20 28 57 4f 5f 45 51 29 20 29 7b 0a  or & (WO_EQ) ){.
28180 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
28190 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
281a0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
281b0 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  L|WHERE_COLUMN_I
281c0 4e 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  N))!=0.         
281d0 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 49 6e 4d           || nInM
281e0 75 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ul==0 );.      p
281f0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
28200 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b  WHERE_COLUMN_EQ;
28210 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
28220 30 20 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  0  .       || (p
28230 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Probe->onError!=
28240 4f 45 5f 4e 6f 6e 65 20 26 26 20 6e 49 6e 4d 75  OE_None && nInMu
28250 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  l==0.           
28260 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
28270 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43  .nEq==pProbe->nC
28280 6f 6c 75 6d 6e 2d 31 29 0a 20 20 20 20 20 20 29  olumn-1).      )
28290 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
282a0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
282b0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
282c0 49 4e 29 3d 3d 30 20 7c 7c 20 69 43 6f 6c 3c 30  IN)==0 || iCol<0
282d0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
282e0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
282f0 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20  RE_ONEROW;.     
28300 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75   }.      pNew->u
28310 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20  .btree.nEq++;.  
28320 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
28330 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75   nRowEst + nInMu
28340 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
28350 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
28360 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20  r & (WO_ISNULL) 
28370 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ){.      pNew->w
28380 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
28390 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20  COLUMN_NULL;.   
283a0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
283b0 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a  .nEq++;.      /*
283c0 20 54 55 4e 49 4e 47 3a 20 49 53 20 4e 55 4c 4c   TUNING: IS NULL
283d0 20 73 65 6c 65 63 74 73 20 32 20 72 6f 77 73 20   selects 2 rows 
283e0 2a 2f 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 31  */.      nIn = 1
283f0 30 3b 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d  0;  assert( 10==
28400 77 68 65 72 65 43 6f 73 74 28 32 29 20 29 3b 0a  whereCost(2) );.
28410 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
28420 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e   = nRowEst + nIn
28430 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d  Mul + nIn;.    }
28440 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
28450 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
28460 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20  GT|WO_GE) ){.   
28470 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
28480 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28490 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  WO_GT );.      t
284a0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
284b0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
284c0 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
284d0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
284e0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
284f0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
28500 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65        pBtm = pTe
28510 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  rm;.      pTop =
28520 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
28530 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
28540 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28550 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b  (WO_LT|WO_LE) );
28560 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28570 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
28580 72 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20  r & WO_LT );.   
28590 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
285a0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
285b0 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70  WO_LE );.      p
285c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
285d0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
285e0 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  GE|WHERE_TOP_LIM
285f0 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  IT;.      pTop =
28600 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42   pTerm;.      pB
28610 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c  tm = (pNew->wsFl
28620 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
28630 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20  LIMIT)!=0 ?.    
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28650 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
28660 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20  ew->nLTerm-2] : 
28670 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
28680 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
28690 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
286a0 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  NGE ){.      /* 
286b0 41 64 6a 75 73 74 20 6e 4f 75 74 20 61 6e 64 20  Adjust nOut and 
286c0 72 52 75 6e 20 66 6f 72 20 53 54 41 54 33 20 72  rRun for STAT3 r
286d0 61 6e 67 65 20 76 61 6c 75 65 73 20 2a 2f 0a 20  ange values */. 
286e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
286f0 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e  w->nOut==saved_n
28700 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 77 68 65  Out );.      whe
28710 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70  reRangeScanEst(p
28720 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
28730 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26 70 4e   pBtm, pTop, &pN
28740 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 7d  ew->nOut);.    }
28750 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
28760 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 20 20  NABLE_STAT4.    
28770 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26  if( nInMul==0 &&
28780 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65   pProbe->nSample
28790 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
287a0 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
287b0 54 45 5f 53 74 61 74 33 29 20 29 7b 0a 20 20 20  TE_Stat3) ){.   
287c0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
287d0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
287e0 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75       tRowcnt nOu
287f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
28800 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
28810 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
28820 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20  SNULL))!=0 ){.  
28830 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28840 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
28850 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
28860 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
28870 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
28880 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
28890 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
288a0 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
288b0 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
288c0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e  Expr->pRight, &n
288d0 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Out);.      }els
288e0 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f  e if( (pTerm->eO
288f0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
28900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
28910 20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72    !ExprHasProper
28920 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
28930 53 65 6c 65 63 74 29 20 20 29 7b 0a 20 20 20 20  Select)  ){.    
28940 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e      rc = whereIn
28950 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
28960 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d  pBuilder, pExpr-
28970 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29  >x.pList, &nOut)
28980 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28990 61 73 73 65 72 74 28 20 6e 4f 75 74 3d 3d 30 20  assert( nOut==0 
289a0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
289b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f   );.      if( nO
289c0 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f  ut ){.        nO
289d0 75 74 20 3d 20 77 68 65 72 65 43 6f 73 74 28 6e  ut = whereCost(n
289e0 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Out);.        pN
289f0 65 77 2d 3e 6e 4f 75 74 20 3d 20 4d 49 4e 28 6e  ew->nOut = MIN(n
28a00 4f 75 74 2c 20 73 61 76 65 64 5f 6e 4f 75 74 29  Out, saved_nOut)
28a10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28a20 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
28a30 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
28a40 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c  (WHERE_IDX_ONLY|
28a50 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29  WHERE_IPK))==0 )
28a60 7b 0a 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20  {.      /* Each 
28a70 72 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61 20 73  row involves a s
28a80 74 65 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78  tep of the index
28a90 2c 20 74 68 65 6e 20 61 20 62 69 6e 61 72 79 20  , then a binary 
28aa0 73 65 61 72 63 68 20 6f 66 0a 20 20 20 20 20 20  search of.      
28ab0 2a 2a 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  ** the main tabl
28ac0 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  e */.      pNew-
28ad0 3e 72 52 75 6e 20 3d 20 20 77 68 65 72 65 43 6f  >rRun =  whereCo
28ae0 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e  stAdd(pNew->rRun
28af0 2c 20 72 4c 6f 67 53 69 7a 65 3e 32 37 20 3f 20  , rLogSize>27 ? 
28b00 72 4c 6f 67 53 69 7a 65 2d 31 37 20 3a 20 31 30  rLogSize-17 : 10
28b10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
28b20 53 74 65 70 20 63 6f 73 74 20 66 6f 72 20 65 61  Step cost for ea
28b30 63 68 20 6f 75 74 70 75 74 20 72 6f 77 20 2a 2f  ch output row */
28b40 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
28b50 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 70  = whereCostAdd(p
28b60 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d  New->rRun, pNew-
28b70 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 54  >nOut);.    /* T
28b80 42 44 3a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20  BD: Adjust nOut 
28b90 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  for additional c
28ba0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
28bb0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
28bc0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
28bd0 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20   pNew);.    if( 
28be0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
28bf0 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
28c00 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65  )==0.     && pNe
28c10 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 28  w->u.btree.nEq<(
28c20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
28c30 2b 20 28 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65  + (pProbe->zName
28c40 21 3d 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  !=0)).    ){.   
28c50 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
28c60 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
28c70 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
28c80 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20  , nInMul+nIn);. 
28c90 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e     }.    pNew->n
28ca0 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
28cb0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
28cc0 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 20  ENABLE_STAT4.   
28cd0 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
28ce0 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64  alid = nRecValid
28cf0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  ;.#endif.  }.  p
28d00 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61  New->prereq = sa
28d10 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e  ved_prereq;.  pN
28d20 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
28d30 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70  = saved_nEq;.  p
28d40 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
28d50 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
28d60 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
28d70 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d  ed_nOut;.  pNew-
28d80 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f  >nLTerm = saved_
28d90 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e  nLTerm;.  return
28da0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
28db0 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74 20  turn True if it 
28dc0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
28dd0 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65   pIndex might be
28de0 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d   useful in.** im
28df0 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f  plementing the O
28e00 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
28e10 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a  n pBuilder..**.*
28e20 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69  * Return False i
28e30 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20  f pBuilder does 
28e40 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f  not contain an O
28e50 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
28e60 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
28e70 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64   no way for pInd
28e80 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20  ex to be useful 
28e90 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  in implementing 
28ea0 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59  that.** ORDER BY
28eb0 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
28ec0 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68  ic int indexMigh
28ed0 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79  tHelpWithOrderBy
28ee0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
28ef0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
28f00 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
28f10 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29  .  int iCursor.)
28f20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
28f30 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  B;.  int ii, jj;
28f40 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  ..  if( pIndex->
28f50 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74  bUnordered ) ret
28f60 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f  urn 0;.  if( (pO
28f70 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  B = pBuilder->pW
28f80 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d  Info->pOrderBy)=
28f90 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
28fa0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
28fb0 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  B->nExpr; ii++){
28fc0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
28fd0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
28fe0 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61  ipCollate(pOB->a
28ff0 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  [ii].pExpr);.   
29000 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
29010 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
29020 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45  rn 0;.    if( pE
29030 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75  xpr->iTable==iCu
29040 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 66 6f  rsor ){.      fo
29050 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
29060 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 6a 2b 2b  x->nColumn; jj++
29070 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
29080 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
29090 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
290a0 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  jj] ) return 1;.
290b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
290c0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
290d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
290e0 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73  bitmask where 1s
290f0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
29100 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
29110 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
29120 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20  e table is used 
29130 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e  by an index.  On
29140 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33 20  ly the first 63 
29150 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73  columns are cons
29160 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idered..*/.stati
29170 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e  c Bitmask column
29180 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  sInIndex(Index *
29190 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b  pIdx){.  Bitmask
291a0 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b   m = 0;.  int j;
291b0 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e  .  for(j=pIdx->n
291c0 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20  Column-1; j>=0; 
291d0 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  j--){.    int x 
291e0 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
291f0 5b 6a 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73  [j];.    testcas
29200 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  e( x==BMS-1 );. 
29210 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
29220 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 69 66 28  BMS-2 );.    if(
29230 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20   x<BMS-1 ) m |= 
29240 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 7d 0a  MASKBIT(x);.  }.
29250 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f    return m;.}../
29260 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
29270 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  f a partial inde
29280 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65  x with pPartInde
29290 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73  xWhere can be us
292a0 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ed.** in the cur
292b0 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74  rent query.  Ret
292c0 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63  urn true if it c
292d0 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20  an be and false 
292e0 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
292f0 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c  c int whereUsabl
29300 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e  ePartialIndex(in
29310 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61  t iTab, WhereCla
29320 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
29330 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69  pWhere){.  int i
29340 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
29350 54 65 72 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  Term;.  for(i=0,
29360 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
29370 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
29380 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
29390 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
293a0 6d 70 6c 69 65 73 45 78 70 72 28 70 54 65 72 6d  mpliesExpr(pTerm
293b0 2d 3e 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c  ->pExpr, pWhere,
293c0 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
293d0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
293e0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
293f0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
29400 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67  jects for a sing
29410 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  le table of the 
29420 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74  join where the t
29430 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66  able.** is idenf
29440 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d  ied by pBuilder-
29450 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
29460 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
29470 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20  anteed to be.** 
29480 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20  a b-tree table, 
29490 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
294a0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
294b0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
294c0 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tree(.  WhereLoo
294d0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
294e0 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  er, /* WHERE cla
294f0 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
29500 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  */.  Bitmask mEx
29510 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20  tra             
29520 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71   /* Extra prereq
29530 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e  uesites for usin
29540 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  g this table */.
29550 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
29560 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
29570 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
29580 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
29590 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20  Index *pProbe;  
295a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
295b0 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65  n index we are e
295c0 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49  valuating */.  I
295d0 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20  ndex sPk;       
295e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
295f0 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63  fake index objec
29600 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  t for the primar
29610 79 20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63  y key */.  tRowc
29620 6e 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  nt aiRowEstPk[2]
29630 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69  ;      /* The ai
29640 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66  RowEst[] value f
29650 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
29660 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75   */.  int aiColu
29670 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20  mnPk = -1;      
29680 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e    /* The aColumn
29690 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
296a0 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
296b0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
296c0 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
296d0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
296e0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
296f0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
29700 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
29710 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f  se btree term to
29720 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c   add */.  WhereL
29730 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
29740 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
29750 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
29760 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ct */.  int rc =
29770 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
29780 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
29790 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  de */.  int iSor
297a0 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20  tIdx = 1;       
297b0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
297c0 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20  ber */.  int b; 
297d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297e0 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61       /* A boolea
297f0 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 57 68 65  n value */.  Whe
29800 72 65 43 6f 73 74 20 72 53 69 7a 65 3b 20 20 20  reCost rSize;   
29810 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62           /* numb
29820 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
29830 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  e table */.  Whe
29840 72 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b  reCost rLogSize;
29850 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
29860 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d  rithm of the num
29870 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
29880 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
29890 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
298a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
298b0 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63 6c   parsed WHERE cl
298c0 61 75 73 65 20 2a 2f 0a 20 20 0a 20 20 70 4e 65  ause */.  .  pNe
298d0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
298e0 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  ew;.  pWInfo = p
298f0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
29900 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57  .  pTabList = pW
29910 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
29920 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73    pSrc = pTabLis
29930 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
29940 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  b;.  pWC = pBuil
29950 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65  der->pWC;.  asse
29960 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  rt( !IsVirtual(p
29970 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20  Src->pTab) );.. 
29980 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
29990 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49  x ){.    /* An I
299a0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
299b0 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72   specifies a par
299c0 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f  ticular index to
299d0 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f   use */.    pPro
299e0 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65  be = pSrc->pInde
299f0 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  x;.  }else{.    
29a00 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49  /* There is no I
29a10 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
29a20 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65  .  Create a fake
29a30 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e   Index object in
29a40 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61   local.    ** va
29a50 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65  riable sPk to re
29a60 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69  present the rowi
29a70 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  d primary key in
29a80 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a  dex.  Make this.
29a90 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65      ** fake inde
29aa0 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  x the first in a
29ab0 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20   chain of Index 
29ac0 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c  objects with all
29ad0 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20   of the real.   
29ae0 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66   ** indices to f
29af0 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64  ollow */.    Ind
29b00 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  ex *pFirst;     
29b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e  First of real in
29b30 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62  dices on the tab
29b40 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  le */.    memset
29b50 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sPk, 0, sizeof
29b60 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50  (Index));.    sP
29b70 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20  k.nColumn = 1;. 
29b80 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20     sPk.aiColumn 
29b90 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20  = &aiColumnPk;. 
29ba0 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74 20     sPk.aiRowEst 
29bb0 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20  = aiRowEstPk;.  
29bc0 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20    sPk.onError = 
29bd0 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20  OE_Replace;.    
29be0 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 53 72  sPk.pTable = pSr
29bf0 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 69 52  c->pTab;.    aiR
29c00 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 53 72  owEstPk[0] = pSr
29c10 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  c->pTab->nRowEst
29c20 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
29c30 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46 69  [1] = 1;.    pFi
29c40 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  rst = pSrc->pTab
29c50 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  ->pIndex;.    if
29c60 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78  ( pSrc->notIndex
29c70 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ed==0 ){.      /
29c80 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63  * The real indic
29c90 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  es of the table 
29ca0 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65  are only conside
29cb0 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20  red if the.     
29cc0 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   ** NOT INDEXED 
29cd0 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69  qualifier is omi
29ce0 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52  tted from the FR
29cf0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
29d00 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70     sPk.pNext = p
29d10 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  First;.    }.   
29d20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a   pProbe = &sPk;.
29d30 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 77 68    }.  rSize = wh
29d40 65 72 65 43 6f 73 74 28 70 53 72 63 2d 3e 70 54  ereCost(pSrc->pT
29d50 61 62 2d 3e 6e 52 6f 77 45 73 74 29 3b 0a 20 20  ab->nRowEst);.  
29d60 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
29d70 67 28 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  g(rSize);..  /* 
29d80 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  Automatic indexe
29d90 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69  s */.  if( !pBui
29da0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 0a 20 20 20  lder->pOrSet.   
29db0 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  && (pWInfo->pPar
29dc0 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
29dd0 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
29de0 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d  )!=0.   && pSrc-
29df0 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26  >pIndex==0.   &&
29e00 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75   !pSrc->viaCorou
29e10 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53 72 63  tine.   && !pSrc
29e20 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20 20  ->notIndexed.   
29e30 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72  && !pSrc->isCorr
29e40 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20 20 20 20  elated.  ){.    
29e50 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f  /* Generate auto
29e60 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70  -index WhereLoop
29e70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  s */.    WhereTe
29e80 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57  rm *pTerm;.    W
29e90 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
29ea0 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
29eb0 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28  >nTerm;.    for(
29ec0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63  pTerm=pWC->a; rc
29ed0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
29ee0 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
29ef0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
29f00 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
29f10 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
29f20 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
29f30 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43  .      if( termC
29f40 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
29f50 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a  rm, pSrc, 0) ){.
29f60 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
29f70 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
29f80 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
29f90 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
29fa0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
29fb0 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
29fc0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
29fd0 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
29fe0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f      /* TUNING: O
29ff0 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72  ne-time cost for
2a000 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61   computing the a
2a010 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
2a020 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70  s.        ** app
2a030 72 6f 78 69 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c  roximately 7*N*l
2a040 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
2a050 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2a060 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20  rows in.        
2a070 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
2a080 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a 20  ng indexed. */. 
2a090 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65         pNew->rSe
2a0a0 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b  tup = rLogSize +
2a0b0 20 72 53 69 7a 65 20 2b 20 32 38 3b 20 20 61 73   rSize + 28;  as
2a0c0 73 65 72 74 28 20 32 38 3d 3d 77 68 65 72 65 43  sert( 28==whereC
2a0d0 6f 73 74 28 37 29 20 29 3b 0a 20 20 20 20 20 20  ost(7) );.      
2a0e0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63    /* TUNING: Eac
2a0f0 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79  h index lookup y
2a100 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e  ields 20 rows in
2a110 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
2a120 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  s.        ** is 
2a130 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73  more than the us
2a140 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20  ual guess of 10 
2a150 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68  rows, since we h
2a160 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20  ave no way.     
2a170 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e     ** of knownin
2a180 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
2a190 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
2a1a0 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
2a1b0 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
2a1c0 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
2a1d0 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
2a1e0 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
2a1f0 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
2a200 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
2a210 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
2a220 77 68 65 72 65 43 6f 73 74 28 32 30 29 20 29 3b  whereCost(20) );
2a230 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
2a240 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 41  Run = whereCostA
2a250 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77  dd(rLogSize,pNew
2a260 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  ->nOut);.       
2a270 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2a280 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
2a290 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  X;.        pNew-
2a2a0 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
2a2b0 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
2a2c0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
2a2d0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2a2e0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2a2f0 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
2a300 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f   }.  }..  /* Loo
2a310 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63  p over all indic
2a320 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  es.  */.  for(; 
2a330 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2a340 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d   pProbe; pProbe=
2a350 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69  pProbe->pNext, i
2a360 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20  SortIdx++){.    
2a370 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72  if( pProbe->pPar
2a380 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20  tIdxWhere!=0.   
2a390 20 20 26 26 20 21 77 68 65 72 65 55 73 61 62 6c    && !whereUsabl
2a3a0 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70 4e  ePartialIndex(pN
2a3b0 65 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c 20 70  ew->iTab, pWC, p
2a3c0 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
2a3d0 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 63  here) ){.      c
2a3e0 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72  ontinue;  /* Par
2a3f0 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70  tial index inapp
2a400 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 69  ropriate for thi
2a410 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d  s query */.    }
2a420 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
2a430 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20  ee.nEq = 0;.    
2a440 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
2a450 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72  ;.    pNew->iSor
2a460 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e  tIdx = 0;.    pN
2a470 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
2a480 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2a490 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70   = mExtra;.    p
2a4a0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
2a4b0 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  e;.    pNew->u.b
2a4c0 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50  tree.pIndex = pP
2a4d0 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e  robe;.    b = in
2a4e0 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
2a4f0 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72  OrderBy(pBuilder
2a500 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e  , pProbe, pSrc->
2a510 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a  iCursor);.    /*
2a520 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53   The ONEPASS_DES
2a530 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72  IRED flags never
2a540 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72   occurs together
2a550 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a   with ORDER BY *
2a560 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  /.    assert( (p
2a570 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2a580 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
2a590 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c  S_DESIRED)==0 ||
2a5a0 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   b==0 );.    if(
2a5b0 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30   pProbe->tnum<=0
2a5c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74   ){.      /* Int
2a5d0 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
2a5e0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
2a5f0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2a600 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20  WHERE_IPK;..    
2a610 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20    /* Full table 
2a620 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  scan */.      pN
2a630 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62  ew->iSortIdx = b
2a640 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b   ? iSortIdx : 0;
2a650 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
2a660 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74  : Cost of full t
2a670 61 62 6c 65 20 73 63 61 6e 20 69 73 20 33 2a 28  able scan is 3*(
2a680 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20  N + log2(N))..  
2a690 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20 65      **  +  The e
2a6a0 78 74 72 61 20 33 20 66 61 63 74 6f 72 20 69 73  xtra 3 factor is
2a6b0 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20 74 68   to encourage th
2a6c0 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78 65 64  e use of indexed
2a6d0 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20 2a   lookups.      *
2a6e0 2a 20 20 20 20 20 6f 76 65 72 20 66 75 6c 6c 20  *     over full 
2a6f0 73 63 61 6e 73 2e 20 20 41 20 73 6d 61 6c 6c 65  scans.  A smalle
2a700 72 20 63 6f 6e 73 74 61 6e 74 20 32 20 69 73 20  r constant 2 is 
2a710 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 69 6e  used for coverin
2a720 67 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69  g.      **     i
2a730 6e 64 65 78 20 73 63 61 6e 73 20 73 6f 20 74 68  ndex scans so th
2a740 61 74 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  at a covering in
2a750 64 65 78 20 73 63 61 6e 20 77 69 6c 6c 20 62 65  dex scan will be
2a760 20 66 61 76 6f 72 65 64 20 6f 76 65 72 0a 20 20   favored over.  
2a770 20 20 20 20 2a 2a 20 20 20 20 20 61 20 74 61 62      **     a tab
2a780 6c 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  le scan. */.    
2a790 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77    pNew->rRun = w
2a7a0 68 65 72 65 43 6f 73 74 41 64 64 28 72 53 69 7a  hereCostAdd(rSiz
2a7b0 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b 20 31 36  e,rLogSize) + 16
2a7c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
2a7d0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2a7e0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2a7f0 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2a800 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
2a810 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
2a820 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
2a830 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78   ~columnsInIndex
2a840 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20  (pProbe);.      
2a850 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2a860 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f  (m==0) ? (WHERE_
2a870 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49  IDX_ONLY|WHERE_I
2a880 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f  NDEXED) : WHERE_
2a890 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20 20 20 20  INDEXED;..      
2a8a0 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61  /* Full scan via
2a8b0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
2a8c0 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20  if( b.       || 
2a8d0 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ( m==0.         
2a8e0 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  && pProbe->bUnor
2a8f0 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
2a900 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
2a910 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2a920 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
2a930 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
2a940 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2a950 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20  nfig.bUseCis.   
2a960 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
2a970 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49  ationEnabled(pWI
2a980 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  nfo->pParse->db,
2a990 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78   SQLITE_CoverIdx
2a9a0 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20  Scan).          
2a9b0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2a9c0 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
2a9d0 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78  x = b ? iSortIdx
2a9e0 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   : 0;.        if
2a9f0 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( m==0 ){.      
2aa00 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
2aa10 6f 73 74 20 6f 66 20 61 20 63 6f 76 65 72 69 6e  ost of a coverin
2aa20 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20  g index scan is 
2aa30 32 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e  2*(N + log2(N)).
2aa40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 2b  .          **  +
2aa50 20 20 54 68 65 20 65 78 74 72 61 20 32 20 66 61    The extra 2 fa
2aa60 63 74 6f 72 20 69 73 20 74 6f 20 65 6e 63 6f 75  ctor is to encou
2aa70 72 61 67 65 20 74 68 65 20 75 73 65 20 6f 66 20  rage the use of 
2aa80 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75 70 73 0a  indexed lookups.
2aa90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20            **    
2aaa0 20 6f 76 65 72 20 69 6e 64 65 78 20 73 63 61 6e   over index scan
2aab0 73 2e 20 20 41 20 74 61 62 6c 65 20 73 63 61 6e  s.  A table scan
2aac0 20 75 73 65 73 20 61 20 66 61 63 74 6f 72 20 6f   uses a factor o
2aad0 66 20 33 20 73 6f 20 74 68 61 74 0a 20 20 20 20  f 3 so that.    
2aae0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64        **     ind
2aaf0 65 78 20 73 63 61 6e 73 20 61 72 65 20 66 61 76  ex scans are fav
2ab00 6f 72 65 64 20 6f 76 65 72 20 74 61 62 6c 65 20  ored over table 
2ab10 73 63 61 6e 73 2e 0a 20 20 20 20 20 20 20 20 20  scans..         
2ab20 20 2a 2a 20 20 2b 20 20 49 66 20 74 68 69 73 20   **  +  If this 
2ab30 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 6d  covering index m
2ab40 69 67 68 74 20 61 6c 73 6f 20 68 65 6c 70 20 73  ight also help s
2ab50 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
2ab60 20 42 59 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   BY.          **
2ab70 20 20 20 20 20 63 6c 61 75 73 65 2c 20 74 68 65       clause, the
2ab80 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20 66 75  n the cost is fu
2ab90 64 67 65 64 20 64 6f 77 6e 20 73 6c 69 67 68 74  dged down slight
2aba0 6c 79 20 73 6f 20 74 68 61 74 20 74 68 69 73 0a  ly so that this.
2abb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20            **    
2abc0 20 69 6e 64 65 78 20 69 73 20 66 61 76 6f 72 65   index is favore
2abd0 64 20 61 62 6f 76 65 20 6f 74 68 65 72 20 69 6e  d above other in
2abe0 64 69 63 65 73 20 74 68 61 74 20 68 61 76 65 20  dices that have 
2abf0 6e 6f 20 68 6f 70 65 20 6f 66 0a 20 20 20 20 20  no hope of.     
2ac00 20 20 20 20 20 2a 2a 20 20 20 20 20 68 65 6c 70       **     help
2ac10 69 6e 67 20 77 69 74 68 20 74 68 65 20 4f 52 44  ing with the ORD
2ac20 45 52 20 42 59 2e 20 2a 2f 0a 20 20 20 20 20 20  ER BY. */.      
2ac30 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2ac40 20 31 30 20 2b 20 77 68 65 72 65 43 6f 73 74 41   10 + whereCostA
2ac50 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a  dd(rSize,rLogSiz
2ac60 65 29 20 2d 20 62 3b 0a 20 20 20 20 20 20 20 20  e) - b;.        
2ac70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2ac80 20 61 73 73 65 72 74 28 20 62 21 3d 30 20 29 3b   assert( b!=0 );
2ac90 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   .          /* T
2aca0 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 73  UNING: Cost of s
2acb0 63 61 6e 6e 69 6e 67 20 61 20 6e 6f 6e 2d 63 6f  canning a non-co
2acc0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 69 73 20  vering index is 
2acd0 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e 29 0a 20 20  (N+1)*log2(N).  
2ace0 20 20 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68          ** which
2acf0 20 77 65 20 77 69 6c 6c 20 73 69 6d 70 6c 69 66   we will simplif
2ad00 79 20 74 6f 20 6a 75 73 74 20 4e 2a 6c 6f 67 32  y to just N*log2
2ad10 28 4e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (N) */.         
2ad20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53   pNew->rRun = rS
2ad30 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a 65 3b 0a  ize + rLogSize;.
2ad40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ad50 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2ad60 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
2ad70 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
2ad80 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2ad90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2ada0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2adb0 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
2adc0 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
2add0 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65  Probe, 0);.#ifde
2ade0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2adf0 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65  STAT4.    sqlite
2ae00 33 53 74 61 74 34 50 72 6f 62 65 46 72 65 65 28  3Stat4ProbeFree(
2ae10 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b  pBuilder->pRec);
2ae20 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
2ae30 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  RecValid = 0;.  
2ae40 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63    pBuilder->pRec
2ae50 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
2ae60 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
2ae70 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  s an INDEXED BY 
2ae80 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c  clause, then onl
2ae90 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78  y that one index
2aea0 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69   is.    ** consi
2aeb0 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  dered. */.    if
2aec0 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29  ( pSrc->pIndex )
2aed0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2aee0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
2aef0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2af00 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
2af10 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
2af20 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
2af30 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
2af40 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20  join identified 
2af50 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e  by.** pBuilder->
2af60 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
2af70 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
2af80 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76 69  nteed to be a vi
2af90 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
2afa0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
2afb0 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a  LoopAddVirtual(.
2afc0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
2afd0 65 72 20 2a 70 42 75 69 6c 64 65 72 20 20 20 2f  er *pBuilder   /
2afe0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
2aff0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 29 7b  nformation */.){
2b000 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2b010 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
2b020 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69  /* WHERE analysi
2b030 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  s context */.  P
2b040 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
2b050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2b060 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
2b070 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
2b080 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20  use *pWC;       
2b090 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2b0a0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
2b0b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2b0c0 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68  m *pSrc;   /* Th
2b0d0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
2b0e0 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
2b0f0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
2b100 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2b110 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
2b120 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20  fo *pIdxInfo;.  
2b130 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
2b140 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
2b150 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72  *pIdxCons;.  str
2b160 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
2b170 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
2b180 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
2b190 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
2b1a0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
2b1b0 74 20 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b  t iTerm, mxTerm;
2b1c0 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69  .  int nConstrai
2b1d0 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e  nt;.  int seenIn
2b1e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2b1f0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2b200 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
2b210 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65  seen */.  int se
2b220 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20  enVar = 0;      
2b230 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2b240 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  f a non-constant
2b250 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73   constraint is s
2b260 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68  een */.  int iPh
2b270 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
2b280 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73        /* 0: cons
2b290 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e  t w/o IN, 1: con
2b2a0 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32  st, 2: no IN,  2
2b2b0 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  : IN */.  WhereL
2b2c0 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  oop *pNew;.  int
2b2d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b2e0 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75  ..  pWInfo = pBu
2b2f0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
2b300 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
2b310 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
2b320 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
2b330 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  WC = pBuilder->p
2b340 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  WC;.  pNew = pBu
2b350 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
2b360 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70  Src = &pWInfo->p
2b370 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d  TabList->a[pNew-
2b380 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d  >iTab];.  pTab =
2b390 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61   pSrc->pTab;.  a
2b3a0 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c  ssert( IsVirtual
2b3b0 28 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78  (pTab) );.  pIdx
2b3c0 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49  Info = allocateI
2b3d0 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c  ndexInfo(pParse,
2b3e0 20 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69   pWC, pSrc, pBui
2b3f0 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b  lder->pOrderBy);
2b400 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
2b410 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2b420 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77  TE_NOMEM;.  pNew
2b430 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20  ->prereq = 0;.  
2b440 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
2b450 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  ;.  pNew->wsFlag
2b460 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41  s = WHERE_VIRTUA
2b470 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e  LTABLE;.  pNew->
2b480 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e  nLTerm = 0;.  pN
2b490 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
2b4a0 72 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67  ree = 0;.  pUsag
2b4b0 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  e = pIdxInfo->aC
2b4c0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a  onstraintUsage;.
2b4d0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
2b4e0 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
2b4f0 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65  raint;.  if( whe
2b500 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
2b510 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69   pNew, nConstrai
2b520 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nt) ){.    sqlit
2b530 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64  e3DbFree(db, pId
2b540 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74 75  xInfo);.    retu
2b550 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2b560 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61  .  }..  for(iPha
2b570 73 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b  se=0; iPhase<=3;
2b580 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20   iPhase++){.    
2b590 69 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28  if( !seenIn && (
2b5a0 69 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a  iPhase&1)!=0 ){.
2b5b0 20 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a        iPhase++;.
2b5c0 20 20 20 20 20 20 69 66 28 20 69 50 68 61 73 65        if( iPhase
2b5d0 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >3 ) break;.    
2b5e0 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 56  }.    if( !seenV
2b5f0 61 72 20 26 26 20 69 50 68 61 73 65 3e 31 20 29  ar && iPhase>1 )
2b600 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78   break;.    pIdx
2b610 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
2b620 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
2b630 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
2b640 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
2b650 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
2b660 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
2b670 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
2b680 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20  dxCons++){.     
2b690 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69   j = pIdxCons->i
2b6a0 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
2b6b0 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
2b6c0 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74  a[j];.      swit
2b6d0 63 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20  ch( iPhase ){.  
2b6e0 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 20        case 0:   
2b6f0 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69   /* Constants wi
2b700 74 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f  thout IN operato
2b710 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  r */.          p
2b720 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
2b730 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
2b740 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
2b750 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30  ator & WO_IN)!=0
2b760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b770 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20  seenIn = 1;.    
2b780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b790 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
2b7a0 72 65 71 52 69 67 68 74 21 3d 30 20 29 7b 0a 20  reqRight!=0 ){. 
2b7b0 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 56             seenV
2b7c0 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ar = 1;.        
2b7d0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
2b7e0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2b7f0 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  WO_IN)==0 ){.   
2b800 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
2b810 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20  s->usable = 1;. 
2b820 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b830 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b840 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f      case 1:    /
2b850 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  * Constants with
2b860 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f   IN operators */
2b870 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2b880 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  t( seenIn );.   
2b890 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2b8a0 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d  >usable = (pTerm
2b8b0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30  ->prereqRight==0
2b8c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
2b8d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
2b8e0 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62   2:    /* Variab
2b8f0 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a  les without IN *
2b900 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
2b910 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20  rt( seenVar );. 
2b920 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
2b930 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65  s->usable = (pTe
2b940 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2b950 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20  WO_IN)==0;.     
2b960 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b970 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f      default:   /
2b980 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68  * Variables with
2b990 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   IN */.         
2b9a0 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72   assert( seenVar
2b9b0 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20   && seenIn );.  
2b9c0 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2b9d0 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ->usable = 1;.  
2b9e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2b9f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2ba00 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20   memset(pUsage, 
2ba10 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65  0, sizeof(pUsage
2ba20 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e  [0])*pIdxInfo->n
2ba30 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
2ba40 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
2ba50 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
2ba60 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
2ba70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  IdxInfo->idxStr)
2ba80 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
2ba90 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  idxStr = 0;.    
2baa0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
2bab0 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
2bac0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
2bad0 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49  xStr = 0;.    pI
2bae0 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
2baf0 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20  onsumed = 0;.   
2bb00 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
2bb10 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54  atedCost = SQLIT
2bb20 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75  E_BIG_DBL / (dou
2bb30 62 6c 65 29 32 3b 0a 20 20 20 20 72 63 20 3d 20  ble)2;.    rc = 
2bb40 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
2bb50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78  arse, pTab, pIdx
2bb60 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  Info);.    if( r
2bb70 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f  c ) goto whereLo
2bb80 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
2bb90 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
2bba0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
2bbb0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
2bbc0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
2bbd0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70  onstraint;.    p
2bbe0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b  New->prereq = 0;
2bbf0 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31  .    mxTerm = -1
2bc00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
2bc10 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e  ew->nLSlot>=nCon
2bc20 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66  straint );.    f
2bc30 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74  or(i=0; i<nConst
2bc40 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77  raint; i++) pNew
2bc50 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b  ->aLTerm[i] = 0;
2bc60 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  .    pNew->u.vta
2bc70 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a  b.omitMask = 0;.
2bc80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2bc90 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
2bca0 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
2bcb0 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d      if( (iTerm =
2bcc0 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49   pUsage[i].argvI
2bcd0 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a  ndex - 1)>=0 ){.
2bce0 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78          j = pIdx
2bcf0 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
2bd00 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  t;.        if( i
2bd10 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  Term>=nConstrain
2bd20 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c  t.         || j<
2bd30 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e  0.         || j>
2bd40 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20  =pWC->nTerm.    
2bd50 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c       || pNew->aL
2bd60 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20  Term[iTerm]!=0. 
2bd70 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2bd80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2bd90 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
2bda0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2bdb0 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65  (pParse, "%s.xBe
2bdc0 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e  stIndex() malfun
2bdd0 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e  ction", pTab->zN
2bde0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2bdf0 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64  goto whereLoopAd
2be00 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20  dVtab_exit;.    
2be10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
2be20 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e  stcase( iTerm==n
2be30 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a  Constraint-1 );.
2be40 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2be50 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( j==0 );.      
2be60 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70    testcase( j==p
2be70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20  WC->nTerm-1 );. 
2be80 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
2be90 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20  pWC->a[j];.     
2bea0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
2beb0 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  |= pTerm->prereq
2bec0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61  Right;.        a
2bed0 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65  ssert( iTerm<pNe
2bee0 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20  w->nLSlot );.   
2bef0 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
2bf00 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d  m[iTerm] = pTerm
2bf10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54  ;.        if( iT
2bf20 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54  erm>mxTerm ) mxT
2bf30 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20  erm = iTerm;.   
2bf40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2bf50 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20  Term==15 );.    
2bf60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
2bf70 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20  erm==16 );.     
2bf80 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20     if( iTerm<16 
2bf90 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  && pUsage[i].omi
2bfa0 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  t ) pNew->u.vtab
2bfb0 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c  .omitMask |= 1<<
2bfc0 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  iTerm;.        i
2bfd0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
2bfe0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30  ator & WO_IN)!=0
2bff0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2c000 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  ( pUsage[i].omit
2c010 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2c020 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74     /* Do not att
2c030 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49  empt to use an I
2c040 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20  N constraint if 
2c050 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
2c060 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
2c070 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20 65   says that the e
2c080 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e  quivalent EQ con
2c090 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
2c0a0 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64  e safely omitted
2c0b0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
2c0c0 20 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70   If we do attemp
2c0d0 74 20 74 6f 20 75 73 65 20 73 75 63 68 20 61 20  t to use such a 
2c0e0 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65  constraint, some
2c0f0 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20   rows might be. 
2c100 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65             ** re
2c110 70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75  peated in the ou
2c120 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tput. */.       
2c130 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2c140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c150 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74    /* A virtual t
2c160 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e  able that is con
2c170 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49  strained by an I
2c180 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74  N clause may not
2c190 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
2c1a0 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20  nsume the ORDER 
2c1b0 42 59 20 63 6c 61 75 73 65 20 62 65 63 61 75 73  BY clause becaus
2c1c0 65 20 28 31 29 20 74 68 65 20 6f 72 64 65 72 20  e (1) the order 
2c1d0 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20  of IN terms.    
2c1e0 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
2c1f0 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61  necessarily rela
2c200 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72  ted to the order
2c210 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73   of output terms
2c220 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
2c230 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f  * (2) Multiple o
2c240 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69  utputs from a si
2c250 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69  ngle IN value wi
2c260 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20  ll not merge.   
2c270 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68         ** togeth
2c280 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  er.  */.        
2c290 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
2c2a0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
2c2b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c2c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2c2d0 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20   i>=nConstraint 
2c2e0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  ){.      pNew->n
2c2f0 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31  LTerm = mxTerm+1
2c300 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2c310 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e  pNew->nLTerm<=pN
2c320 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
2c330 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2c340 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e  .idxNum = pIdxIn
2c350 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20  fo->idxNum;.    
2c360 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
2c370 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e  eedFree = pIdxIn
2c380 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
2c390 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78  xStr;.      pIdx
2c3a0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
2c3b0 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
2c3c0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
2c3d0 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f  dxStr = pIdxInfo
2c3e0 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20  ->idxStr;.      
2c3f0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  pNew->u.vtab.isO
2c400 72 64 65 72 65 64 20 3d 20 28 75 38 29 28 28 70  rdered = (u8)((p
2c410 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
2c420 79 21 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  y!=0).          
2c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c440 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
2c450 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
2c460 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20 20 20  onsumed);.      
2c470 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
2c480 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  ;.      pNew->rR
2c490 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 46 72  un = whereCostFr
2c4a0 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66  omDouble(pIdxInf
2c4b0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
2c4c0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  );.      /* TUNI
2c4d0 4e 47 3a 20 45 76 65 72 79 20 76 69 72 74 75 61  NG: Every virtua
2c4e0 6c 20 74 61 62 6c 65 20 71 75 65 72 79 20 72 65  l table query re
2c4f0 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
2c500 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
2c510 74 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28  t = 46;  assert(
2c520 20 34 36 3d 3d 77 68 65 72 65 43 6f 73 74 28 32   46==whereCost(2
2c530 35 29 20 29 3b 0a 20 20 20 20 20 20 77 68 65 72  5) );.      wher
2c540 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
2c550 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
2c560 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76     if( pNew->u.v
2c570 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a  tab.needFree ){.
2c580 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c590 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61  free(pNew->u.vta
2c5a0 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  b.idxStr);.     
2c5b0 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2c5c0 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
2c5d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
2c5e0 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   ..whereLoopAddV
2c5f0 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20  tab_exit:.  if( 
2c600 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
2c610 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
2c620 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
2c630 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73  fo->idxStr);.  s
2c640 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2c650 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65   pIdxInfo);.  re
2c660 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
2c670 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2c680 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
2c690 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72  ../*.** Add Wher
2c6a0 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f  eLoop entries to
2c6b0 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73   handle OR terms
2c6c0 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f  .  This works fo
2c6d0 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65  r either.** btre
2c6e0 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61  es or virtual ta
2c6f0 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
2c700 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
2c710 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  Or(WhereLoopBuil
2c720 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 42  der *pBuilder, B
2c730 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a  itmask mExtra){.
2c740 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2c750 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
2c760 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43  pWInfo;.  WhereC
2c770 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68  lause *pWC;.  Wh
2c780 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
2c790 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2c7a0 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e  m, *pWCEnd;.  in
2c7b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2c7c0 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  ;.  int iCur;.  
2c7d0 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70  WhereClause temp
2c7e0 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  WC;.  WhereLoopB
2c7f0 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64  uilder sSubBuild
2c800 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 73  ;.  WhereOrSet s
2c810 53 75 6d 2c 20 73 43 75 72 2c 20 73 50 72 65 76  Sum, sCur, sPrev
2c820 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
2c830 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2c840 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c    .  pWC = pBuil
2c850 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28 20  der->pWC;.  if( 
2c860 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2c870 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f  gs & WHERE_AND_O
2c880 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53 51 4c  NLY ) return SQL
2c890 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e 64  ITE_OK;.  pWCEnd
2c8a0 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
2c8b0 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d  >nTerm;.  pNew =
2c8c0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
2c8d0 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ..  for(pTerm=pW
2c8e0 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
2c8f0 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  nd && rc==SQLITE
2c900 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  _OK; pTerm++){. 
2c910 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
2c920 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
2c930 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
2c940 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
2c950 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77  indexable & pNew
2c960 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a  ->maskSelf)!=0 .
2c970 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65      ){.      Whe
2c980 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74  reClause * const
2c990 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d   pOrWC = &pTerm-
2c9a0 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
2c9b0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
2c9c0 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64  * const pOrWCEnd
2c9d0 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72   = &pOrWC->a[pOr
2c9e0 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20  WC->nTerm];.    
2c9f0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
2ca00 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Term;.      int 
2ca10 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  once = 1;.      
2ca20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20  int i, j;.    . 
2ca30 20 20 20 20 20 70 49 74 65 6d 20 3d 20 70 57 49       pItem = pWI
2ca40 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
2ca50 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
2ca60 20 20 20 20 20 69 43 75 72 20 3d 20 70 49 74 65       iCur = pIte
2ca70 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
2ca80 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70    sSubBuild = *p
2ca90 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73  Builder;.      s
2caa0 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42  SubBuild.pOrderB
2cab0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75  y = 0;.      sSu
2cac0 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20  bBuild.pOrSet = 
2cad0 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 66 6f  &sCur;..      fo
2cae0 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
2caf0 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
2cb00 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
2cb10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
2cb20 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
2cb30 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
2cb40 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  {.          sSub
2cb50 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72  Build.pWC = &pOr
2cb60 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
2cb70 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  ->wc;.        }e
2cb80 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
2cb90 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
2cba0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  r ){.          t
2cbb0 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70  empWC.pWInfo = p
2cbc0 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20  WC->pWInfo;.    
2cbd0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
2cbe0 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
2cbf0 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
2cc00 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
2cc10 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
2cc20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
2cc30 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
2cc40 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  m;.          sSu
2cc50 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65  bBuild.pWC = &te
2cc60 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65  mpWC;.        }e
2cc70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2cc80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2cc90 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e   }.        sCur.
2cca0 6e 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  n = 0;.#ifndef S
2ccb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2ccc0 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
2ccd0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49  if( IsVirtual(pI
2cce0 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
2ccf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
2cd00 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
2cd10 28 26 73 53 75 62 42 75 69 6c 64 29 3b 0a 20 20  (&sSubBuild);.  
2cd20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2cd30 20 69 3c 73 43 75 72 2e 6e 3b 20 69 2b 2b 29 20   i<sCur.n; i++) 
2cd40 73 43 75 72 2e 61 5b 69 5d 2e 70 72 65 72 65 71  sCur.a[i].prereq
2cd50 20 7c 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20   |= mExtra;.    
2cd60 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
2cd70 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
2cd80 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2cd90 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75  oopAddBtree(&sSu
2cda0 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b  bBuild, mExtra);
2cdb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2cdc0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
2cdd0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72  QLITE_OK || sCur
2cde0 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  .n==0 );.       
2cdf0 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29   if( sCur.n==0 )
2ce00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  {.          sSum
2ce10 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
2ce20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2ce30 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20   }else if( once 
2ce40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65  ){.          whe
2ce50 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20  reOrMove(&sSum, 
2ce60 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  &sCur);.        
2ce70 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20    once = 0;.    
2ce80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ce90 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65       whereOrMove
2cea0 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b  (&sPrev, &sSum);
2ceb0 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e  .          sSum.
2cec0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
2ced0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65   for(i=0; i<sPre
2cee0 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  v.n; i++){.     
2cef0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2cf00 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a  j<sCur.n; j++){.
2cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
2cf20 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75  ereOrInsert(&sSu
2cf30 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72  m, sPrev.a[i].pr
2cf40 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d  ereq | sCur.a[j]
2cf50 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20  .prereq,.       
2cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf70 20 20 20 20 20 77 68 65 72 65 43 6f 73 74 41 64       whereCostAd
2cf80 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75  d(sPrev.a[i].rRu
2cf90 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75  n, sCur.a[j].rRu
2cfa0 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n),.            
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfc0 77 68 65 72 65 43 6f 73 74 41 64 64 28 73 50 72  whereCostAdd(sPr
2cfd0 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43  ev.a[i].nOut, sC
2cfe0 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a  ur.a[j].nOut));.
2cff0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2d000 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d010 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2d020 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2d030 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   1;.      pNew->
2d040 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
2d050 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  m;.      pNew->w
2d060 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d  sFlags = WHERE_M
2d070 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70  ULTI_OR;.      p
2d080 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
2d090 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  .      pNew->iSo
2d0a0 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20  rtIdx = 0;.     
2d0b0 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75   memset(&pNew->u
2d0c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77  , 0, sizeof(pNew
2d0d0 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72  ->u));.      for
2d0e0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
2d0f0 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b  _OK && i<sSum.n;
2d100 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f   i++){.        /
2d110 2a 20 54 55 4e 49 4e 47 3a 20 4d 75 6c 74 69 70  * TUNING: Multip
2d120 6c 65 20 62 79 20 33 2e 35 20 66 6f 72 20 74 68  le by 3.5 for th
2d130 65 20 73 65 63 6f 6e 64 61 72 79 20 74 61 62 6c  e secondary tabl
2d140 65 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20  e lookup */.    
2d150 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2d160 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20   sSum.a[i].rRun 
2d170 2b 20 31 38 3b 0a 20 20 20 20 20 20 20 20 70 4e  + 18;.        pN
2d180 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e  ew->nOut = sSum.
2d190 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20  a[i].nOut;.     
2d1a0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
2d1b0 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72  = sSum.a[i].prer
2d1c0 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  eq;.        rc =
2d1d0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
2d1e0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
2d1f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2d200 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2d210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  .}../*.** Add al
2d220 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
2d230 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  cts for all tabl
2d240 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es .*/.static in
2d250 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  t whereLoopAddAl
2d260 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  l(WhereLoopBuild
2d270 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20  er *pBuilder){. 
2d280 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2d290 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
2d2a0 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b  WInfo;.  Bitmask
2d2b0 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42   mExtra = 0;.  B
2d2c0 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20  itmask mPrior = 
2d2d0 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
2d2e0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2d2f0 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
2d300 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
2d310 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2d320 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
2d330 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
2d340 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
2d350 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
2d360 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20  ->nLevel;.  int 
2d370 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2d380 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79    u8 priorJoinTy
2d390 70 65 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c  pe = 0;.  WhereL
2d3a0 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a  oop *pNew;..  /*
2d3b0 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   Loop over the t
2d3c0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
2d3d0 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  n, from left to 
2d3e0 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20  right */.  pNew 
2d3f0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2d400 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
2d410 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69  t(pNew);.  for(i
2d420 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61  Tab=0, pItem=pTa
2d430 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e  bList->a; iTab<n
2d440 54 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c  TabList; iTab++,
2d450 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70   pItem++){.    p
2d460 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62  New->iTab = iTab
2d470 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b  ;.    pNew->mask
2d480 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26  Self = getMask(&
2d490 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
2d4a0 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
2d4b0 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74  );.    if( ((pIt
2d4c0 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72 69  em->jointype|pri
2d4d0 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26 20 28 4a  orJoinType) & (J
2d4e0 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
2d4f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 45  )!=0 ){.      mE
2d500 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20  xtra = mPrior;. 
2d510 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f     }.    priorJo
2d520 69 6e 54 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e  inType = pItem->
2d530 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69 66  jointype;.    if
2d540 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65  ( IsVirtual(pIte
2d550 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
2d560 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2d570 41 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c  AddVirtual(pBuil
2d580 64 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  der);.    }else{
2d590 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
2d5a0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42  eLoopAddBtree(pB
2d5b0 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
2d5c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2d5d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d5e0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2d5f0 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64  LoopAddOr(pBuild
2d600 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  er, mExtra);.   
2d610 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d   }.    mPrior |=
2d620 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b   pNew->maskSelf;
2d630 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64  .    if( rc || d
2d640 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2d650 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77  ) break;.  }.  w
2d660 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62  hereLoopClear(db
2d670 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
2d680 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
2d690 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61  xamine a WherePa
2d6a0 74 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64  th (with the add
2d6b0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74  ition of the ext
2d6c0 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20  ra WhereLoop of 
2d6d0 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d  the 5th.** param
2d6e0 65 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66  eters) to see if
2d6f0 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73   it outputs rows
2d700 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
2d710 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f  d ORDER BY.** (o
2d720 72 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68  r GROUP BY) with
2d730 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20  out requiring a 
2d740 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70  separate sort op
2d750 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  eration.  Return
2d760 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30 3a 20 20  :.** .**    0:  
2d770 4f 52 44 45 52 20 42 59 20 69 73 20 6e 6f 74 20  ORDER BY is not 
2d780 73 61 74 69 73 66 69 65 64 2e 20 20 53 6f 72 74  satisfied.  Sort
2d790 69 6e 67 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  ing required.** 
2d7a0 20 20 20 31 3a 20 20 4f 52 44 45 52 20 42 59 20     1:  ORDER BY 
2d7b0 69 73 20 73 61 74 69 73 66 69 65 64 2e 20 20 20  is satisfied.   
2d7c0 20 20 20 4f 6d 69 74 20 73 6f 72 74 69 6e 67 0a     Omit sorting.
2d7d0 2a 2a 20 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77  **   -1:  Unknow
2d7e0 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 0a 2a  n at this time.*
2d7f0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
2d800 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48  rocessing for WH
2d810 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20  ERE_GROUPBY and 
2d820 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
2d830 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74   is not as.** st
2d840 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55  rict.  With GROU
2d850 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  P BY and DISTINC
2d860 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69  T the only requi
2d870 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a  rement is that.*
2d880 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77  * equivalent row
2d890 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61  s appear immedia
2d8a0 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f  tely adjacent to
2d8b0 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47   one another.  G
2d8c0 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44  ROUP BY.** and D
2d8d0 49 53 54 49 4e 54 20 64 6f 20 6e 6f 74 20 72 65  ISTINT do not re
2d8e0 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70  quire rows to ap
2d8f0 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74  pear in any part
2d900 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20  icular order as 
2d910 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76  long.** as equiv
2d920 65 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67  elent rows are g
2d930 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e  rouped together.
2d940 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50    Thus for GROUP
2d950 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
2d960 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79  .** the pOrderBy
2d970 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61   terms can be ma
2d980 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64  tched in any ord
2d990 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20  er.  With ORDER 
2d9a0 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64  BY, the .** pOrd
2d9b0 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20  erBy terms must 
2d9c0 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74  be matched in st
2d9d0 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67  rict left-to-rig
2d9e0 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ht order..*/.sta
2d9f0 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74  tic int wherePat
2da00 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
2da10 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  y(.  WhereInfo *
2da20 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68  pWInfo,    /* Th
2da30 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
2da40 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
2da50 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44  rderBy,   /* ORD
2da60 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
2da70 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c  Y or DISTINCT cl
2da80 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  ause to check */
2da90 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50  .  WherePath *pP
2daa0 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ath,     /* The 
2dab0 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65  WherePath to che
2dac0 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ck */.  u16 wctr
2dad0 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a  lFlags,       /*
2dae0 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 57   Might contain W
2daf0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20  HERE_GROUPBY or 
2db00 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
2db10 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c   */.  u16 nLoop,
2db20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2db30 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2db40 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   in pPath->aLoop
2db50 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
2db60 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a  p *pLast,     /*
2db70 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c   Add this WhereL
2db80 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  oop to the end o
2db90 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  f pPath->aLoop[]
2dba0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70   */.  Bitmask *p
2dbb0 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f  RevMask     /* O
2dbc0 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72  UT: Mask of Wher
2dbd0 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e  eLoops to run in
2dbe0 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
2dbf0 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74  /.){.  u8 revSet
2dc00 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2dc10 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b  True if rev is k
2dc20 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76  nown */.  u8 rev
2dc30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2dc40 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72  /* Composite sor
2dc50 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
2dc60 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20  revIdx;         
2dc70 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74     /* Index sort
2dc80 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69   order */.  u8 i
2dc90 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20  sOrderDistinct; 
2dca0 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57    /* All prior W
2dcb0 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72  hereLoops are or
2dcc0 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a  der-distinct */.
2dcd0 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c    u8 distinctCol
2dce0 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20  umns;   /* True 
2dcf0 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20  if the loop has 
2dd00 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20  UNIQUE NOT NULL 
2dd10 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20  columns */.  u8 
2dd20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20  isMatch;        
2dd30 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61     /* iColumn ma
2dd40 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20  tches a term of 
2dd50 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2dd60 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f  use */.  u16 nCo
2dd70 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
2dd80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2dd90 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f  mns in pIndex */
2dda0 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b  .  u16 nOrderBy;
2ddb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ddc0 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  er terms in the 
2ddd0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2dde0 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
2ddf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2de00 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  dex of WhereLoop
2de10 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20   in pPath being 
2de20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69  processed */.  i
2de30 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
2de40 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2de50 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
2de60 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
2de70 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
2de80 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68  r for current Wh
2de90 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ereLoop */.  int
2dea0 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
2deb0 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e     /* A column n
2dec0 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62  umber within tab
2ded0 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65  le iCur */.  Whe
2dee0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
2def0 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68  0; /* Current Wh
2df00 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72  ereLoop being pr
2df10 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68  ocessed. */.  Wh
2df20 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
2df30 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
2df40 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
2df50 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
2df60 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20  pr *pOBExpr;    
2df70 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73      /* An expres
2df80 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52  sion from the OR
2df90 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2dfa0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
2dfb0 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c  l;       /* COLL
2dfc0 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  ATE function fro
2dfd0 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  m an ORDER BY cl
2dfe0 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49  ause term */.  I
2dff0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
2e000 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2e010 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
2e020 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  h pLoop */.  sql
2e030 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
2e040 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20  o->pParse->db;  
2e050 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
2e060 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  ection */.  Bitm
2e070 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20  ask obSat = 0;  
2e080 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
2e090 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69  ER BY terms sati
2e0a0 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  sfied so far */.
2e0b0 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65    Bitmask obDone
2e0c0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ;       /* Mask 
2e0d0 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20  of all ORDER BY 
2e0e0 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
2e0f0 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  sk orderDistinct
2e100 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f  Mask;  /* Mask o
2e110 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72  f all well-order
2e120 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69  ed loops */.  Bi
2e130 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20  tmask ready;    
2e140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
2e150 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  k of inner loops
2e160 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57   */..  /*.  ** W
2e170 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
2e180 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22  oop is "one-row"
2e190 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73   if it generates
2e1a0 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
2e1b0 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75  e.  ** row of ou
2e1c0 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f  tput.  A WhereLo
2e1d0 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66  op is one-row if
2e1e0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
2e1f0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
2e200 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e    **  (a) All in
2e210 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63  dex columns matc
2e220 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c  h with WHERE_COL
2e230 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62  UMN_EQ..  **  (b
2e240 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75  ) The index is u
2e250 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57  nique.  ** Any W
2e260 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e  hereLoop with an
2e270 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
2e280 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74   constraint on t
2e290 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d  he rowid is one-
2e2a0 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20  row..  ** Every 
2e2b0 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
2e2c0 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20  p will have the 
2e2d0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74  WHERE_ONEROW bit
2e2e0 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e   set in wsFlags.
2e2f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  **.  ** We sa
2e300 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
2e310 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e  is "order-distin
2e320 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f  ct" if the set o
2e330 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20  f columns from. 
2e340 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f   ** that WhereLo
2e350 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  op that are in t
2e360 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2e370 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  se are different
2e380 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20   for every.  ** 
2e390 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65  row of the Where
2e3a0 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65  Loop.  Every one
2e3b0 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69  -row WhereLoop i
2e3c0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  s automatically.
2e3d0 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69    ** order-disti
2e3e0 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f  nct.   A WhereLo
2e3f0 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63  op that has no c
2e400 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52  olumns in the OR
2e410 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
2e420 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d  ** is not order-
2e430 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20  distinct. To be 
2e440 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69  order-distinct i
2e450 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20  s not quite the 
2e460 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20  same as being.  
2e470 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20  ** UNIQUE since 
2e480 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20  a UNIQUE column 
2e490 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76  or index can hav
2e4a0 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
2e4b0 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e  that .  ** are N
2e4c0 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c  ULL and NULL val
2e4d0 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  ues are equivale
2e4e0 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  nt for the purpo
2e4f0 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74  se of order-dist
2e500 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65  inct..  ** To be
2e510 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c   order-distinct,
2e520 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73   the columns mus
2e530 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20  t be UNIQUE and 
2e540 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20  NOT NULL..  **. 
2e550 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
2e560 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77  r a table is alw
2e570 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e  ays UNIQUE and N
2e580 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65  OT NULL so whene
2e590 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77  ver the.  ** row
2e5a0 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  id appears in th
2e5b0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2e5c0 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
2e5d0 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ding WhereLoop i
2e5e0 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63  s.  ** automatic
2e5f0 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69  ally order-disti
2e600 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73  nct..  */..  ass
2e610 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
2e620 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62   );..  /* Sortab
2e630 69 6c 69 74 79 20 6f 66 20 76 69 72 74 75 61 6c  ility of virtual
2e640 20 74 61 62 6c 65 73 20 69 73 20 64 65 74 65 72   tables is deter
2e650 6d 69 6e 65 64 20 62 79 20 74 68 65 20 78 42 65  mined by the xBe
2e660 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20  stIndex method. 
2e670 20 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75   ** of the virtu
2e680 61 6c 20 74 61 62 6c 65 20 69 74 73 65 6c 66 20  al table itself 
2e690 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 2d 3e  */.  if( pLast->
2e6a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2e6b0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a  VIRTUALTABLE ){.
2e6c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 4c      testcase( nL
2e6d0 6f 6f 70 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75  oop>0 );  /* Tru
2e6e0 65 20 77 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f  e when outer loo
2e6f0 70 73 20 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61  ps are one-row a
2e700 6e 64 20 6d 61 74 63 68 20 0a 20 20 20 20 20 20  nd match .      
2e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e720 20 20 20 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20      ** no ORDER 
2e730 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  BY terms */.    
2e740 72 65 74 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e  return pLast->u.
2e750 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a  vtab.isOrdered;.
2e760 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20    }.  if( nLoop 
2e770 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  && OptimizationD
2e780 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
2e790 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
2e7a0 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  n) ) return 0;..
2e7b0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
2e7c0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
2e7d0 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72  testcase( nOrder
2e7e0 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  By==BMS-1 );.  i
2e7f0 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d  f( nOrderBy>BMS-
2e800 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  1 ) return 0;  /
2e810 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a  * Cannot optimiz
2e820 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f  e overly large O
2e830 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73  RDER BYs */.  is
2e840 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2e850 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41  1;.  obDone = MA
2e860 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d  SKBIT(nOrderBy)-
2e870 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e  1;.  orderDistin
2e880 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65  ctMask = 0;.  re
2e890 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ady = 0;.  for(i
2e8a0 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44  Loop=0; isOrderD
2e8b0 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74  istinct && obSat
2e8c0 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70  <obDone && iLoop
2e8d0 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  <=nLoop; iLoop++
2e8e0 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70  ){.    if( iLoop
2e8f0 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c  >0 ) ready |= pL
2e900 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
2e910 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70     pLoop = iLoop
2e920 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e  <nLoop ? pPath->
2e930 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70  aLoop[iLoop] : p
2e940 4c 61 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  Last;.    assert
2e950 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
2e960 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
2e970 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20  LTABLE)==0 );.  
2e980 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d    iCur = pWInfo-
2e990 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f  >pTabList->a[pLo
2e9a0 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f  op->iTab].iCurso
2e9b0 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  r;..    /* Mark 
2e9c0 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59  off any ORDER BY
2e9d0 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20   term X that is 
2e9e0 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
2e9f0 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20  table of.    ** 
2ea00 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
2ea10 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65   for which there
2ea20 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20   is term in the 
2ea30 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61  WHERE.    ** cla
2ea40 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  use of the form 
2ea50 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f  X IS NULL or X=?
2ea60 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
2ea70 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a  only outer.    *
2ea80 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a  * loops..    */.
2ea90 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2eaa0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
2eab0 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
2eac0 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
2ead0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f  ntinue;.      pO
2eae0 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  BExpr = sqlite3E
2eaf0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
2eb00 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2eb10 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
2eb20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
2eb30 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75  COLUMN ) continu
2eb40 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42  e;.      if( pOB
2eb50 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43  Expr->iTable!=iC
2eb60 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
2eb70 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
2eb80 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73  dTerm(&pWInfo->s
2eb90 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70  WC, iCur, pOBExp
2eba0 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  r->iColumn,.    
2ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ebc0 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51     ~ready, WO_EQ
2ebd0 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a  |WO_ISNULL, 0);.
2ebe0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
2ebf0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2ec00 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2ec10 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51  >eOperator&WO_EQ
2ec20 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d  )!=0 && pOBExpr-
2ec30 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20  >iColumn>=0 ){. 
2ec40 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2ec50 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20  r *z1, *z2;.    
2ec60 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2ec70 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2ec80 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
2ec90 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2eca0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
2ecb0 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
2ecc0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
2ecd0 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70  ;.        z1 = p
2ece0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
2ecf0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2ed00 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2ed10 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
2ed20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pTerm->pExpr);. 
2ed30 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
2ed40 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
2ed50 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2ed60 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a     z2 = pColl->z
2ed70 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
2ed80 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
2ed90 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f  (z1, z2)!=0 ) co
2eda0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
2edb0 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
2edc0 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d  ASKBIT(i);.    }
2edd0 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ..    if( (pLoop
2ede0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2edf0 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a  E_ONEROW)==0 ){.
2ee00 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
2ee10 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2ee20 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  _IPK ){.        
2ee30 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
2ee40 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b      nColumn = 0;
2ee50 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2ee60 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70   (pIndex = pLoop
2ee70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2ee80 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  )==0 || pIndex->
2ee90 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20  bUnordered ){.  
2eea0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2eeb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2eec0 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70       nColumn = p
2eed0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  Index->nColumn;.
2eee0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
2eef0 69 73 74 69 6e 63 74 20 3d 20 70 49 6e 64 65 78  istinct = pIndex
2ef00 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
2ef10 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ne;.      }..   
2ef20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
2ef30 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  gh all columns o
2ef40 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
2ef50 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e  deal with the on
2ef60 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  es.      ** that
2ef70 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61   are not constra
2ef80 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e  ined by == or IN
2ef90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2efa0 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20   rev = revSet = 
2efb0 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63  0;.      distinc
2efc0 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20  tColumns = 0;.  
2efd0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 3d      for(j=0; j<=
2efe0 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
2eff0 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b         u8 bOnce;
2f000 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75     /* True to ru
2f010 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 73  n the ORDER BY s
2f020 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  earch loop */.. 
2f030 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f         /* Skip o
2f040 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55  ver == and IS NU
2f050 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  LL terms */.    
2f060 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d      if( j<pLoop-
2f070 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
2f080 20 20 20 20 20 20 26 26 20 28 28 69 20 3d 20 70        && ((i = p
2f090 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d  Loop->aLTerm[j]-
2f0a0 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57  >eOperator) & (W
2f0b0 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29  O_EQ|WO_ISNULL))
2f0c0 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
2f0d0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 20 26           if( i &
2f0e0 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
2f0f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2f100 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
2f110 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nct );.         
2f120 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2f130 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
2f140 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f    }.          co
2f150 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20  ntinue;  .      
2f160 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2f170 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  Get the column n
2f180 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62  umber in the tab
2f190 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64  le (iColumn) and
2f1a0 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20   sort order.    
2f1b0 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20      ** (revIdx) 
2f1c0 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c  for the j-th col
2f1d0 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
2f1e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2f1f0 20 20 20 20 20 69 66 28 20 6a 3c 6e 43 6f 6c 75       if( j<nColu
2f200 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
2f210 2f 2a 20 4e 6f 72 6d 61 6c 20 69 6e 64 65 78 20  /* Normal index 
2f220 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
2f230 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
2f240 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
2f250 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  j];.          re
2f260 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61  vIdx = pIndex->a
2f270 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20  SortOrder[j];.  
2f280 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
2f290 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61  umn==pIndex->pTa
2f2a0 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f  ble->iPKey ) iCo
2f2b0 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
2f2c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f2d0 20 20 20 20 2f 2a 20 54 68 65 20 52 4f 57 49 44      /* The ROWID
2f2e0 20 63 6f 6c 75 6d 6e 20 61 74 20 74 68 65 20 65   column at the e
2f2f0 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
2f300 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 6f 6c 75  assert( j==nColu
2f310 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mn );.          
2f320 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
2f330 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d          revIdx =
2f340 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
2f350 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63         /* An unc
2f360 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d  onstrained colum
2f370 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  n that might be 
2f380 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  NULL means that 
2f390 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
2f3a0 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74  WhereLoop is not
2f3b0 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 0a 20   well-ordered . 
2f3c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2f3d0 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
2f3e0 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26  tinct.         &
2f3f0 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  & iColumn>=0.   
2f400 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f        && j>=pLoo
2f410 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20  p->u.btree.nEq. 
2f420 20 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65          && pInde
2f430 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
2f440 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
2f450 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
2f460 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2f470 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
2f480 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2f490 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44   /* Find the ORD
2f4a0 45 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20  ER BY term that 
2f4b0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
2f4c0 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20  he j-th column. 
2f4d0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
2f4e0 20 69 6e 64 65 78 20 61 6e 64 20 61 6e 64 20 6d   index and and m
2f4f0 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42  ark that ORDER B
2f500 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20  Y term off .    
2f510 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62      */.        b
2f520 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Once = 1;.      
2f530 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20    isMatch = 0;. 
2f540 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2f550 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65  bOnce && i<nOrde
2f560 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
2f570 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
2f580 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
2f590 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2f5a0 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69    pOBExpr = sqli
2f5b0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2f5c0 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  te(pOrderBy->a[i
2f5d0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
2f5e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63      testcase( wc
2f5f0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2f600 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20  _GROUPBY );.    
2f610 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2f620 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2f630 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b  RE_DISTINCTBY );
2f640 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
2f650 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48  wctrlFlags & (WH
2f660 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52  ERE_GROUPBY|WHER
2f670 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d  E_DISTINCTBY))==
2f680 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20  0 ) bOnce = 0;. 
2f690 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
2f6a0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
2f6b0 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UMN ) continue;.
2f6c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
2f6d0 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
2f6e0 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
2f6f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
2f700 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  BExpr->iColumn!=
2f710 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  iColumn ) contin
2f720 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
2f730 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ( iColumn>=0 ){.
2f740 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2f750 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
2f760 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
2f770 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
2f780 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2f790 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2f7a0 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
2f7b0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
2f7c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2f7d0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
2f7e0 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  ll->zName, pInde
2f7f0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30  x->azColl[j])!=0
2f800 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2f810 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f820 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a     isMatch = 1;.
2f830 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2f840 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f850 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29     if( isMatch )
2f860 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2f870 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
2f880 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2f890 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  e( distinctColum
2f8a0 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ns==0 );.       
2f8b0 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c       distinctCol
2f8c0 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  umns = 1;.      
2f8d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2f8e0 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
2f8f0 28 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (i);.          i
2f900 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
2f910 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
2f920 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20  ROUPBY)==0 ){.  
2f930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
2f940 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20  e sure the sort 
2f950 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69  order is compati
2f960 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  ble in an ORDER 
2f970 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20  BY clause..     
2f980 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f         ** Sort o
2f990 72 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61  rder is irreleva
2f9a0 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42  nt for a GROUP B
2f9b0 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20  Y clause. */.   
2f9c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
2f9d0 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Set ){.         
2f9e0 20 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20       if( (rev ^ 
2f9f0 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42  revIdx)!=pOrderB
2fa00 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
2fa10 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
2fa20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2fa30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2fa40 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f  ev = revIdx ^ pO
2fa50 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
2fa60 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20  tOrder;.        
2fa70 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20        if( rev ) 
2fa80 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53  *pRevMask |= MAS
2fa90 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20  KBIT(iLoop);.   
2faa0 20 20 20 20 20 20 20 20 20 20 20 72 65 76 53 65             revSe
2fab0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
2fac0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2fad0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2fae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
2faf0 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20  match found */. 
2fb00 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
2fb10 30 20 7c 7c 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29  0 || j<nColumn )
2fb20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
2fb30 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
2fb40 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20  istinct!=0 );.  
2fb50 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
2fb60 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
2fb70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fb80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2fb90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a      }.      } /*
2fba0 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61   end Loop over a
2fbb0 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  ll index columns
2fbc0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69   */.      if( di
2fbd0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b  stinctColumns ){
2fbe0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2fbf0 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
2fc00 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
2fc10 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2fc20 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
2fc30 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f    } /* end-if no
2fc40 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20  t one-row */..  
2fc50 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
2fc60 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59  y other ORDER BY
2fc70 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65   terms that refe
2fc80 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20  rence pLoop */. 
2fc90 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69     if( isOrderDi
2fca0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
2fcb0 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
2fcc0 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  k |= pLoop->mask
2fcd0 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28  Self;.      for(
2fce0 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
2fcf0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
2fd00 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20  xpr *p;.        
2fd10 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
2fd20 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
2fd30 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  e;.        p = p
2fd40 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2fd50 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
2fd60 20 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65   (exprTableUsage
2fd70 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
2fd80 65 74 2c 20 70 29 26 7e 6f 72 64 65 72 44 69 73  et, p)&~orderDis
2fd90 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b  tinctMask)==0 ){
2fda0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74  .          obSat
2fdb0 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
2fdc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fdd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45  }.    }.  } /* E
2fde0 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72  nd the loop over
2fdf0 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20   all WhereLoops 
2fe00 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20  from outer-most 
2fe10 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f  down to inner-mo
2fe20 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61  st */.  if( obSa
2fe30 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75  t==obDone ) retu
2fe40 72 6e 20 31 3b 0a 20 20 69 66 28 20 21 69 73 4f  rn 1;.  if( !isO
2fe50 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 20 72  rderDistinct ) r
2fe60 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
2fe70 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n -1;.}..#ifdef 
2fe80 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
2fe90 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67  ED./* For debugg
2fea0 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f  ing use only: */
2feb0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
2fec0 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d  ar *wherePathNam
2fed0 65 28 57 68 65 72 65 50 61 74 68 20 2a 70 50 61  e(WherePath *pPa
2fee0 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57  th, int nLoop, W
2fef0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29  hereLoop *pLast)
2ff00 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
2ff10 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74  zName[65];.  int
2ff20 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
2ff30 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e  <nLoop; i++){ zN
2ff40 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e  ame[i] = pPath->
2ff50 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d  aLoop[i]->cId; }
2ff60 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a  .  if( pLast ) z
2ff70 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73  Name[i++] = pLas
2ff80 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b  t->cId;.  zName[
2ff90 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  i] = 0;.  return
2ffa0 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66   zName;.}.#endif
2ffb0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  .../*.** Given t
2ffc0 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65  he list of Where
2ffd0 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20  Loop objects at 
2ffe0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
2fff0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
30000 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64  attempts to find
30010 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
30020 20 70 61 74 68 20 74 68 61 74 20 76 69 73 69 74   path that visit
30030 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70  s each WhereLoop
30040 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20  .** once.  This 
30050 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61  path is then loa
30060 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49  ded into the pWI
30070 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20  nfo->a[].pWLoop 
30080 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73  fields..**.** As
30090 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f  sume that the to
300a0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  tal number of ou
300b0 74 70 75 74 20 72 6f 77 73 20 74 68 61 74 20 77  tput rows that w
300c0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
300d0 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65  orted.** will be
300e0 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65   nRowEst (in the
300f0 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65   10*log2 represe
30100 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69  ntation).  Or, i
30110 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a  gnore sorting.**
30120 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73   costs if nRowEs
30130 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  t==0..**.** Retu
30140 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
30150 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54  success or SQLIT
30160 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d  E_NOMEM of a mem
30170 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
30180 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  * error occurs..
30190 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
301a0 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68  erePathSolver(Wh
301b0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
301c0 20 57 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 45   WhereCost nRowE
301d0 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f  st){.  int mxCho
301e0 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ice;            
301f0 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
30200 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f  er of simultaneo
30210 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65 64  us paths tracked
30220 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b   */.  int nLoop;
30230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30240 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
30250 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a  ms in the join *
30260 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
30270 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
30280 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
30290 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
302a0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
302b0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
302c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
302d0 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20  int iLoop;      
302e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
302f0 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74  p counter over t
30300 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
30310 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69  join */.  int ii
30320 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20  , jj;           
30330 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
30340 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  ters */.  WhereC
30350 6f 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20  ost rCost;      
30360 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
30370 66 20 61 20 70 61 74 68 20 2a 2f 0a 20 20 57 68  f a path */.  Wh
30380 65 72 65 43 6f 73 74 20 6d 78 43 6f 73 74 20 3d  ereCost mxCost =
30390 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   0;        /* Ma
303a0 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20  ximum cost of a 
303b0 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a  set of paths */.
303c0 20 20 57 68 65 72 65 43 6f 73 74 20 72 53 6f 72    WhereCost rSor
303d0 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 2f  tCost;         /
303e0 2a 20 43 6f 73 74 20 74 6f 20 64 6f 20 61 20 73  * Cost to do a s
303f0 6f 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  ort */.  int nTo
30400 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  , nFrom;        
30410 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30420 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e  valid entries in
30430 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d   aTo[] and aFrom
30440 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  [] */.  WherePat
30450 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20  h *aFrom;       
30460 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70    /* All nFrom p
30470 61 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76  aths at the prev
30480 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  ious level */.  
30490 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20  WherePath *aTo; 
304a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
304b0 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20   nTo best paths 
304c0 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
304d0 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
304e0 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20  ath *pFrom;     
304f0 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
30500 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61  t of aFrom[] tha
30510 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  t we are working
30520 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61   on */.  WherePa
30530 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20  th *pTo;        
30540 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
30550 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77   of aTo[] that w
30560 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
30570 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
30580 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  *pWLoop;        
30590 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68  /* One of the Wh
305a0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
305b0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
305c0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *pX;           /
305d0 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75  * Used to divy u
305e0 70 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d  p the pSpace mem
305f0 6f 72 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ory */.  char *p
30600 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
30610 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
30620 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
30630 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a  his routine */..
30640 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
30650 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  o->pParse;.  db 
30660 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
30670 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  nLoop = pWInfo->
30680 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e  nLevel;.  /* TUN
30690 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20  ING: For simple 
306a0 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68  queries, only th
306b0 65 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74  e best path is t
306c0 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72  racked..  ** For
306d0 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68   2-way joins, th
306e0 65 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61  e 5 best paths a
306f0 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a  re followed..  *
30700 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33  * For joins of 3
30710 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c   or more tables,
30720 20 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65   track the 10 be
30730 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78  st paths */.  mx
30740 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3d  Choice = (nLoop=
30750 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70  =1) ? 1 : (nLoop
30760 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20  ==2 ? 5 : 10);. 
30770 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d   assert( nLoop<=
30780 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
30790 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52  ->nSrc );.  WHER
307a0 45 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22  ETRACE(0x002, ("
307b0 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65  ---- begin solve
307c0 72 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c  r\n"));..  /* Al
307d0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
307e0 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20  alize space for 
307f0 61 54 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f  aTo and aFrom */
30800 0a 20 20 69 69 20 3d 20 28 73 69 7a 65 6f 66 28  .  ii = (sizeof(
30810 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f  WherePath)+sizeo
30820 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c  f(WhereLoop*)*nL
30830 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b  oop)*mxChoice*2;
30840 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69  .  pSpace = sqli
30850 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
30860 62 2c 20 69 69 29 3b 0a 20 20 69 66 28 20 70 53  b, ii);.  if( pS
30870 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
30880 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
30890 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74   aTo = (WherePat
308a0 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72  h*)pSpace;.  aFr
308b0 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63  om = aTo+mxChoic
308c0 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f  e;.  memset(aFro
308d0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72  m, 0, sizeof(aFr
308e0 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20  om[0]));.  pX = 
308f0 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46  (WhereLoop**)(aF
30900 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20  rom+mxChoice);. 
30910 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65   for(ii=mxChoice
30920 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69  *2, pFrom=aTo; i
30930 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d  i>0; ii--, pFrom
30940 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29  ++, pX += nLoop)
30950 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f  {.    pFrom->aLo
30960 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20  op = pX;.  }..  
30970 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72  /* Seed the sear
30980 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ch with a single
30990 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61   WherePath conta
309a0 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65  ining zero Where
309b0 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Loops..  **.  **
309c0 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20   TUNING: Do not 
309d0 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  let the number o
309e0 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20  f iterations go 
309f0 61 62 6f 76 65 20 32 35 2e 20 20 49 66 20 74 68  above 25.  If th
30a00 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63  e cost.  ** of c
30a10 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f  omputing an auto
30a20 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e  matic index is n
30a30 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74  ot paid back wit
30a40 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 35  hin the first 25
30a50 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e  .  ** rows, then
30a60 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20   do not use the 
30a70 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
30a80 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e   */.  aFrom[0].n
30a90 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65  Row = MIN(pParse
30aa0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36  ->nQueryLoop, 46
30ab0 29 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d  );  assert( 46==
30ac0 77 68 65 72 65 43 6f 73 74 28 32 35 29 20 29 3b  whereCost(25) );
30ad0 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20  .  nFrom = 1;.. 
30ae0 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 20 74   /* Precompute t
30af0 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69  he cost of sorti
30b00 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73  ng the final res
30b10 75 6c 74 20 73 65 74 2c 20 69 66 20 74 68 65 20  ult set, if the 
30b20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73  caller.  ** to s
30b30 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
30b40 28 29 20 77 61 73 20 63 6f 6e 63 65 72 6e 65 64  () was concerned
30b50 20 61 62 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a   about sorting *
30b60 2f 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20  /.  rSortCost = 
30b70 30 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  0;.  if( pWInfo-
30b80 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
30b90 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20  nRowEst==0 ){.  
30ba0 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64    aFrom[0].isOrd
30bb0 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20  eredValid = 1;. 
30bc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
30bd0 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64  UNING: Estimated
30be0 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
30bf0 20 69 73 20 4e 2a 6c 6f 67 32 28 4e 29 20 77 68   is N*log2(N) wh
30c00 65 72 65 20 4e 20 69 73 20 74 68 65 0a 20 20 20  ere N is the.   
30c10 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75   ** number of ou
30c20 74 70 75 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20  tput rows. */.  
30c30 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52    rSortCost = nR
30c40 6f 77 45 73 74 20 2b 20 65 73 74 4c 6f 67 28 6e  owEst + estLog(n
30c50 52 6f 77 45 73 74 29 3b 0a 20 20 20 20 57 48 45  RowEst);.    WHE
30c60 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 28 22  RETRACE(0x002,("
30c70 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25  ---- sort cost=%
30c80 2d 33 64 5c 6e 22 2c 20 72 53 6f 72 74 43 6f 73  -3d\n", rSortCos
30c90 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  t));.  }..  /* C
30ca0 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76  ompute successiv
30cb0 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65  ely longer Where
30cc0 50 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20  Paths using the 
30cd0 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74  previous generat
30ce0 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72  ion.  ** of Wher
30cf0 65 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61  ePaths as the ba
30d00 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  sis for the next
30d10 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  .  Keep track of
30d20 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20   the mxChoice.  
30d30 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74  ** best paths at
30d40 20 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e   each generation
30d50 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
30d60 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
30d70 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54  iLoop++){.    nT
30d80 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  o = 0;.    for(i
30d90 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d  i=0, pFrom=aFrom
30da0 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b  ; ii<nFrom; ii++
30db0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
30dc0 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49    for(pWLoop=pWI
30dd0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c  nfo->pLoops; pWL
30de0 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f  oop; pWLoop=pWLo
30df0 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a  op->pNextLoop){.
30e00 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
30e10 6d 61 73 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20  maskNew;.       
30e20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b   Bitmask revMask
30e30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38   = 0;.        u8
30e40 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
30e50 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  = pFrom->isOrder
30e60 65 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20  edValid;.       
30e70 20 75 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20   u8 isOrdered = 
30e80 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
30e90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
30ea0 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20  WLoop->prereq & 
30eb0 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70  ~pFrom->maskLoop
30ec0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
30ed0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
30ee0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26  Loop->maskSelf &
30ef0 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
30f00 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
30f10 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74  .        /* At t
30f20 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f  his point, pWLoo
30f30 70 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  p is a candidate
30f40 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20   to be the next 
30f50 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a  loop. .        *
30f60 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f  * Compute its co
30f70 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 43  st */.        rC
30f80 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74 41  ost = whereCostA
30f90 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75  dd(pWLoop->rSetu
30fa0 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b  p,pWLoop->rRun +
30fb0 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20   pFrom->nRow);. 
30fc0 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77         rCost = w
30fd0 68 65 72 65 43 6f 73 74 41 64 64 28 72 43 6f 73  hereCostAdd(rCos
30fe0 74 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29  t, pFrom->rCost)
30ff0 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65  ;.        maskNe
31000 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  w = pFrom->maskL
31010 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61  oop | pWLoop->ma
31020 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20  skSelf;.        
31030 69 66 28 20 21 69 73 4f 72 64 65 72 65 64 56 61  if( !isOrderedVa
31040 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lid ){.         
31050 20 73 77 69 74 63 68 28 20 77 68 65 72 65 50 61   switch( wherePa
31060 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
31070 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20  By(pWInfo,.     
31080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31090 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
310a0 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66  By, pFrom, pWInf
310b0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20  o->wctrlFlags,. 
310c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310d0 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c        iLoop, pWL
310e0 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 20 29  oop, &revMask) )
310f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  {.            ca
31100 73 65 20 31 3a 20 20 2f 2a 20 59 65 73 2e 20 20  se 1:  /* Yes.  
31110 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65  pFrom+pWLoop doe
31120 73 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  s satisfy the OR
31130 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
31140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
31150 73 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20  sOrdered = 1;.  
31160 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
31170 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a  deredValid = 1;.
31180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
31190 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
311a0 20 63 61 73 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e   case 0:  /* No.
311b0 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77    pFrom+pWLoop w
311c0 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 73 65  ill require a se
311d0 70 61 72 61 74 65 20 73 6f 72 74 20 2a 2f 0a 20  parate sort */. 
311e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
311f0 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20 20 20  rdered = 0;.    
31200 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
31210 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  redValid = 1;.  
31220 20 20 20 20 20 20 20 20 20 20 20 20 72 43 6f 73              rCos
31230 74 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64  t = whereCostAdd
31240 28 72 43 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73  (rCost, rSortCos
31250 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
31260 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
31270 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a       default: /*
31280 20 43 61 6e 6e 6f 74 20 74 65 6c 6c 20 79 65 74   Cannot tell yet
31290 2e 20 20 54 72 79 20 61 67 61 69 6e 20 6f 6e 20  .  Try again on 
312a0 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
312b0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
312c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
312d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
312e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
312f0 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d  revMask = pFrom-
31300 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  >revLoop;.      
31310 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 43    }.        /* C
31320 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
31330 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20  WLoop should be 
31340 61 64 64 65 64 20 74 6f 20 74 68 65 20 6d 78 43  added to the mxC
31350 68 6f 69 63 65 20 62 65 73 74 20 73 6f 20 66 61  hoice best so fa
31360 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  r */.        for
31370 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20  (jj=0, pTo=aTo; 
31380 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54  jj<nTo; jj++, pT
31390 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
313a0 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f  if( pTo->maskLoo
313b0 70 3d 3d 6d 61 73 6b 4e 65 77 20 26 26 20 70 54  p==maskNew && pT
313c0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
313d0 64 3d 3d 69 73 4f 72 64 65 72 65 64 56 61 6c 69  d==isOrderedVali
313e0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
313f0 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e   testcase( jj==n
31400 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  To-1 );.        
31410 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
31420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
31430 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e  .        if( jj>
31440 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  =nTo ){.        
31450 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f    if( nTo>=mxCho
31460 69 63 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d 78  ice && rCost>=mx
31470 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57  Cost ){.#ifdef W
31480 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
31490 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  D.            if
314a0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
314b0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
314c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
314d0 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69  DebugPrintf("Ski
314e0 70 20 20 20 25 73 20 63 6f 73 74 3d 25 33 64 20  p   %s cost=%3d 
314f0 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
31500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
31510 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
31520 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
31530 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20  p), rCost,.     
31540 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
31550 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69  rderedValid ? (i
31560 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
31570 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
31580 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
31590 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  if.            c
315a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
315b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
315c0 2a 20 41 64 64 20 61 20 6e 65 77 20 50 61 74 68  * Add a new Path
315d0 20 74 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73 65   to the aTo[] se
315e0 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  t */.          i
315f0 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20  f( nTo<mxChoice 
31600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
31610 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73  * Increase the s
31620 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73  ize of the aTo s
31630 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20  et by one */.   
31640 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54           jj = nT
31650 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  o++;.          }
31660 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
31670 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65    /* New path re
31680 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72  places the prior
31690 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63   worst to keep c
316a0 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f  ount below mxCho
316b0 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ice */.         
316c0 20 20 20 66 6f 72 28 6a 6a 3d 6e 54 6f 2d 31 3b     for(jj=nTo-1;
316d0 20 61 54 6f 5b 6a 6a 5d 2e 72 43 6f 73 74 3c 6d   aTo[jj].rCost<m
316e0 78 43 6f 73 74 3b 20 6a 6a 2d 2d 29 7b 20 61 73  xCost; jj--){ as
316f0 73 65 72 74 28 6a 6a 3e 30 29 3b 20 7d 0a 20 20  sert(jj>0); }.  
31700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31710 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a      pTo = &aTo[j
31720 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45  j];.#ifdef WHERE
31730 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
31740 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
31750 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
31760 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
31770 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
31780 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20 63  ntf("New    %s c
31790 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25  ost=%-3d order=%
317a0 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
317b0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
317c0 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
317d0 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
317e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
317f0 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
31800 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20   ? (isOrdered ? 
31810 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
31820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
31830 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65  endif.        }e
31840 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
31850 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72  f( pTo->rCost<=r
31860 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57  Cost ){.#ifdef W
31870 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
31880 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  D.            if
31890 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
318a0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
318b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
318c0 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
318d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
318e0 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25  Skip   %s cost=%
318f0 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  -3d order=%c",. 
31900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31910 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
31920 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
31930 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20  oop), rCost,.   
31940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
31950 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
31960 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  (isOrdered ? 'Y'
31970 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
31980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
31990 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
319a0 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d  ("   vs %s cost=
319b0 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  %-3d order=%c\n"
319c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
319d0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
319e0 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
319f0 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a  0), pTo->rCost,.
31a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a10 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
31a20 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73  Valid ? (pTo->is
31a30 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
31a40 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
31a50 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
31a60 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  f.            te
31a70 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f  stcase( pTo->rCo
31a80 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20  st==rCost );.   
31a90 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
31aa0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
31ab0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
31ac0 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
31ad0 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20  Cost+1 );.      
31ae0 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 61 6e 64      /* A new and
31af0 20 62 65 74 74 65 72 20 73 63 6f 72 65 20 66 6f   better score fo
31b00 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20 63  r a previously c
31b10 72 65 61 74 65 64 20 65 71 75 69 76 61 6c 65 6e  reated equivalen
31b20 74 20 70 61 74 68 20 2a 2f 0a 23 69 66 64 65 66  t path */.#ifdef
31b30 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
31b40 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20 69 66  LED.          if
31b50 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
31b60 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
31b70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
31b80 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
31b90 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61             "Upda
31ba0 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20  te %s cost=%-3d 
31bb0 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
31bc0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
31bd0 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
31be0 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
31bf0 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20  rCost,.         
31c00 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
31c10 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72  Valid ? (isOrder
31c20 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
31c30 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
31c40 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
31c50 50 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73  Printf("  was %s
31c60 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72   cost=%-3d order
31c70 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
31c80 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
31c90 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
31ca0 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
31cb0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
31cc0 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
31cd0 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e  edValid ? (pTo->
31ce0 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20  isOrdered ? 'Y' 
31cf0 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20  : 'N') : '?');. 
31d00 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
31d10 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  f.        }.    
31d20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73      /* pWLoop is
31d30 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20   a winner.  Add 
31d40 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  it to the set of
31d50 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a   best so far */.
31d60 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73          pTo->mas
31d70 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d  kLoop = pFrom->m
31d80 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70  askLoop | pWLoop
31d90 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
31da0 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70      pTo->revLoop
31db0 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20   = revMask;.    
31dc0 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20      pTo->nRow = 
31dd0 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57  pFrom->nRow + pW
31de0 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20  Loop->nOut;.    
31df0 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d      pTo->rCost =
31e00 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20   rCost;.        
31e10 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
31e20 6c 69 64 20 3d 20 69 73 4f 72 64 65 72 65 64 56  lid = isOrderedV
31e30 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 70 54  alid;.        pT
31e40 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69  o->isOrdered = i
31e50 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20  sOrdered;.      
31e60 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c    memcpy(pTo->aL
31e70 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  oop, pFrom->aLoo
31e80 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  p, sizeof(WhereL
31e90 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20  oop*)*iLoop);.  
31ea0 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70        pTo->aLoop
31eb0 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70  [iLoop] = pWLoop
31ec0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54  ;.        if( nT
31ed0 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20  o>=mxChoice ){. 
31ee0 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
31ef0 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a  = aTo[0].rCost;.
31f00 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a            for(jj
31f10 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b  =1, pTo=&aTo[1];
31f20 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a   jj<mxChoice; jj
31f30 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
31f40 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
31f50 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 29 20  >rCost>mxCost ) 
31f60 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43  mxCost = pTo->rC
31f70 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ost;.          }
31f80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31f90 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66   }.    }..#ifdef
31fa0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
31fb0 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
31fc0 74 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32  te3WhereTrace>=2
31fd0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
31fe0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d  3DebugPrintf("--
31ff0 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25  -- after round %
32000 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70  d ----\n", iLoop
32010 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
32020 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e  0, pTo=aTo; ii<n
32030 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29  To; ii++, pTo++)
32040 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
32050 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
32060 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77  s cost=%-3d nrow
32070 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  =%-3d order=%c",
32080 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72  .           wher
32090 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
320a0 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
320b0 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
320c0 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  w,.           pT
320d0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
320e0 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65  d ? (pTo->isOrde
320f0 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
32100 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
32110 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65   if( pTo->isOrde
32120 72 65 64 56 61 6c 69 64 20 26 26 20 70 54 6f 2d  redValid && pTo-
32130 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20  >isOrdered ){.  
32140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
32150 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76  ebugPrintf(" rev
32160 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d  =0x%llx\n", pTo-
32170 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  >revLoop);.     
32180 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32190 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
321a0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
321b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
321c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
321d0 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f    /* Swap the ro
321e0 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64  les of aFrom and
321f0 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78   aTo for the nex
32200 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  t generation */.
32210 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b      pFrom = aTo;
32220 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d  .    aTo = aFrom
32230 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46  ;.    aFrom = pF
32240 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d  rom;.    nFrom =
32250 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   nTo;.  }..  if(
32260 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20   nFrom==0 ){.   
32270 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
32280 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65  (pParse, "no que
32290 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20  ry solution");. 
322a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
322b0 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20  (db, pSpace);.  
322c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
322d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20  ERROR;.  }.  .  
322e0 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65  /* Find the lowe
322f0 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70  st cost path.  p
32300 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66  From will be lef
32310 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
32320 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72  at path */.  pFr
32330 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 61 73  om = aFrom;.  as
32340 73 65 72 74 28 20 6e 46 72 6f 6d 3d 3d 31 20 29  sert( nFrom==1 )
32350 3b 0a 23 69 66 20 30 20 2f 2a 20 54 68 65 20 66  ;.#if 0 /* The f
32360 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6e 65 65 64  ollowing is need
32370 65 64 20 69 66 20 6e 46 72 6f 6d 20 69 73 20 65  ed if nFrom is e
32380 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 31 20  ver more than 1 
32390 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69  */.  for(ii=1; i
323a0 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a  i<nFrom; ii++){.
323b0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72      if( pFrom->r
323c0 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72  Cost>aFrom[ii].r
323d0 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26  Cost ) pFrom = &
323e0 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 23  aFrom[ii];.  }.#
323f0 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
32400 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
32410 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f  nLoop );.  /* Lo
32420 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  ad the lowest co
32430 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49  st path into pWI
32440 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  nfo */.  for(iLo
32450 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
32460 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
32470 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
32480 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20  vel = pWInfo->a 
32490 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65  + iLoop;.    pLe
324a0 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57  vel->pWLoop = pW
324b0 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c  Loop = pFrom->aL
324c0 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20  oop[iLoop];.    
324d0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20  pLevel->iFrom = 
324e0 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20  pWLoop->iTab;.  
324f0 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75    pLevel->iTabCu
32500 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  r = pWInfo->pTab
32510 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
32520 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a  iFrom].iCursor;.
32530 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66    }.  if( (pWInf
32540 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
32550 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
32560 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70  NCT)!=0.   && (p
32570 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
32580 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
32590 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70  CTBY)==0.   && p
325a0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
325b0 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
325c0 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77  _NOOP.   && nRow
325d0 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74  Est.  ){.    Bit
325e0 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20  mask notUsed;.  
325f0 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65    int rc = where
32600 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
32610 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49  erBy(pWInfo, pWI
32620 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c  nfo->pResultSet,
32630 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20   pFrom,.        
32640 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 44           WHERE_D
32650 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70  ISTINCTBY, nLoop
32660 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  -1, pFrom->aLoop
32670 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55  [nLoop-1], &notU
32680 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sed);.    if( rc
32690 3d 3d 31 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44  ==1 ) pWInfo->eD
326a0 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
326b0 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
326c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 6f  ;.  }.  if( pFro
326d0 6d 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a  m->isOrdered ){.
326e0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
326f0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
32700 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b  RE_DISTINCTBY ){
32710 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
32720 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
32730 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
32740 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
32750 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53      pWInfo->bOBS
32760 61 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 57  at = 1;.      pW
32770 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
32780 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
32790 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e      }.  }.  pWIn
327a0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46  fo->nRowOut = pF
327b0 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a  rom->nRow;..  /*
327c0 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20   Free temporary 
327d0 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72  memory and retur
327e0 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73  n success */.  s
327f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
32800 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75   pSpace);.  retu
32810 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
32820 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72  ./*.** Most quer
32830 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73  ies use only a s
32840 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65  ingle table (the
32850 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29  y are not joins)
32860 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d   and have.** sim
32870 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ple == constrain
32880 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78  ts against index
32890 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73  ed fields.  This
328a0 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
328b0 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f  s.** to plan tho
328c0 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20  se simple cases 
328d0 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20  using much less 
328e0 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68  ceremony than th
328f0 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72  e.** general-pur
32900 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e  pose query plann
32910 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20  er, and thereby 
32920 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c  yield faster sql
32930 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a  ite3_prepare().*
32940 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20  * times for the 
32950 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a  common case..**.
32960 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
32970 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69  ro on success, i
32980 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  f this query can
32990 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74   be handled by t
329a0 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73  his.** no-frills
329b0 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20   query planner. 
329c0 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20   Return zero if 
329d0 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73  this query needs
329e0 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c   the .** general
329f0 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70  -purpose query p
32a00 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  lanner..*/.stati
32a10 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74  c int whereShort
32a20 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  Cut(WhereLoopBui
32a30 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
32a40 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
32a50 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53  Info;.  struct S
32a60 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
32a70 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  em;.  WhereClaus
32a80 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54  e *pWC;.  WhereT
32a90 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68  erm *pTerm;.  Wh
32aa0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a  ereLoop *pLoop;.
32ab0 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e    int iCur;.  in
32ac0 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  t j;.  Table *pT
32ad0 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
32ae0 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d  x;.  .  pWInfo =
32af0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
32b00 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  o;.  if( pWInfo-
32b10 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
32b20 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20  ERE_FORCE_TABLE 
32b30 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
32b40 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54  sert( pWInfo->pT
32b50 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20  abList->nSrc>=1 
32b60 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49  );.  pItem = pWI
32b70 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
32b80 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d  ;.  pTab = pItem
32b90 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73  ->pTab;.  if( Is
32ba0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
32bb0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
32bc0 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20  pItem->zIndex ) 
32bd0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72  return 0;.  iCur
32be0 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
32bf0 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  r;.  pWC = &pWIn
32c00 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70  fo->sWC;.  pLoop
32c10 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
32c20 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  w;.  pLoop->wsFl
32c30 61 67 73 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d  ags = 0;.  pTerm
32c40 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
32c50 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
32c60 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  _EQ, 0);.  if( p
32c70 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  Term ){.    pLoo
32c80 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
32c90 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
32ca0 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45  RE_IPK|WHERE_ONE
32cb0 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  ROW;.    pLoop->
32cc0 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
32cd0 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  m;.    pLoop->nL
32ce0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c  Term = 1;.    pL
32cf0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
32d00 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e   = 1;.    /* TUN
32d10 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72  ING: Cost of a r
32d20 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31  owid lookup is 1
32d30 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 */.    pLoop->
32d40 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33  rRun = 33;  /* 3
32d50 33 3d 3d 77 68 65 72 65 43 6f 73 74 28 31 30 29  3==whereCost(10)
32d60 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
32d70 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
32d80 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
32d90 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
32da0 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
32db0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
32dc0 65 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74  e || pIdx->pPart
32dd0 49 64 78 57 68 65 72 65 21 3d 30 20 29 20 63 6f  IdxWhere!=0 ) co
32de0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
32df0 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
32e00 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
32e10 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
32e20 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
32e30 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  , pIdx->aiColumn
32e40 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70  [j], 0, WO_EQ, p
32e50 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Idx);.        if
32e60 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65  ( pTerm==0 ) bre
32e70 61 6b 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  ak;.        wher
32e80 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 57 49 6e  eLoopResize(pWIn
32e90 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  fo->pParse->db, 
32ea0 70 4c 6f 6f 70 2c 20 6a 29 3b 0a 20 20 20 20 20  pLoop, j);.     
32eb0 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
32ec0 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [j] = pTerm;.   
32ed0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
32ee0 21 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  !=pIdx->nColumn 
32ef0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
32f00 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
32f10 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
32f20 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c  EQ|WHERE_ONEROW|
32f30 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
32f40 20 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d       if( (pItem-
32f50 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75  >colUsed & ~colu
32f60 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29  mnsInIndex(pIdx)
32f70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
32f80 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
32f90 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
32fa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32fb0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
32fc0 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  j;.      pLoop->
32fd0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b  u.btree.nEq = j;
32fe0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
32ff0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
33000 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  Idx;.      /* TU
33010 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
33020 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f  unique index loo
33030 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20  kup is 15 */.   
33040 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
33050 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 77 68 65   39;  /* 39==whe
33060 72 65 43 6f 73 74 28 31 35 29 20 2a 2f 0a 20 20  reCost(15) */.  
33070 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
33080 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
33090 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20  ->wsFlags ){.   
330a0 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
330b0 57 68 65 72 65 43 6f 73 74 29 31 3b 0a 20 20 20  WhereCost)1;.   
330c0 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57   pWInfo->a[0].pW
330d0 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20  Loop = pLoop;.  
330e0 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c    pLoop->maskSel
330f0 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49  f = getMask(&pWI
33100 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
33110 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  Cur);.    pWInfo
33120 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d  ->a[0].iTabCur =
33130 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66   iCur;.    pWInf
33140 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a  o->nRowOut = 1;.
33150 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
33160 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66  pOrderBy ) pWInf
33170 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 20 31 3b 0a  o->bOBSat =  1;.
33180 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
33190 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
331a0 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
331b0 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
331c0 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
331d0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
331e0 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  QUE;.    }.#ifde
331f0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
33200 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20     pLoop->cId = 
33210 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  '0';.#endif.    
33220 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
33230 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
33240 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
33250 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
33260 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57   loop used for W
33270 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
33280 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72  essing..** The r
33290 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
332a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
332b0 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20  paque structure 
332c0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
332d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65   information nee
332e0 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ded to terminate
332f0 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65   the loop.  Late
33300 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  r, the calling r
33310 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64  outine.** should
33320 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57   invoke sqlite3W
33330 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74  hereEnd() with t
33340 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
33350 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
33360 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
33370 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45  complete the WHE
33380 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
33390 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sing..**.** If a
333a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
333b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
333c0 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  urns NULL..**.**
333d0 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20   The basic idea 
333e0 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65  is to do a neste
333f0 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70  d loop, one loop
33400 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
33410 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  in.** the FROM c
33420 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63  lause of a selec
33430 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20  t.  (INSERT and 
33440 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
33450 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  s are the.** sam
33460 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69  e as a SELECT wi
33470 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  th only a single
33480 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
33490 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72  OM clause.)  For
334a0 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  .** example, if 
334b0 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a  the SQL is this:
334c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c  .**.**       SEL
334d0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
334e0 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b  2, t3 WHERE ...;
334f0 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20  .**.** Then the 
33500 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69  code generated i
33510 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c  s conceptually l
33520 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ike the followin
33530 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f  g:.**.**      fo
33540 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
33550 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43   do       \    C
33560 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
33570 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
33580 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20  row2 in t2 do   
33590 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
335a0 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
335b0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
335c0 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20  h row3 in t3 do 
335d0 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    /.**          
335e0 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
335f0 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
33600 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43            \    C
33610 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
33620 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
33630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33640 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
33650 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
33660 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
33670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33680 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  /.**.** Note tha
33690 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68  t the loops migh
336a0 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20  t not be nested 
336b0 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  in the order in 
336c0 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70  which they.** ap
336d0 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
336e0 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66   clause if a dif
336f0 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20  ferent order is 
33700 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d  better able to m
33710 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e  ake.** use of in
33720 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73  dices.  Note als
33730 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
33740 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65  IN operator appe
33750 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48  ars in.** the WH
33760 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d  ERE clause, it m
33770 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
33780 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64  dditional nested
33790 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63   loops for.** sc
337a0 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
337b0 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65  ll values on the
337c0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
337d0 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a   of the IN..**.*
337e0 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65  * There are Btre
337f0 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  e cursors associ
33800 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74  ated with each t
33810 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63  able.  t1 uses c
33820 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ursor.** number 
33830 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
33840 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73  Cursor.  t2 uses
33850 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62   the cursor pTab
33860 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73  List->a[1].iCurs
33870 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  or..** And so fo
33880 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69  rth.  This routi
33890 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
338a0 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20  e to open those 
338b0 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20  VDBE cursors.** 
338c0 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  and sqlite3Where
338d0 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20  End() generates 
338e0 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73  the code to clos
338f0 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  e them..**.** Th
33900 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
33910 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
33920 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73  generates leaves
33930 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d   the cursors nam
33940 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73  ed.** in pTabLis
33950 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
33960 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20  eir appropriate 
33970 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e  entries.  The [.
33980 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20  ..] code.** can 
33990 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e  use OP_Column an
339a0 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64  d OP_Rowid opcod
339b0 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73  es on these curs
339c0 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a  ors to extract.*
339d0 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
339e0 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f  various tables o
339f0 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  f the loop..**.*
33a00 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
33a10 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20  lause is empty, 
33a20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70  the foreach loop
33a30 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e  s must each scan
33a40 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65   their.** entire
33a50 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61   tables.  Thus a
33a60 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20   three-way join 
33a70 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65  is an O(N^3) ope
33a80 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a  ration.  But if.
33a90 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61  ** the tables ha
33aa0 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  ve indices and t
33ab0 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69  here are terms i
33ac0 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
33ad0 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  se that.** refer
33ae0 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65   to those indice
33af0 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61  s, a complete ta
33b00 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20  ble scan can be 
33b10 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a  avoided and the.
33b20 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e  ** code will run
33b30 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d   much faster.  M
33b40 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20  ost of the work 
33b50 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
33b60 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74  is checking.** t
33b70 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
33b80 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  re indices that 
33b90 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
33ba0 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70  peed up the loop
33bb0 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
33bc0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
33bd0 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20  e are also used 
33be0 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72  to limit which r
33bf0 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  ows actually.** 
33c00 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22  make it to the "
33c10 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64  ..." in the midd
33c20 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  le of the loop. 
33c30 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72   After each "for
33c40 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20  each",.** terms 
33c50 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
33c60 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c  use that use onl
33c70 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20  y terms in that 
33c80 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a  loop and outer.*
33c90 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c  * loops are eval
33ca0 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c  uated and if fal
33cb0 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  se a jump is mad
33cc0 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62  e around all sub
33cd0 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72  sequent.** inner
33ce0 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e   loops (or aroun
33cf0 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74  d the "..." if t
33d00 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77  he test occurs w
33d10 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d  ithin the inner-
33d20 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a  .** most loop).*
33d30 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53  *.** OUTER JOINS
33d40 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20  .**.** An outer 
33d50 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74  join of tables t
33d60 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63  1 and t2 is conc
33d70 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73  eptally coded as
33d80 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
33d90 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
33da0 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20  in t1 do.**     
33db0 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20   flag = 0.**    
33dc0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
33dd0 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t2 do.**      
33de0 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20    start:.**     
33df0 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
33e00 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a       flag = 1.**
33e10 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20        end.**    
33e20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65    if flag==0 the
33e30 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65  n.**        move
33e40 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72   the row2 cursor
33e50 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a   to a null row.*
33e60 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74  *        goto st
33e70 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a  art.**      fi.*
33e80 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f  *    end.**.** O
33e90 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50  RDER BY CLAUSE P
33ea0 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20  ROCESSING.**.** 
33eb0 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f  pOrderBy is a po
33ec0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44  inter to the ORD
33ed0 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72  ER BY clause (or
33ee0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
33ef0 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57  ause.** if the W
33f00 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61  HERE_GROUPBY fla
33f10 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74 72  g is set in wctr
33f20 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c  lFlags) of a SEL
33f30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
33f40 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
33f50 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
33f60 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
33f70 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
33f80 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
33f90 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
33fa0 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
33fb0 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65  ment, then pOrde
33fc0 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  rBy is NULL..*/.
33fd0 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74  WhereInfo *sqlit
33fe0 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20  e3WhereBegin(.  
33ff0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
34000 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
34010 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
34020 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
34030 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  st,    /* FROM c
34040 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66  lause: A list of
34050 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62   all tables to b
34060 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45  e scanned */.  E
34070 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
34080 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
34090 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
340a0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
340b0 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20  ,   /* An ORDER 
340c0 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55  BY clause, or NU
340d0 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
340e0 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a   *pResultSet, /*
340f0 20 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   Result set of t
34100 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75 31  he query */.  u1
34110 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20  6 wctrlFlags,   
34120 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
34130 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
34140 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
34150 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20  eInt.h */.  int 
34160 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20 20  iIdxCur         
34170 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e    /* If WHERE_ON
34180 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73  ETABLE_ONLY is s
34190 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72  et, index cursor
341a0 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
341b0 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20  int nByteWInfo; 
341c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
341d0 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  m. bytes allocat
341e0 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f  ed for WhereInfo
341f0 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74   struct */.  int
34200 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20   nTabList;      
34210 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
34220 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
34230 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57   pTabList */.  W
34240 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
34250 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c  ;         /* Wil
34260 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  l become the ret
34270 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
34280 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
34290 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
342a0 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68  ->pVdbe;   /* Th
342b0 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  e virtual databa
342c0 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42  se engine */.  B
342d0 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b  itmask notReady;
342e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
342f0 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
34300 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64  t yet positioned
34310 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
34320 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20  uilder sWLB;    
34330 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
34340 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57  p builder */.  W
34350 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
34360 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65  skSet;    /* The
34370 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b   expression mask
34380 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c   set */.  WhereL
34390 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20  evel *pLevel;   
343a0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
343b0 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f   level in pWInfo
343c0 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  ->a[] */.  Where
343d0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
343e0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
343f0 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65   to a single Whe
34400 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
34410 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
34420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34430 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
34440 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
34450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34460 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
34470 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
34480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34490 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
344a0 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61  ode */...  /* Va
344b0 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a  riable initializ
344c0 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20  ation */.  db = 
344d0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65  pParse->db;.  me
344e0 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73  mset(&sWLB, 0, s
344f0 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 20 20  izeof(sWLB));.  
34500 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20  sWLB.pOrderBy = 
34510 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
34520 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54  Disable the DIST
34530 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f  INCT optimizatio
34540 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74  n if SQLITE_Dist
34550 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76  inctOpt is set v
34560 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ia.  ** sqlite3_
34570 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45  test_ctrl(SQLITE
34580 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
34590 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a  ZATIONS,...) */.
345a0 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
345b0 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
345c0 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
345d0 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46  t) ){.    wctrlF
345e0 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57  lags &= ~WHERE_W
345f0 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20  ANT_DISTINCT;.  
34600 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  }..  /* The numb
34610 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
34620 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
34630 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
34640 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  e number of.  **
34650 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61   bits in a Bitma
34660 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  sk .  */.  testc
34670 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e  ase( pTabList->n
34680 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66  Src==BMS );.  if
34690 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
346a0 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69  >BMS ){.    sqli
346b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
346c0 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20  se, "at most %d 
346d0 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
346e0 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74  ", BMS);.    ret
346f0 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
34700 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   This function n
34710 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  ormally generate
34720 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  s a nested loop 
34730 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  for all tables i
34740 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  n .  ** pTabList
34750 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48  .  But if the WH
34760 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
34770 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  Y flag is set, t
34780 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20  hen we should.  
34790 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65  ** only generate
347a0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69   code for the fi
347b0 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61  rst table in pTa
347c0 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65  bList and assume
347d0 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63   that.  ** any c
347e0 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
347f0 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e  d with subsequen
34800 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69  t tables are uni
34810 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
34820 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77  .  nTabList = (w
34830 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
34840 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
34850 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d   ? 1 : pTabList-
34860 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  >nSrc;..  /* All
34870 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
34880 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
34890 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
348a0 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
348b0 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
348c0 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c  lue. A single al
348d0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64  location is used
348e0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68   to store the Wh
348f0 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72  ereInfo.  ** str
34900 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  uct, the content
34910 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61  s of WhereInfo.a
34920 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61  [], the WhereCla
34930 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  use structure.  
34940 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
34950 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
34960 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c  e. Since WhereCl
34970 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ause contains an
34980 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65   8-byte.  ** fie
34990 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b  ld (type Bitmask
349a0 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69  ) it must be ali
349b0 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74  gned on an 8-byt
349c0 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20  e boundary on.  
349d0 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63  ** some architec
349e0 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65  tures. Hence the
349f0 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e   ROUND8() below.
34a00 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e  .  */.  nByteWIn
34a10 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  fo = ROUND8(size
34a20 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e  of(WhereInfo)+(n
34a30 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f  TabList-1)*sizeo
34a40 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
34a50 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
34a60 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
34a70 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20  b, nByteWInfo + 
34a80 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
34a90 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ));.  if( db->ma
34aa0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
34ab0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
34ac0 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20  db, pWInfo);.   
34ad0 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20   pWInfo = 0;.   
34ae0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
34af0 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
34b00 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54  nfo->nLevel = nT
34b10 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
34b20 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
34b30 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
34b40 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
34b50 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ;.  pWInfo->pOrd
34b60 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
34b70 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  .  pWInfo->pResu
34b80 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53  ltSet = pResultS
34b90 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  et;.  pWInfo->iB
34ba0 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
34bb0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
34bc0 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
34bd0 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
34be0 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76  s;.  pWInfo->sav
34bf0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
34c00 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
34c10 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  p;.  pMaskSet = 
34c20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
34c30 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f  t;.  sWLB.pWInfo
34c40 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c   = pWInfo;.  sWL
34c50 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d  B.pWC = &pWInfo-
34c60 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65  >sWC;.  sWLB.pNe
34c70 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29  w = (WhereLoop*)
34c80 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29  (((char*)pWInfo)
34c90 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20  +nByteWInfo);.  
34ca0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
34cb0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c  TE_ALIGNMENT(sWL
34cc0 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65  B.pNew) );.  whe
34cd0 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e  reLoopInit(sWLB.
34ce0 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51  pNew);.#ifdef SQ
34cf0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c  LITE_DEBUG.  sWL
34d00 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a  B.pNew->cId = '*
34d10 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  ';.#endif..  /* 
34d20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20  Split the WHERE 
34d30 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61  clause into sepa
34d40 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69  rate subexpressi
34d50 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20  ons where each. 
34d60 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f   ** subexpressio
34d70 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
34d80 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  y an AND operato
34d90 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61  r..  */.  initMa
34da0 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b  skSet(pMaskSet);
34db0 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  .  whereClauseIn
34dc0 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  it(&pWInfo->sWC,
34dd0 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69   pWInfo);.  sqli
34de0 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74  te3ExprCodeConst
34df0 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68  ants(pParse, pWh
34e00 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  ere);.  whereSpl
34e10 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  it(&pWInfo->sWC,
34e20 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29   pWhere, TK_AND)
34e30 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  ;.  sqlite3CodeV
34e40 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
34e50 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65  se, -1); /* Inse
34e60 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  rt the cookie ve
34e70 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20  rifier Goto */. 
34e80 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c     .  /* Special
34e90 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63   case: a WHERE c
34ea0 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f  lause that is co
34eb0 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74  nstant.  Evaluat
34ec0 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65  e the.  ** expre
34ed0 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72  ssion and either
34ee0 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f   jump over all o
34ef0 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61  f the code or fa
34f00 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20  ll thru..  */.  
34f10 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28 6e  if( pWhere && (n
34f20 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71  TabList==0 || sq
34f30 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
34f40 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72  antNotJoin(pWher
34f50 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e)) ){.    sqlit
34f60 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
34f70 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57  arse, pWhere, pW
34f80 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51  Info->iBreak, SQ
34f90 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
34fa0 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  ;.    pWhere = 0
34fb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  ;.  }..  /* Spec
34fc0 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f  ial case: No FRO
34fd0 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  M clause.  */.  
34fe0 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20  if( nTabList==0 
34ff0 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  ){.    if( pOrde
35000 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f  rBy ) pWInfo->bO
35010 42 53 61 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  BSat = 1;.    if
35020 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
35030 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
35040 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  CT ){.      pWIn
35050 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
35060 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
35070 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  NIQUE;.    }.  }
35080 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20  ..  /* Assign a 
35090 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74  bit from the bit
350a0 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65  mask to every te
350b0 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  rm in the FROM c
350c0 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
350d0 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20   When assigning 
350e0 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74  bitmask values t
350f0 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75  o FROM clause cu
35100 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62  rsors, it must b
35110 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20  e.  ** the case 
35120 74 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65  that if X is the
35130 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
35140 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73   N-th FROM claus
35150 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a  e term then.  **
35160 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
35170 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65   all FROM clause
35180 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65   terms to the le
35190 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74  ft of the N-th t
351a0 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31  erm.  ** is (X-1
351b0 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69  ).   An expressi
351c0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63  on from the ON c
351d0 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
351e0 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a  JOIN can use.  *
351f0 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68  * its Expr.iRigh
35200 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65  tJoinTable value
35210 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74   to find the bit
35220 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68  mask of the righ
35230 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20  t table.  ** of 
35240 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72  the join.  Subtr
35250 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20  acting one from 
35260 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
35270 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a  bitmask gives a.
35280 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72    ** bitmask for
35290 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
352a0 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a  he left of the j
352b0 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68  oin.  Knowing th
352c0 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66  e bitmask.  ** f
352d0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
352e0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c   the left of a l
352f0 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f  eft join is impo
35300 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23  rtant.  Ticket #
35310 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3015..  **.  ** 
35320 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73  Note that bitmas
35330 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ks are created f
35340 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d  or all pTabList-
35350 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a  >nSrc tables in.
35360 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e    ** pTabList, n
35370 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73  ot just the firs
35380 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65  t nTabList table
35390 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20  s.  nTabList is 
353a0 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71  normally.  ** eq
353b0 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d  ual to pTabList-
353c0 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20  >nSrc but might 
353d0 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20  be shortened to 
353e0 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48  1 if the.  ** WH
353f0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
35400 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20  Y flag is set.. 
35410 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
35420 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ii<pTabList->nSr
35430 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72  c; ii++){.    cr
35440 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eateMask(pMaskSe
35450 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
35460 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d  i].iCursor);.  }
35470 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
35480 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20    {.    Bitmask 
35490 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20  toTheLeft = 0;. 
354a0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
354b0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
354c0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74  ii++){.      Bit
354d0 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b  mask m = getMask
354e0 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
354f0 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73  ist->a[ii].iCurs
35500 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  or);.      asser
35510 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c  t( (m-1)==toTheL
35520 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54  eft );.      toT
35530 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20  heLeft |= m;.   
35540 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
35550 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20   /* Analyze all 
35560 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73  of the subexpres
35570 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61  sions.  Note tha
35580 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20  t exprAnalyze() 
35590 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e  might.  ** add n
355a0 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
355b0 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
355c0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
355d0 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20  e.  We do not.  
355e0 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79  ** want to analy
355f0 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c  ze these virtual
35600 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74   terms, so start
35610 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68   analyzing at th
35620 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77  e end.  ** and w
35630 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74  ork forward so t
35640 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69  hat the added vi
35650 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20  rtual terms are 
35660 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e  never processed.
35670 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c  .  */.  exprAnal
35680 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c  yzeAll(pTabList,
35690 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a   &pWInfo->sWC);.
356a0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
356b0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
356c0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
356d0 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  or;.  }..  /* If
356e0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 28 6f   the ORDER BY (o
356f0 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75  r GROUP BY) clau
35700 73 65 20 63 6f 6e 74 61 69 6e 73 20 72 65 66 65  se contains refe
35710 72 65 6e 63 65 73 20 74 6f 20 67 65 6e 65 72 61  rences to genera
35720 6c 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  l.  ** expressio
35730 6e 73 2c 20 74 68 65 6e 20 77 65 20 77 6f 6e 27  ns, then we won'
35740 74 20 62 65 20 61 62 6c 65 20 74 6f 20 73 61 74  t be able to sat
35750 69 73 66 79 20 69 74 20 75 73 69 6e 67 20 69 6e  isfy it using in
35760 64 69 63 65 73 2c 20 73 6f 0a 20 20 2a 2a 20 67  dices, so.  ** g
35770 6f 20 61 68 65 61 64 20 61 6e 64 20 64 69 73 61  o ahead and disa
35780 62 6c 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ble it now..  */
35790 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
357a0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
357b0 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
357c0 49 4e 43 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  INCT)!=0 ){.    
357d0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72  for(ii=0; ii<pOr
357e0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69  derBy->nExpr; ii
357f0 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
35800 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  *pExpr = sqlite3
35810 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
35820 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e  pOrderBy->a[ii].
35830 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
35840 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
35850 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
35860 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
35870 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20  By = pOrderBy = 
35880 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  0;.        break
35890 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
358a0 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
358b0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  <0 ){.        br
358c0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
358d0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 63   }.  }..  if( wc
358e0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
358f0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
35900 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69 73 74  {.    if( isDist
35910 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50  inctRedundant(pP
35920 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
35930 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52  &pWInfo->sWC, pR
35940 65 73 75 6c 74 53 65 74 29 20 29 7b 0a 20 20 20  esultSet) ){.   
35950 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e     /* The DISTIN
35960 43 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f  CT marking is po
35970 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65  intless.  Ignore
35980 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57   it. */.      pW
35990 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
359a0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
359b0 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c  _UNIQUE;.    }el
359c0 73 65 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d  se if( pOrderBy=
359d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
359e0 72 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74  ry to ORDER BY t
359f0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f  he result set to
35a00 20 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70   make distinct p
35a10 72 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65 72  rocessing easier
35a20 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   */.      pWInfo
35a30 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  ->wctrlFlags |= 
35a40 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
35a50 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
35a60 70 4f 72 64 65 72 42 79 20 3d 20 70 52 65 73 75  pOrderBy = pResu
35a70 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  ltSet;.    }.  }
35a80 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74  ..  /* Construct
35a90 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
35aa0 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48 45 52  bjects */.  WHER
35ab0 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28 22  ETRACE(0xffff,("
35ac0 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
35ad0 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  art ***\n"));.  
35ae0 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20  if( nTabList!=1 
35af0 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  || whereShortCut
35b00 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20  (&sWLB)==0 ){.  
35b10 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
35b20 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20  AddAll(&sWLB);. 
35b30 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
35b40 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
35b50 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69 73 70  ;.  .    /* Disp
35b60 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57  lay all of the W
35b70 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
35b80 20 69 66 20 77 68 65 72 65 74 72 61 63 65 20 69   if wheretrace i
35b90 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66  s enabled */.#if
35ba0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
35bb0 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
35bc0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
35bd0 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c   ){.      WhereL
35be0 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e  oop *p;.      in
35bf0 74 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74 69  t i;.      stati
35c00 63 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20  c char zLabel[] 
35c10 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63  = "0123456789abc
35c20 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
35c30 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20  tuvwyxz".       
35c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c60 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
35c70 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20  PQRSTUVWYXZ";.  
35c80 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f      for(p=pWInfo
35c90 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70  ->pLoops, i=0; p
35ca0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ; p=p->pNextLoop
35cb0 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , i++){.        
35cc0 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b  p->cId = zLabel[
35cd0 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29  i%sizeof(zLabel)
35ce0 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  ];.        where
35cf0 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 54 61  LoopPrint(p, pTa
35d00 62 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  bList);.      }.
35d10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a      }.#endif.  .
35d20 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c      wherePathSol
35d30 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a  ver(pWInfo, 0);.
35d40 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
35d50 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
35d60 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
35d70 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
35d80 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
35d90 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c      wherePathSol
35da0 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e  ver(pWInfo, pWIn
35db0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a  fo->nRowOut+1);.
35dc0 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
35dd0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
35de0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
35df0 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  or;.    }.  }.  
35e00 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
35e10 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e  erBy==0 && (db->
35e20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
35e30 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20  everseOrder)!=0 
35e40 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ){.     pWInfo->
35e50 72 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61  revMask = (Bitma
35e60 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69  sk)(-1);.  }.  i
35e70 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
35e80 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c  || NEVER(db->mal
35e90 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20  locFailed) ){.  
35ea0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
35eb0 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64  nError;.  }.#ifd
35ec0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
35ed0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
35ee0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
35ef0 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
35f00 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
35f10 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69  ntf("---- Soluti
35f20 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49  on nRow=%d", pWI
35f30 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20  nfo->nRowOut);. 
35f40 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 62     if( pWInfo->b
35f50 4f 42 53 61 74 20 29 7b 0a 20 20 20 20 20 20 73  OBSat ){.      s
35f60 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
35f70 66 28 22 20 4f 52 44 45 52 42 59 3d 30 78 25 6c  f(" ORDERBY=0x%l
35f80 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76  lx", pWInfo->rev
35f90 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mask);.    }.   
35fa0 20 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d   switch( pWInfo-
35fb0 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  >eDistinct ){.  
35fc0 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
35fd0 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
35fe0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
35ff0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
36000 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22  DISTINCT=unique"
36010 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
36020 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36030 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
36040 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20  NCT_ORDERED: {. 
36050 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
36060 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
36070 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b  TINCT=ordered");
36080 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
36090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
360a0 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
360b0 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20  T_UNORDERED: {. 
360c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
360d0 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
360e0 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22  TINCT=unordered"
360f0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
36100 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36110 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
36120 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
36130 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
36140 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
36150 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72  i++){.      wher
36160 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66  eLoopPrint(pWInf
36170 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c  o->a[ii].pWLoop,
36180 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20   pTabList);.    
36190 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f  }.  }.#endif.  /
361a0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69  * Attempt to omi
361b0 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68  t tables from th
361c0 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e  e join that do n
361d0 6f 74 20 65 66 66 65 63 74 20 74 68 65 20 72 65  ot effect the re
361e0 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57  sult */.  if( pW
361f0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a  Info->nLevel>=2.
36200 20 20 20 26 26 20 70 52 65 73 75 6c 74 53 65 74     && pResultSet
36210 21 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69  !=0.   && Optimi
36220 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
36230 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f  , SQLITE_OmitNoo
36240 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20  pJoin).  ){.    
36250 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20  Bitmask tabUsed 
36260 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
36270 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
36280 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20  ResultSet);.    
36290 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 74  if( pOrderBy ) t
362a0 61 62 55 73 65 64 20 7c 3d 20 65 78 70 72 4c 69  abUsed |= exprLi
362b0 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
362c0 73 6b 53 65 74 2c 20 70 4f 72 64 65 72 42 79 29  skSet, pOrderBy)
362d0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49  ;.    while( pWI
362e0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29  nfo->nLevel>=2 )
362f0 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
36300 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b  m *pTerm, *pEnd;
36310 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  .      pLoop = p
36320 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d  WInfo->a[pWInfo-
36330 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f  >nLevel-1].pWLoo
36340 70 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 57  p;.      if( (pW
36350 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
36360 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a  a[pLoop->iTab].j
36370 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
36380 54 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  T)==0 ) break;. 
36390 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
363a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
363b0 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20  T_DISTINCT)==0. 
363c0 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
363d0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
363e0 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20  _ONEROW)==0.    
363f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65    ){.        bre
36400 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
36410 20 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26    if( (tabUsed &
36420 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
36430 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
36440 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e      pEnd = sWLB.
36450 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57  pWC->a + sWLB.pW
36460 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  C->nTerm;.      
36470 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70  for(pTerm=sWLB.p
36480 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e  WC->a; pTerm<pEn
36490 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
364a0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
364b0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
364c0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
364d0 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78  .         && !Ex
364e0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
364f0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
36500 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20  romJoin).       
36510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
36520 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
36530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
36540 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72   pTerm<pEnd ) br
36550 65 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45  eak;.      WHERE
36560 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
36570 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20  -> drop loop %c 
36580 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f  not used\n", pLo
36590 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20  op->cId));.     
365a0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d   pWInfo->nLevel-
365b0 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73  -;.      nTabLis
365c0 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t--;.    }.  }. 
365d0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
365e0 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  ff,("*** Optimiz
365f0 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
36600 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  n"));.  pWInfo->
36610 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
36620 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52  op += pWInfo->nR
36630 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  owOut;..  /* If 
36640 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e  the caller is an
36650 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
36660 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
36670 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20   is requesting. 
36680 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65   ** to use a one
36690 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c  -pass algorithm,
366a0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
366b0 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  is is appropriat
366c0 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d  e..  ** The one-
366d0 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f  pass algorithm o
366e0 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65  nly works if the
366f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
36700 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74  nstraints.  ** t
36710 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  he statement to 
36720 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20  update a single 
36730 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  row..  */.  asse
36740 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
36750 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
36760 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70  DESIRED)==0 || p
36770 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31  WInfo->nLevel==1
36780 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c   );.  if( (wctrl
36790 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
367a0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d  EPASS_DESIRED)!=
367b0 30 20 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  0 .   && (pWInfo
367c0 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77  ->a[0].pWLoop->w
367d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
367e0 4e 45 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20  NEROW)!=0 ){.   
367f0 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61   pWInfo->okOnePa
36800 73 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e  ss = 1;.    pWIn
36810 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d  fo->a[0].pWLoop-
36820 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  >wsFlags &= ~WHE
36830 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d  RE_IDX_ONLY;.  }
36840 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20  ..  /* Open all 
36850 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54  tables in the pT
36860 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69  abList and any i
36870 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20  ndices selected 
36880 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69  for.  ** searchi
36890 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e  ng those tables.
368a0 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
368b0 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
368c0 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76    for(ii=0, pLev
368d0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69  el=pWInfo->a; ii
368e0 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c  <nTabList; ii++,
368f0 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
36900 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
36910 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
36920 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  n */.    int iDb
36930 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
36940 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
36950 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
36960 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72  index */.    str
36970 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
36980 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20   *pTabItem;..   
36990 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
369a0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
369b0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61  >iFrom];.    pTa
369c0 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
369d0 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ab;.    iDb = sq
369e0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
369f0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
36a00 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  hema);.    pLoop
36a10 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
36a20 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  p;.    if( (pTab
36a30 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
36a40 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
36a50 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
36a60 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
36a70 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c  thing */.    }el
36a80 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
36a90 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
36aa0 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  BLE.    if( (pLo
36ab0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
36ac0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
36ad0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
36ae0 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20  nst char *pVTab 
36af0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
36b00 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
36b10 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
36b20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61    int iCur = pTa
36b30 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
36b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
36b50 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f  eAddOp4(v, OP_VO
36b60 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c  pen, iCur, 0, 0,
36b70 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29   pVTab, P4_VTAB)
36b80 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
36b90 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
36ba0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70  ){.      /* noop
36bb0 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   */.    }else.#e
36bc0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c  ndif.    if( (pL
36bd0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
36be0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
36bf0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77  0.         && (w
36c00 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
36c10 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
36c20 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  E)==0 ){.      i
36c30 6e 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  nt op = pWInfo->
36c40 6f 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f  okOnePass ? OP_O
36c50 70 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70  penWrite : OP_Op
36c60 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 73 71  enRead;.      sq
36c70 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
36c80 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Parse, pTabItem-
36c90 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70  >iCursor, iDb, p
36ca0 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20  Tab, op);.      
36cb0 74 65 73 74 63 61 73 65 28 20 21 70 57 49 6e 66  testcase( !pWInf
36cc0 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
36cd0 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  pTab->nCol==BMS-
36ce0 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
36cf0 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b  ase( !pWInfo->ok
36d00 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d  OnePass && pTab-
36d10 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nCol==BMS );.  
36d20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
36d30 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
36d40 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a  ab->nCol<BMS ){.
36d50 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
36d60 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
36d70 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
36d80 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
36d90 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
36da0 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
36db0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
36dc0 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33  ngeP4(v, sqlite3
36dd0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
36de0 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  v)-1, .         
36df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e00 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f     SQLITE_INT_TO
36e10 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33  _PTR(n), P4_INT3
36e20 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
36e30 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
36e40 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
36e50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
36e60 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
36e70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
36e80 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
36e90 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  >zName);.    }.#
36ea0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36eb0 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
36ec0 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  EX.    if( (pLoo
36ed0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
36ee0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
36ef0 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
36f00 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  ructAutomaticInd
36f10 65 78 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e  ex(pParse, &pWIn
36f20 66 6f 2d 3e 73 57 43 2c 20 70 54 61 62 49 74 65  fo->sWC, pTabIte
36f30 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  m, notReady, pLe
36f40 76 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  vel);.    }else.
36f50 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
36f60 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
36f70 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b  WHERE_INDEXED ){
36f80 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
36f90 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
36fa0 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  ee.pIndex;.     
36fb0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d   KeyInfo *pKey =
36fc0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
36fd0 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78  info(pParse, pIx
36fe0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 4d  );.      /* FIXM
36ff0 45 3a 20 20 41 73 20 61 6e 20 6f 70 74 69 6d 69  E:  As an optimi
37000 7a 61 74 69 6f 6e 20 75 73 65 20 70 54 61 62 49  zation use pTabI
37010 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 69 66 20  tem->iCursor if 
37020 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 2a  WHERE_IDX_ONLY *
37030 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64  /.      int iInd
37040 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  exCur = pLevel->
37050 69 49 64 78 43 75 72 20 3d 20 69 49 64 78 43 75  iIdxCur = iIdxCu
37060 72 20 3f 20 69 49 64 78 43 75 72 20 3a 20 70 50  r ? iIdxCur : pP
37070 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
37080 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
37090 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
370a0 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
370b0 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43   assert( iIndexC
370c0 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ur>=0 );.      s
370d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
370e0 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
370f0 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d   iIndexCur, pIx-
37100 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20  >tnum, iDb,.    
37110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37120 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c      (char*)pKey,
37130 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
37140 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65  OFF);.      Vdbe
37150 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
37160 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
37170 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
37180 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
37190 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
371a0 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20      notReady &= 
371b0 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  ~getMask(&pWInfo
371c0 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  ->sMaskSet, pTab
371d0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
371e0 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54    }.  pWInfo->iT
371f0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
37200 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
37210 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
37220 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
37230 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a  ereBeginError;..
37240 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
37250 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
37260 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69   search.  Each i
37270 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
37280 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65  for.  ** loop be
37290 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f  low generates co
372a0 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
372b0 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
372c0 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72  he VM.  ** progr
372d0 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  am..  */.  notRe
372e0 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
372f0 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
37300 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b  i<nTabList; ii++
37310 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
37320 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a  &pWInfo->a[ii];.
37330 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63      explainOneSc
37340 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  an(pParse, pTabL
37350 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c  ist, pLevel, ii,
37360 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20   pLevel->iFrom, 
37370 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20  wctrlFlags);.   
37380 20 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65   notReady = code
37390 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49  OneLoopStart(pWI
373a0 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64  nfo, ii, notRead
373b0 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  y);.    pWInfo->
373c0 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76  iContinue = pLev
373d0 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20  el->addrCont;.  
373e0 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f  }..  /* Done. */
373f0 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
37400 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
37410 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e if malloc fail
37420 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45  s */.whereBeginE
37430 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e  rror:.  if( pWIn
37440 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  fo ){.    pParse
37450 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
37460 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
37470 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72  ryLoop;.    wher
37480 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
37490 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Info);.  }.  ret
374a0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
374b0 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64  Generate the end
374c0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f   of the WHERE lo
374d0 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74  op.  See comment
374e0 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s on .** sqlite3
374f0 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72  WhereBegin() for
37500 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
37510 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  rmation..*/.void
37520 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
37530 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
37540 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  fo){.  Parse *pP
37550 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
37560 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76  Parse;.  Vdbe *v
37570 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
37580 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  ;.  int i;.  Whe
37590 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
375a0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
375b0 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  oop;.  SrcList *
375c0 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
375d0 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
375e0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
375f0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47  rse->db;..  /* G
37600 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72  enerate loop ter
37610 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20  mination code.. 
37620 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
37630 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
37640 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49  se);.  for(i=pWI
37650 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69  nfo->nLevel-1; i
37660 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  >=0; i--){.    p
37670 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
37680 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70  >a[i];.    pLoop
37690 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
376a0 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  p;.    sqlite3Vd
376b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
376c0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  , pLevel->addrCo
376d0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  nt);.    if( pLe
376e0 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70  vel->op!=OP_Noop
376f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
37700 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70  3VdbeAddOp2(v, p
37710 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65  Level->op, pLeve
37720 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->p1, pLevel->p
37730 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
37740 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
37750 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20   pLevel->p5);.  
37760 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
37770 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
37780 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c  RE_IN_ABLE && pL
37790 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30  evel->u.in.nIn>0
377a0 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
377b0 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20   InLoop *pIn;.  
377c0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
377d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
377e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
377f0 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20  el->addrNxt);.  
37800 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c      for(j=pLevel
37810 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d  ->u.in.nIn, pIn=
37820 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  &pLevel->u.in.aI
37830 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b  nLoop[j-1]; j>0;
37840 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20   j--, pIn--){.  
37850 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37860 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
37870 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a  ->addrInTop+1);.
37880 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
37890 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e  dbeAddOp2(v, pIn
378a0 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49  ->eEndLoopOp, pI
378b0 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64  n->iCur, pIn->ad
378c0 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  drInTop);.      
378d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
378e0 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
378f0 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20  drInTop-1);.    
37900 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
37910 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76  3DbFree(db, pLev
37920 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
37930 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
37940 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
37950 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
37960 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66  addrBrk);.    if
37970 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
37980 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  oin ){.      int
37990 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64   addr;.      add
379a0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
379b0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
379c0 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  s, pLevel->iLeft
379d0 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  Join);.      ass
379e0 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
379f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
37a00 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
37a10 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e       || (pLoop->
37a20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
37a30 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20  INDEXED)!=0 );. 
37a40 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d       if( (pLoop-
37a50 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
37a60 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
37a70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37a80 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
37a90 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69  _NullRow, pTabLi
37aa0 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
37ab0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
37ac0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
37ad0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
37ae0 58 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73  XED ){.        s
37af0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
37b00 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
37b10 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
37b20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37b30 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  if( pLevel->op==
37b40 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20  OP_Return ){.   
37b50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37b60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
37b70 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  ub, pLevel->p1, 
37b80 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
37b90 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
37ba0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37bb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
37bc0 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c  _Goto, 0, pLevel
37bd0 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  ->addrFirst);.  
37be0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
37bf0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
37c00 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a  v, addr);.    }.
37c10 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62    }..  /* The "b
37c20 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68  reak" point is h
37c30 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74  ere, just past t
37c40 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75  he end of the ou
37c50 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53  ter loop..  ** S
37c60 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  et it..  */.  sq
37c70 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
37c80 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d  Label(v, pWInfo-
37c90 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20  >iBreak);..  /* 
37ca0 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65  Close all of the
37cb0 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65   cursors that we
37cc0 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c  re opened by sql
37cd0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a  ite3WhereBegin..
37ce0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
37cf0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70  WInfo->nLevel<=p
37d00 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
37d10 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
37d20 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
37d30 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
37d40 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
37d50 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
37d60 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
37d70 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
37d80 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
37d90 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
37da0 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  rom];.    Table 
37db0 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
37dc0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
37dd0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
37de0 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
37df0 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69  l->pWLoop;.    i
37e00 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
37e10 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
37e20 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54  l)==0.     && pT
37e30 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20  ab->pSelect==0. 
37e40 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
37e50 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
37e60 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
37e70 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  SE)==0.    ){.  
37e80 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f      int ws = pLo
37e90 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20  op->wsFlags;.   
37ea0 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e     if( !pWInfo->
37eb0 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 77 73  okOnePass && (ws
37ec0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
37ed0 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
37ee0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37ef0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
37f00 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
37f10 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
37f20 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52    if( (ws & WHER
37f30 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26  E_INDEXED)!=0 &&
37f40 20 28 77 73 20 26 20 28 57 48 45 52 45 5f 49 50   (ws & (WHERE_IP
37f50 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  K|WHERE_AUTO_IND
37f60 45 58 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  EX))==0 ){.     
37f70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37f80 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
37f90 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
37fa0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
37fb0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
37fc0 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69  s scan uses an i
37fd0 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20  ndex, make VDBE 
37fe0 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f  code substitutio
37ff0 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a  ns to read data.
38000 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
38010 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
38020 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
38030 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20  where possible. 
38040 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20   In some cases. 
38050 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d     ** this optim
38060 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73  ization prevents
38070 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
38080 65 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c  ever being read,
38090 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a   which can.    *
380a0 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66  * yield a signif
380b0 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63  icant performanc
380c0 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20  e boost..    ** 
380d0 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f  .    ** Calls to
380e0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
380f0 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73  tor in between s
38100 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
38110 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69   and.    ** sqli
38120 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c  te3WhereEnd will
38130 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f   have created co
38140 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  de that referenc
38150 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  es the table.   
38160 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54   ** directly.  T
38170 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61  his loop scans a
38180 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f  ll that code loo
38190 6b 69 6e 67 20 66 6f 72 2