/ Hex Artifact Content
Login

Artifact 05cf31505dd514d1e27075ae5ef23a23a3462231:


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 69 6e  d in a 16-bit in
07a0: 74 65 67 65 72 20 77 69 74 68 6f 75 74 20 72 69  teger without ri
07b0: 73 6b 0a 2a 2a 20 6f 66 20 6f 76 65 72 66 6c 6f  sk.** of overflo
07c0: 77 2e 0a 2a 2a 0a 2a 2a 20 43 6f 73 74 73 20 61  w..**.** Costs a
07d0: 72 65 20 65 73 74 69 6d 61 74 65 73 2c 20 73 6f  re estimates, so
07e0: 20 6e 6f 20 65 66 66 6f 72 74 20 69 73 20 6d 61   no effort is ma
07f0: 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 31 30  de to compute 10
0800: 2a 6c 6f 67 32 28 58 29 20 65 78 61 63 74 6c 79  *log2(X) exactly
0810: 2e 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 61 20  ..** Instead, a 
0820: 63 6c 6f 73 65 20 65 73 74 69 6d 61 74 65 20 69  close estimate i
0830: 73 20 75 73 65 64 2e 20 20 41 6e 79 20 76 61 6c  s used.  Any val
0840: 75 65 20 6f 66 20 58 3d 31 20 69 73 20 73 74 6f  ue of X=1 is sto
0850: 72 65 64 20 61 73 20 30 2e 0a 2a 2a 20 58 3d 32  red as 0..** X=2
0860: 20 69 73 20 31 30 2e 20 20 58 3d 33 20 69 73 20   is 10.  X=3 is 
0870: 31 36 2e 20 20 58 3d 31 30 30 30 20 69 73 20 39  16.  X=1000 is 9
0880: 39 2e 20 65 74 63 2e 20 20 4e 65 67 61 74 69 76  9. etc.  Negativ
0890: 65 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 6c  e values are all
08a0: 6f 77 65 64 2e 0a 2a 2a 20 41 20 57 68 65 72 65  owed..** A Where
08b0: 43 6f 73 74 20 6f 66 20 2d 31 30 20 6d 65 61 6e  Cost of -10 mean
08c0: 73 20 30 2e 35 2e 20 20 57 68 65 72 65 43 6f 73  s 0.5.  WhereCos
08d0: 74 20 6f 66 20 2d 32 30 20 6d 65 61 6e 73 20 30  t of -20 means 0
08e0: 2e 32 35 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  .25.  And so for
08f0: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 6f  th..**.** The to
0900: 6f 6c 2f 77 68 65 72 65 63 6f 73 74 74 65 73 74  ol/wherecosttest
0910: 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 69  .c source file i
0920: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 63 6f 6d 6d  mplements a comm
0930: 61 6e 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d  and-line program
0940: 0a 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 63 6f  .** that will co
0950: 6e 76 65 72 74 20 57 68 65 72 65 43 6f 73 74 73  nvert WhereCosts
0960: 20 74 6f 20 69 6e 74 65 67 65 72 73 2c 20 63 6f   to integers, co
0970: 6e 76 65 72 74 20 69 6e 74 65 67 65 72 73 20 74  nvert integers t
0980: 6f 20 57 68 65 72 65 43 6f 73 74 73 0a 2a 2a 20  o WhereCosts.** 
0990: 61 6e 64 20 64 6f 20 61 64 64 69 74 69 6f 6e 20  and do addition 
09a0: 61 6e 64 20 6d 75 6c 74 69 70 6c 69 63 61 74 69  and multiplicati
09b0: 6f 6e 20 6f 6e 20 57 68 65 72 65 43 6f 73 74 20  on on WhereCost 
09c0: 76 61 6c 75 65 73 2e 20 20 54 68 65 20 77 68 65  values.  The whe
09d0: 72 65 63 6f 73 74 74 65 73 74 0a 2a 2a 20 63 6f  recosttest.** co
09e0: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 70 72 6f 67 72  mmand-line progr
09f0: 61 6d 20 69 73 20 61 20 75 73 65 66 75 6c 20 75  am is a useful u
0a00: 74 69 6c 69 74 79 20 74 6f 20 68 61 76 65 20 61  tility to have a
0a10: 72 6f 75 6e 64 20 77 68 65 6e 20 77 6f 72 6b 69  round when worki
0a20: 6e 67 20 77 69 74 68 0a 2a 2a 20 74 68 69 73 20  ng with.** this 
0a30: 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64  module..*/.typed
0a40: 65 66 20 73 68 6f 72 74 20 69 6e 74 20 57 68 65  ef short int Whe
0a50: 72 65 43 6f 73 74 3b 0a 0a 2f 2a 0a 2a 2a 20 54  reCost;../*.** T
0a60: 68 69 73 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  his object conta
0a70: 69 6e 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ins information 
0a80: 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
0a90: 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  ent a single nes
0aa0: 74 65 64 0a 2a 2a 20 6c 6f 6f 70 20 69 6e 20 57  ted.** loop in W
0ab0: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
0ac0: 2a 2a 20 43 6f 6e 74 72 61 73 74 20 74 68 69 73  ** Contrast this
0ad0: 20 6f 62 6a 65 63 74 20 77 69 74 68 20 57 68 65   object with Whe
0ae0: 72 65 4c 6f 6f 70 2e 20 20 54 68 69 73 20 6f 62  reLoop.  This ob
0af0: 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20 74  ject describes t
0b00: 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  he.** implementa
0b10: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
0b20: 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 64 65 73  .  WhereLoop des
0b30: 63 72 69 62 65 73 20 74 68 65 20 61 6c 67 6f 72  cribes the algor
0b40: 69 74 68 6d 2e 0a 2a 2a 20 54 68 69 73 20 6f 62  ithm..** This ob
0b50: 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  ject contains a 
0b60: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 57  pointer to the W
0b70: 68 65 72 65 4c 6f 6f 70 20 61 6c 67 6f 72 69 74  hereLoop algorit
0b80: 68 6d 20 61 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20  hm as one of.** 
0b90: 69 74 73 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2a  its elements..**
0ba0: 0a 2a 2a 20 54 68 65 20 57 68 65 72 65 49 6e 66  .** The WhereInf
0bb0: 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  o object contain
0bc0: 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  s a single insta
0bd0: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
0be0: 63 74 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 74  ct for.** each t
0bf0: 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  erm in the FROM 
0c00: 63 6c 61 75 73 65 20 28 77 68 69 63 68 20 69 73  clause (which is
0c10: 20 74 6f 20 73 61 79 2c 20 66 6f 72 20 65 61 63   to say, for eac
0c20: 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 65 73 74  h of the.** nest
0c30: 65 64 20 6c 6f 6f 70 73 20 61 73 20 69 6d 70 6c  ed loops as impl
0c40: 65 6d 65 6e 74 65 64 29 2e 20 20 54 68 65 20 6f  emented).  The o
0c50: 72 64 65 72 20 6f 66 20 57 68 65 72 65 4c 65 76  rder of WhereLev
0c60: 65 6c 20 6f 62 6a 65 63 74 73 20 64 65 74 65 72  el objects deter
0c70: 6d 69 6e 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 6f  mines.** the loo
0c80: 70 20 6e 65 73 74 65 64 20 6f 72 64 65 72 2c 20  p nested order, 
0c90: 77 69 74 68 20 57 68 65 72 65 49 6e 66 6f 2e 61  with WhereInfo.a
0ca0: 5b 30 5d 20 62 65 69 6e 67 20 74 68 65 20 6f 75  [0] being the ou
0cb0: 74 65 72 20 6c 6f 6f 70 20 61 6e 64 0a 2a 2a 20  ter loop and.** 
0cc0: 57 68 65 72 65 49 6e 66 6f 2e 61 5b 57 68 65 72  WhereInfo.a[Wher
0cd0: 65 49 6e 66 6f 2e 6e 4c 65 76 65 6c 2d 31 5d 20  eInfo.nLevel-1] 
0ce0: 62 65 69 6e 67 20 74 68 65 20 69 6e 6e 65 72 20  being the inner 
0cf0: 6c 6f 6f 70 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  loop..*/.struct 
0d00: 57 68 65 72 65 4c 65 76 65 6c 20 7b 0a 20 20 69  WhereLevel {.  i
0d10: 6e 74 20 69 4c 65 66 74 4a 6f 69 6e 3b 20 20 20  nt iLeftJoin;   
0d20: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
0d30: 65 6c 6c 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  ell used to impl
0d40: 65 6d 65 6e 74 20 4c 45 46 54 20 4f 55 54 45 52  ement LEFT OUTER
0d50: 20 4a 4f 49 4e 20 2a 2f 0a 20 20 69 6e 74 20 69   JOIN */.  int i
0d60: 54 61 62 43 75 72 3b 20 20 20 20 20 20 20 20 20  TabCur;         
0d70: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72   /* The VDBE cur
0d80: 73 6f 72 20 75 73 65 64 20 74 6f 20 61 63 63 65  sor used to acce
0d90: 73 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  ss the table */.
0da0: 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20    int iIdxCur;  
0db0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
0dc0: 44 42 45 20 63 75 72 73 6f 72 20 75 73 65 64 20  DBE cursor used 
0dd0: 74 6f 20 61 63 63 65 73 73 20 70 49 64 78 20 2a  to access pIdx *
0de0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b  /.  int addrBrk;
0df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
0e00: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
0e10: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
0e20: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74  */.  int addrNxt
0e30: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ;          /* Ju
0e40: 6d 70 20 68 65 72 65 20 74 6f 20 73 74 61 72 74  mp here to start
0e50: 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 6f 6d   the next IN com
0e60: 62 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  bination */.  in
0e70: 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20  t addrCont;     
0e80: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
0e90: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
0ea0: 68 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 20  h the next loop 
0eb0: 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  cycle */.  int a
0ec0: 64 64 72 46 69 72 73 74 3b 20 20 20 20 20 20 20  ddrFirst;       
0ed0: 20 2f 2a 20 46 69 72 73 74 20 69 6e 73 74 72 75   /* First instru
0ee0: 63 74 69 6f 6e 20 6f 66 20 69 6e 74 65 72 69 6f  ction of interio
0ef0: 72 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  r of the loop */
0f00: 0a 20 20 69 6e 74 20 61 64 64 72 42 6f 64 79 3b  .  int addrBody;
0f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
0f20: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 62 6f 64  nning of the bod
0f30: 79 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a  y of this loop *
0f40: 2f 0a 20 20 75 38 20 69 46 72 6f 6d 3b 20 20 20  /.  u8 iFrom;   
0f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
0f60: 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
0f70: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
0f80: 20 75 38 20 6f 70 2c 20 70 35 3b 20 20 20 20 20   u8 op, p5;     
0f90: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
0fa0: 20 61 6e 64 20 50 35 20 6f 66 20 74 68 65 20 6f   and P5 of the o
0fb0: 70 63 6f 64 65 20 74 68 61 74 20 65 6e 64 73 20  pcode that ends 
0fc0: 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
0fd0: 74 20 70 31 2c 20 70 32 3b 20 20 20 20 20 20 20  t p1, p2;       
0fe0: 20 20 20 20 2f 2a 20 4f 70 65 72 61 6e 64 73 20      /* Operands 
0ff0: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 75 73  of the opcode us
1000: 65 64 20 74 6f 20 65 6e 64 73 20 74 68 65 20 6c  ed to ends the l
1010: 6f 6f 70 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b  oop */.  union {
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1030: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  * Information th
1040: 61 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 70 57  at depends on pW
1050: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 2a 2f  Loop->wsFlags */
1060: 0a 20 20 20 20 73 74 72 75 63 74 20 7b 0a 20 20  .    struct {.  
1070: 20 20 20 20 69 6e 74 20 6e 49 6e 3b 20 20 20 20      int nIn;    
1080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1090: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
10a0: 6e 20 61 49 6e 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  n aInLoop[] */. 
10b0: 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f       struct InLo
10c0: 6f 70 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  op {.        int
10d0: 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
10e0: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
10f0: 63 75 72 73 6f 72 20 75 73 65 64 20 62 79 20 74  cursor used by t
1100: 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  his IN operator 
1110: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  */.        int a
1120: 64 64 72 49 6e 54 6f 70 3b 20 20 20 20 20 20 20  ddrInTop;       
1130: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
1140: 49 4e 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  IN loop */.     
1150: 20 20 20 75 38 20 65 45 6e 64 4c 6f 6f 70 4f 70     u8 eEndLoopOp
1160: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 20  ;         /* IN 
1170: 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 6f 72 2e  Loop terminator.
1180: 20 4f 50 5f 4e 65 78 74 20 6f 72 20 4f 50 5f 50   OP_Next or OP_P
1190: 72 65 76 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2a  rev */.      } *
11a0: 61 49 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  aInLoop;        
11b0: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
11c0: 6e 20 61 62 6f 75 74 20 65 61 63 68 20 6e 65 73  n about each nes
11d0: 74 65 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  ted IN operator 
11e0: 2a 2f 0a 20 20 20 20 7d 20 69 6e 3b 20 20 20 20  */.    } in;    
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1200: 55 73 65 64 20 77 68 65 6e 20 70 57 4c 6f 6f 70  Used when pWLoop
1210: 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
1220: 49 4e 5f 41 42 4c 45 20 2a 2f 0a 20 20 20 20 49  IN_ABLE */.    I
1230: 6e 64 65 78 20 2a 70 43 6f 76 69 64 78 3b 20 20  ndex *pCovidx;  
1240: 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 65       /* Possible
1250: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
1260: 66 6f 72 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  for WHERE_MULTI_
1270: 4f 52 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 73  OR */.  } u;.  s
1280: 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 20  truct WhereLoop 
1290: 2a 70 57 4c 6f 6f 70 3b 20 20 2f 2a 20 54 68 65  *pWLoop;  /* The
12a0: 20 73 65 6c 65 63 74 65 64 20 57 68 65 72 65 4c   selected WhereL
12b0: 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
12c0: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
12d0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52  ;          /* FR
12e0: 4f 4d 20 65 6e 74 72 69 65 73 20 6e 6f 74 20 75  OM entries not u
12f0: 73 61 62 6c 65 20 61 74 20 74 68 69 73 20 6c 65  sable at this le
1300: 76 65 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  vel */.};../*.**
1310: 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
1320: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 72 65  f this object re
1330: 70 72 65 73 65 6e 74 73 20 61 6e 20 61 6c 67 6f  presents an algo
1340: 72 69 74 68 6d 20 66 6f 72 20 65 76 61 6c 75 61  rithm for evalua
1350: 74 69 6e 67 20 6f 6e 65 0a 2a 2a 20 74 65 72 6d  ting one.** term
1360: 20 6f 66 20 61 20 6a 6f 69 6e 2e 20 20 45 76 65   of a join.  Eve
1370: 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  ry term of the F
1380: 52 4f 4d 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  ROM clause will 
1390: 68 61 76 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  have at least.**
13a0: 20 6f 6e 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   one correspondi
13b0: 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ng WhereLoop obj
13c0: 65 63 74 20 28 75 6e 6c 65 73 73 20 49 4e 44 45  ect (unless INDE
13d0: 58 45 44 20 42 59 20 63 6f 6e 73 74 72 61 69 6e  XED BY constrain
13e0: 74 73 0a 2a 2a 20 70 72 65 76 65 6e 74 20 61 20  ts.** prevent a 
13f0: 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 20 2d  query solution -
1400: 20 77 68 69 63 68 20 69 73 20 61 6e 20 65 72 72   which is an err
1410: 6f 72 29 20 61 6e 64 20 6d 61 6e 79 20 74 65 72  or) and many ter
1420: 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 46 52 4f  ms of the.** FRO
1430: 4d 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 68 61  M clause will ha
1440: 76 65 20 6d 75 6c 74 69 70 6c 65 20 57 68 65 72  ve multiple Wher
1450: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 2c 20 65  eLoop objects, e
1460: 61 63 68 20 64 65 73 63 72 69 62 69 6e 67 20 61  ach describing a
1470: 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 20 77 61  .** potential wa
1480: 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  y of implementin
1490: 67 20 74 68 61 74 20 46 52 4f 4d 2d 63 6c 61 75  g that FROM-clau
14a0: 73 65 20 74 65 72 6d 2c 20 74 6f 67 65 74 68 65  se term, togethe
14b0: 72 20 77 69 74 68 0a 2a 2a 20 64 65 70 65 6e 64  r with.** depend
14c0: 65 6e 63 69 65 73 20 61 6e 64 20 63 6f 73 74 20  encies and cost 
14d0: 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20 75 73  estimates for us
14e0: 69 6e 67 20 74 68 65 20 63 68 6f 73 65 6e 20 61  ing the chosen a
14f0: 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20  lgorithm..**.** 
1500: 51 75 65 72 79 20 70 6c 61 6e 6e 69 6e 67 20 63  Query planning c
1510: 6f 6e 73 69 73 74 73 20 6f 66 20 62 75 69 6c 64  onsists of build
1520: 69 6e 67 20 75 70 20 61 20 63 6f 6c 6c 65 63 74  ing up a collect
1530: 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 68 65  ion of these Whe
1540: 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 62 6a 65 63 74  reLoop.** object
1550: 73 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 69 6e  s, then computin
1560: 67 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 73  g a particular s
1570: 65 71 75 65 6e 63 65 20 6f 66 20 57 68 65 72 65  equence of Where
1580: 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 2c 20 77 69  Loop objects, wi
1590: 74 68 0a 2a 2a 20 6f 6e 65 20 57 68 65 72 65 4c  th.** one WhereL
15a0: 6f 6f 70 20 6f 62 6a 65 63 74 20 70 65 72 20 46  oop object per F
15b0: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2c  ROM clause term,
15c0: 20 74 68 61 74 20 73 61 74 69 73 66 79 20 61 6c   that satisfy al
15d0: 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 2a  l dependencies.*
15e0: 2a 20 61 6e 64 20 74 68 61 74 20 6d 69 6e 69 6d  * and that minim
15f0: 69 7a 65 20 74 68 65 20 6f 76 65 72 61 6c 6c 20  ize the overall 
1600: 63 6f 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  cost..*/.struct 
1610: 57 68 65 72 65 4c 6f 6f 70 20 7b 0a 20 20 42 69  WhereLoop {.  Bi
1620: 74 6d 61 73 6b 20 70 72 65 72 65 71 3b 20 20 20  tmask prereq;   
1630: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f      /* Bitmask o
1640: 66 20 6f 74 68 65 72 20 6c 6f 6f 70 73 20 74 68  f other loops th
1650: 61 74 20 6d 75 73 74 20 72 75 6e 20 66 69 72 73  at must run firs
1660: 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  t */.  Bitmask m
1670: 61 73 6b 53 65 6c 66 3b 20 20 20 20 20 2f 2a 20  askSelf;     /* 
1680: 42 69 74 6d 61 73 6b 20 69 64 65 6e 74 69 66 79  Bitmask identify
1690: 69 6e 67 20 74 61 62 6c 65 20 69 54 61 62 20 2a  ing table iTab *
16a0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
16b0: 44 45 42 55 47 0a 20 20 63 68 61 72 20 63 49 64  DEBUG.  char cId
16c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16d0: 20 53 79 6d 62 6f 6c 69 63 20 49 44 20 6f 66 20   Symbolic ID of 
16e0: 74 68 69 73 20 6c 6f 6f 70 20 66 6f 72 20 64 65  this loop for de
16f0: 62 75 67 67 69 6e 67 20 75 73 65 20 2a 2f 0a 23  bugging use */.#
1700: 65 6e 64 69 66 0a 20 20 75 38 20 69 54 61 62 3b  endif.  u8 iTab;
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1720: 20 50 6f 73 69 74 69 6f 6e 20 69 6e 20 46 52 4f   Position in FRO
1730: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 61 62 6c  M clause of tabl
1740: 65 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20  e for this loop 
1750: 2a 2f 0a 20 20 75 38 20 69 53 6f 72 74 49 64 78  */.  u8 iSortIdx
1760: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  ;          /* So
1770: 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 75 6d 62  rting index numb
1780: 65 72 2e 20 20 30 3d 3d 4e 6f 6e 65 20 2a 2f 0a  er.  0==None */.
1790: 20 20 57 68 65 72 65 43 6f 73 74 20 72 53 65 74    WhereCost rSet
17a0: 75 70 3b 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74  up;     /* One-t
17b0: 69 6d 65 20 73 65 74 75 70 20 63 6f 73 74 20 28  ime setup cost (
17c0: 65 78 3a 20 63 72 65 61 74 65 20 74 72 61 6e 73  ex: create trans
17d0: 69 65 6e 74 20 69 6e 64 65 78 29 20 2a 2f 0a 20  ient index) */. 
17e0: 20 57 68 65 72 65 43 6f 73 74 20 72 52 75 6e 3b   WhereCost rRun;
17f0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
1800: 66 20 72 75 6e 6e 69 6e 67 20 65 61 63 68 20 6c  f running each l
1810: 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  oop */.  WhereCo
1820: 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 2f  st nOut;       /
1830: 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  * Estimated numb
1840: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
1850: 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  s */.  union {. 
1860: 20 20 20 73 74 72 75 63 74 20 7b 20 20 20 20 20     struct {     
1870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
1880: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 69 6e 74  ormation for int
1890: 65 72 6e 61 6c 20 62 74 72 65 65 20 74 61 62 6c  ernal btree tabl
18a0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
18b0: 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
18c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18d0: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
18e0: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 49 6e  ints */.      In
18f0: 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
1900: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73       /* Index us
1910: 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ed, or NULL */. 
1920: 20 20 20 7d 20 62 74 72 65 65 3b 0a 20 20 20 20     } btree;.    
1930: 73 74 72 75 63 74 20 7b 20 20 20 20 20 20 20 20  struct {        
1940: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d         /* Inform
1950: 61 74 69 6f 6e 20 66 6f 72 20 76 69 72 74 75 61  ation for virtua
1960: 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  l tables */.    
1970: 20 20 69 6e 74 20 69 64 78 4e 75 6d 3b 20 20 20    int idxNum;   
1980: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1990: 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  x number */.    
19a0: 20 20 75 38 20 6e 65 65 64 46 72 65 65 3b 20 20    u8 needFree;  
19b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
19c0: 20 69 66 20 73 71 6c 69 74 65 33 5f 66 72 65 65   if sqlite3_free
19d0: 28 69 64 78 53 74 72 29 20 69 73 20 6e 65 65 64  (idxStr) is need
19e0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 69  ed */.      u8 i
19f0: 73 4f 72 64 65 72 65 64 3b 20 20 20 20 20 20 20  sOrdered;       
1a00: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 61     /* True if sa
1a10: 74 69 73 66 69 65 73 20 4f 52 44 45 52 20 42 59  tisfies ORDER BY
1a20: 20 2a 2f 0a 20 20 20 20 20 20 75 31 36 20 6f 6d   */.      u16 om
1a30: 69 74 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  itMask;         
1a40: 20 2f 2a 20 54 65 72 6d 73 20 74 68 61 74 20 6d   /* Terms that m
1a50: 61 79 20 62 65 20 6f 6d 69 74 74 65 64 20 2a 2f  ay be omitted */
1a60: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 69 64 78  .      char *idx
1a70: 53 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Str;          /*
1a80: 20 49 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65   Index identifie
1a90: 72 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  r string */.    
1aa0: 7d 20 76 74 61 62 3b 0a 20 20 7d 20 75 3b 0a 20  } vtab;.  } u;. 
1ab0: 20 75 33 32 20 77 73 46 6c 61 67 73 3b 20 20 20   u32 wsFlags;   
1ac0: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 5f         /* WHERE_
1ad0: 2a 20 66 6c 61 67 73 20 64 65 73 63 72 69 62 69  * flags describi
1ae0: 6e 67 20 74 68 65 20 70 6c 61 6e 20 2a 2f 0a 20  ng the plan */. 
1af0: 20 75 31 36 20 6e 4c 54 65 72 6d 3b 20 20 20 20   u16 nLTerm;    
1b00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b10: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
1b20: 4c 54 65 72 6d 5b 5d 20 2a 2f 0a 20 20 2f 2a 2a  LTerm[] */.  /**
1b30: 2a 2a 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72  ** whereLoopXfer
1b40: 28 29 20 63 6f 70 69 65 73 20 66 69 65 6c 64 73  () copies fields
1b50: 20 61 62 6f 76 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a   above *********
1b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1b70: 23 20 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4c  # define WHERE_L
1b80: 4f 4f 50 5f 58 46 45 52 5f 53 5a 20 6f 66 66 73  OOP_XFER_SZ offs
1b90: 65 74 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2c 6e  etof(WhereLoop,n
1ba0: 4c 53 6c 6f 74 29 0a 20 20 75 31 36 20 6e 4c 53  LSlot).  u16 nLS
1bb0: 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  lot;           /
1bc0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74  * Number of slot
1bd0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
1be0: 61 4c 54 65 72 6d 5b 5d 20 2a 2f 0a 20 20 57 68  aLTerm[] */.  Wh
1bf0: 65 72 65 54 65 72 6d 20 2a 2a 61 4c 54 65 72 6d  ereTerm **aLTerm
1c00: 3b 20 20 20 2f 2a 20 57 68 65 72 65 54 65 72 6d  ;   /* WhereTerm
1c10: 73 20 75 73 65 64 20 2a 2f 0a 20 20 57 68 65 72  s used */.  Wher
1c20: 65 4c 6f 6f 70 20 2a 70 4e 65 78 74 4c 6f 6f 70  eLoop *pNextLoop
1c30: 3b 20 2f 2a 20 4e 65 78 74 20 57 68 65 72 65 4c  ; /* Next WhereL
1c40: 6f 6f 70 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  oop object in th
1c50: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 2f  e WhereClause */
1c60: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 4c  .  WhereTerm *aL
1c70: 54 65 72 6d 53 70 61 63 65 5b 34 5d 3b 20 20 2f  TermSpace[4];  /
1c80: 2a 20 49 6e 69 74 69 61 6c 20 61 4c 54 65 72 6d  * Initial aLTerm
1c90: 5b 5d 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a  [] space */.};..
1ca0: 2f 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20 68  /* This object h
1cb0: 6f 6c 64 73 20 74 68 65 20 70 72 65 72 65 71 75  olds the prerequ
1cc0: 69 73 69 74 65 73 20 61 6e 64 20 74 68 65 20 63  isites and the c
1cd0: 6f 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 61  ost of running a
1ce0: 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 6e 20  .** subquery on 
1cf0: 6f 6e 65 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  one operand of a
1d00: 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 20 69 6e  n OR operator in
1d10: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1d20: 65 2e 0a 2a 2a 20 53 65 65 20 57 68 65 72 65 4f  e..** See WhereO
1d30: 72 53 65 74 20 66 6f 72 20 61 64 64 69 74 69 6f  rSet for additio
1d40: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
1d50: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
1d60: 4f 72 43 6f 73 74 20 7b 0a 20 20 42 69 74 6d 61  OrCost {.  Bitma
1d70: 73 6b 20 70 72 65 72 65 71 3b 20 20 20 20 20 2f  sk prereq;     /
1d80: 2a 20 50 72 65 72 65 71 75 69 73 69 74 65 73 20  * Prerequisites 
1d90: 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72  */.  WhereCost r
1da0: 52 75 6e 3b 20 20 20 20 20 2f 2a 20 43 6f 73 74  Run;     /* Cost
1db0: 20 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   of running this
1dc0: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 57   subquery */.  W
1dd0: 68 65 72 65 43 6f 73 74 20 6e 4f 75 74 3b 20 20  hereCost nOut;  
1de0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1df0: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 69 73  outputs for this
1e00: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a   subquery */.};.
1e10: 0a 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53  ./* The WhereOrS
1e20: 65 74 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20  et object holds 
1e30: 61 20 73 65 74 20 6f 66 20 70 6f 73 73 69 62 6c  a set of possibl
1e40: 65 20 57 68 65 72 65 4f 72 43 6f 73 74 73 20 74  e WhereOrCosts t
1e50: 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  hat.** correspon
1e60: 64 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  d to the subquer
1e70: 79 28 73 29 20 6f 66 20 4f 52 2d 63 6c 61 75 73  y(s) of OR-claus
1e80: 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 4f  e processing.  O
1e90: 6e 6c 79 20 74 68 65 0a 2a 2a 20 62 65 73 74 20  nly the.** best 
1ea0: 4e 5f 4f 52 5f 43 4f 53 54 20 65 6c 65 6d 65 6e  N_OR_COST elemen
1eb0: 74 73 20 61 72 65 20 72 65 74 61 69 6e 65 64 2e  ts are retained.
1ec0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 4f 52  .*/.#define N_OR
1ed0: 5f 43 4f 53 54 20 33 0a 73 74 72 75 63 74 20 57  _COST 3.struct W
1ee0: 68 65 72 65 4f 72 53 65 74 20 7b 0a 20 20 75 31  hereOrSet {.  u1
1ef0: 36 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  6 n;            
1f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f10: 62 65 72 20 6f 66 20 76 61 6c 69 64 20 61 5b 5d  ber of valid a[]
1f20: 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 57 68   entries */.  Wh
1f30: 65 72 65 4f 72 43 6f 73 74 20 61 5b 4e 5f 4f 52  ereOrCost a[N_OR
1f40: 5f 43 4f 53 54 5d 3b 20 20 20 2f 2a 20 53 65 74  _COST];   /* Set
1f50: 20 6f 66 20 62 65 73 74 20 63 6f 73 74 73 20 2a   of best costs *
1f60: 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72  /.};.../* Forwar
1f70: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66  d declaration of
1f80: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74   methods */.stat
1f90: 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
1fa0: 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c  Resize(sqlite3*,
1fb0: 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74   WhereLoop*, int
1fc0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69  );../*.** Each i
1fd0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
1fe0: 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20 61 20 73  object holds a s
1ff0: 65 71 75 65 6e 63 65 20 6f 66 20 57 68 65 72 65  equence of Where
2000: 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 0a 2a 2a 20  Loop objects.** 
2010: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 73  that implement s
2020: 6f 6d 65 20 6f 72 20 61 6c 6c 20 6f 66 20 61 20  ome or all of a 
2030: 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a  query plan..**.*
2040: 2a 20 54 68 69 6e 6b 20 6f 66 20 65 61 63 68 20  * Think of each 
2050: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2060: 20 61 73 20 61 20 6e 6f 64 65 20 69 6e 20 61 20   as a node in a 
2070: 67 72 61 70 68 20 77 69 74 68 20 61 72 63 73 0a  graph with arcs.
2080: 2a 2a 20 73 68 6f 77 69 6e 67 20 64 65 70 65 6e  ** showing depen
2090: 64 65 6e 63 69 65 73 20 61 6e 64 20 63 6f 73 74  dencies and cost
20a0: 73 20 66 6f 72 20 74 72 61 76 65 6c 6c 69 6e 67  s for travelling
20b0: 20 62 65 74 77 65 65 6e 20 6e 6f 64 65 73 2e 20   between nodes. 
20c0: 20 28 54 68 61 74 20 69 73 0a 2a 2a 20 6e 6f 74   (That is.** not
20d0: 20 61 20 63 6f 6d 70 6c 65 74 65 6c 79 20 61 63   a completely ac
20e0: 63 75 72 61 74 65 20 64 65 73 63 72 69 70 74 69  curate descripti
20f0: 6f 6e 20 62 65 63 61 75 73 65 20 57 68 65 72 65  on because Where
2100: 4c 6f 6f 70 20 63 6f 73 74 73 20 61 72 65 20 61  Loop costs are a
2110: 0a 2a 2a 20 76 65 63 74 6f 72 2c 20 6e 6f 74 20  .** vector, not 
2120: 61 20 73 63 61 6c 61 72 2c 20 61 6e 64 20 62 65  a scalar, and be
2130: 63 61 75 73 65 20 64 65 70 65 6e 64 65 6e 63 69  cause dependenci
2140: 65 73 20 61 72 65 20 6d 61 6e 79 2d 74 6f 2d 6f  es are many-to-o
2150: 6e 65 2c 20 6e 6f 74 0a 2a 2a 20 6f 6e 65 2d 74  ne, not.** one-t
2160: 6f 2d 6f 6e 65 20 61 73 20 61 72 65 20 67 72 61  o-one as are gra
2170: 70 68 20 6e 6f 64 65 73 2e 20 20 42 75 74 20 69  ph nodes.  But i
2180: 74 20 69 73 20 61 20 75 73 65 66 75 6c 20 76 69  t is a useful vi
2190: 73 75 61 6c 69 7a 61 74 69 6f 6e 20 61 69 64 2e  sualization aid.
21a0: 29 0a 2a 2a 20 54 68 65 6e 20 61 20 57 68 65 72  ).** Then a Wher
21b0: 65 50 61 74 68 20 6f 62 6a 65 63 74 20 69 73 20  ePath object is 
21c0: 61 20 70 61 74 68 20 74 68 72 6f 75 67 68 20 74  a path through t
21d0: 68 65 20 67 72 61 70 68 20 74 68 61 74 20 76 69  he graph that vi
21e0: 73 69 74 73 20 73 6f 6d 65 0a 2a 2a 20 6f 72 20  sits some.** or 
21f0: 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65  all of the Where
2200: 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 6f 6e 63  Loop objects onc
2210: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 73 6f  e..**.** The "so
2220: 6c 76 65 72 22 20 77 6f 72 6b 73 20 62 79 20 63  lver" works by c
2230: 72 65 61 74 69 6e 67 20 74 68 65 20 4e 20 62 65  reating the N be
2240: 73 74 20 57 68 65 72 65 50 61 74 68 20 6f 62 6a  st WherePath obj
2250: 65 63 74 73 20 6f 66 20 6c 65 6e 67 74 68 0a 2a  ects of length.*
2260: 2a 20 31 2e 20 20 54 68 65 6e 20 75 73 69 6e 67  * 1.  Then using
2270: 20 74 68 6f 73 65 20 61 73 20 61 20 62 61 73 69   those as a basi
2280: 73 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  s to compute the
2290: 20 4e 20 62 65 73 74 20 57 68 65 72 65 50 61 74   N best WherePat
22a0: 68 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 6f 66 20  h objects.** of 
22b0: 6c 65 6e 67 74 68 20 32 2e 20 20 41 6e 64 20 73  length 2.  And s
22c0: 6f 20 66 6f 72 74 68 20 75 6e 74 69 6c 20 74 68  o forth until th
22d0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 57 68 65 72  e length of Wher
22e0: 65 50 61 74 68 73 20 65 71 75 61 6c 73 20 74 68  ePaths equals th
22f0: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6e  e.** number of n
2300: 6f 64 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  odes in the FROM
2310: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 62 65   clause.  The be
2320: 73 74 20 28 6c 6f 77 65 73 74 20 63 6f 73 74 29  st (lowest cost)
2330: 20 57 68 65 72 65 50 61 74 68 0a 2a 2a 20 61 74   WherePath.** at
2340: 20 74 68 65 20 65 6e 64 20 69 73 20 74 68 65 20   the end is the 
2350: 63 68 6f 6f 73 65 6e 20 71 75 65 72 79 20 70 6c  choosen query pl
2360: 61 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  an..*/.struct Wh
2370: 65 72 65 50 61 74 68 20 7b 0a 20 20 42 69 74 6d  erePath {.  Bitm
2380: 61 73 6b 20 6d 61 73 6b 4c 6f 6f 70 3b 20 20 20  ask maskLoop;   
2390: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
23a0: 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
23b0: 6a 65 63 74 73 20 69 6e 20 74 68 69 73 20 70 61  jects in this pa
23c0: 74 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  th */.  Bitmask 
23d0: 72 65 76 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a  revLoop;      /*
23e0: 20 61 4c 6f 6f 70 5b 5d 73 20 74 68 61 74 20 73   aLoop[]s that s
23f0: 68 6f 75 6c 64 20 62 65 20 72 65 76 65 72 73 65  hould be reverse
2400: 64 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20 2a  d for ORDER BY *
2410: 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e 52  /.  WhereCost nR
2420: 6f 77 3b 20 20 20 20 20 20 20 2f 2a 20 45 73 74  ow;       /* Est
2430: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
2440: 20 72 6f 77 73 20 67 65 6e 65 72 61 74 65 64 20   rows generated 
2450: 62 79 20 74 68 69 73 20 70 61 74 68 20 2a 2f 0a  by this path */.
2460: 20 20 57 68 65 72 65 43 6f 73 74 20 72 43 6f 73    WhereCost rCos
2470: 74 3b 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  t;      /* Total
2480: 20 63 6f 73 74 20 6f 66 20 74 68 69 73 20 70 61   cost of this pa
2490: 74 68 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64  th */.  u8 isOrd
24a0: 65 72 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  ered;         /*
24b0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 70 61   True if this pa
24c0: 74 68 20 73 61 74 69 73 66 69 65 73 20 4f 52 44  th satisfies ORD
24d0: 45 52 20 42 59 20 2a 2f 0a 20 20 75 38 20 69 73  ER BY */.  u8 is
24e0: 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 20 20 20  OrderedValid;   
24f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
2500: 69 73 4f 72 64 65 72 65 64 20 66 69 65 6c 64 20  isOrdered field 
2510: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 57 68  is valid */.  Wh
2520: 65 72 65 4c 6f 6f 70 20 2a 2a 61 4c 6f 6f 70 3b  ereLoop **aLoop;
2530: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2540: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2550: 73 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  s implementing t
2560: 68 69 73 20 70 61 74 68 20 2a 2f 0a 7d 3b 0a 0a  his path */.};..
2570: 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20  /*.** The query 
2580: 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61  generator uses a
2590: 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61  n array of insta
25a0: 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73 74 72  nces of this str
25b0: 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c  ucture to.** hel
25c0: 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65  p it analyze the
25d0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
25e0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
25f0: 75 73 65 2e 20 20 45 61 63 68 20 57 48 45 52 45  use.  Each WHERE
2600: 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78  .** clause subex
2610: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
2620: 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f  rated from the o
2630: 74 68 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65  thers by AND ope
2640: 72 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c  rators,.** usual
2650: 6c 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73  ly, or sometimes
2660: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
2670: 73 65 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e  separated by OR.
2680: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65  .**.** All Where
2690: 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63  Terms are collec
26a0: 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ted into a singl
26b0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
26c0: 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68  ructure.  .** Th
26d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e  e following iden
26e0: 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a  tity holds:.**.*
26f0: 2a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  *        WhereTe
2700: 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54  rm.pWC->a[WhereT
2710: 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72  erm.idx] == Wher
2720: 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  eTerm.**.** When
2730: 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68   a term is of th
2740: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
2750: 20 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70             X <op
2760: 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77  > <expr>.**.** w
2770: 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75  here X is a colu
2780: 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e  mn name and <op>
2790: 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61   is one of certa
27a0: 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a  in operators,.**
27b0: 20 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e   then WhereTerm.
27c0: 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57  leftCursor and W
27d0: 68 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43  hereTerm.u.leftC
27e0: 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65  olumn record the
27f0: 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  .** cursor numbe
2800: 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d  r and column num
2810: 62 65 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72  ber for X.  Wher
2820: 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20  eTerm.eOperator 
2830: 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c  records.** the <
2840: 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d  op> using a bitm
2850: 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66  ask encoding def
2860: 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62  ined by WO_xxx b
2870: 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73  elow.  The.** us
2880: 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65  e of a bitmask e
2890: 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20  ncoding for the 
28a0: 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20  operator allows 
28b0: 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20  us to search.** 
28c0: 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d  quickly for term
28d0: 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  s that match any
28e0: 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69 66 66   of several diff
28f0: 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e  erent operators.
2900: 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65  .**.** A WhereTe
2910: 72 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  rm might also be
2920: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62   two or more sub
2930: 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
2940: 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  by OR:.**.**    
2950: 20 20 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20       (t1.X <op> 
2960: 3c 65 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59  <expr>) OR (t1.Y
2970: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52   <op> <expr>) OR
2980: 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74   .....**.** In t
2990: 68 69 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c  his second case,
29a0: 20 77 74 46 6c 61 67 20 68 61 73 20 74 68 65 20   wtFlag has the 
29b0: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 62 69 74 20  TERM_ORINFO bit 
29c0: 73 65 74 20 61 6e 64 20 65 4f 70 65 72 61 74 6f  set and eOperato
29d0: 72 3d 3d 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20  r==WO_OR.** and 
29e0: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
29f0: 70 4f 72 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f  pOrInfo field po
2a00: 69 6e 74 73 20 74 6f 20 61 75 78 69 6c 69 61 72  ints to auxiliar
2a10: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  y information th
2a20: 61 74 0a 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74  at.** is collect
2a30: 65 64 20 61 62 6f 75 74 20 74 68 65 20 4f 52 20  ed about the OR 
2a40: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  clause..**.** If
2a50: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
2a60: 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73  HERE clause does
2a70: 20 6e 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65   not match eithe
2a80: 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65  r of the two pre
2a90: 76 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72  vious.** categor
2aa0: 69 65 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61  ies, then eOpera
2ab0: 74 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65  tor==0.  The Whe
2ac0: 72 65 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65  reTerm.pExpr fie
2ad0: 6c 64 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a  ld is still set.
2ae0: 2a 2a 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ** to the origin
2af0: 61 6c 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  al subexpression
2b00: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46   content and wtF
2b10: 6c 61 67 73 20 69 73 20 73 65 74 20 75 70 20 61  lags is set up a
2b20: 70 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20  ppropriately.** 
2b30: 62 75 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65  but no other fie
2b40: 6c 64 73 20 69 6e 20 74 68 65 20 57 68 65 72 65  lds in the Where
2b50: 54 65 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20  Term object are 
2b60: 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a  meaningful..**.*
2b70: 2a 20 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72  * When eOperator
2b80: 21 3d 30 2c 20 70 72 65 72 65 71 52 69 67 68 74  !=0, prereqRight
2b90: 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72   and prereqAll r
2ba0: 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75  ecord sets of cu
2bb0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a  rsor numbers,.**
2bc0: 20 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20   but they do so 
2bd0: 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73  indirectly.  A s
2be0: 69 6e 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53  ingle WhereMaskS
2bf0: 65 74 20 73 74 72 75 63 74 75 72 65 20 74 72 61  et structure tra
2c00: 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f  nslates.** curso
2c10: 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69  r number into bi
2c20: 74 73 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  ts and the trans
2c30: 6c 61 74 65 64 20 62 69 74 20 69 73 20 73 74 6f  lated bit is sto
2c40: 72 65 64 20 69 6e 20 74 68 65 20 70 72 65 72 65  red in the prere
2c50: 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68  q.** fields.  Th
2c60: 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73  e translation is
2c70: 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74   used in order t
2c80: 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e  o maximize the n
2c90: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73  umber of.** bits
2ca0: 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69   that will fit i
2cb0: 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68  n a Bitmask.  Th
2cc0: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
2cd0: 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a  mbers might be.*
2ce0: 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65  * spread out ove
2cf0: 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69  r the non-negati
2d00: 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f  ve integers.  Fo
2d10: 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63  r example, the c
2d20: 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73  ursor.** numbers
2d30: 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20   might be 3, 8, 
2d40: 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34  9, 10, 20, 23, 4
2d50: 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20  1, and 45.  The 
2d60: 57 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20  WhereMaskSet.** 
2d70: 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65  translates these
2d80: 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e   sparse cursor n
2d90: 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73  umbers into cons
2da0: 65 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73  ecutive integers
2db0: 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  .** beginning wi
2dc0: 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f  th 0 in order to
2dd0: 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74 20 70   make the best p
2de0: 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74  ossible use of t
2df0: 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  he available.** 
2e00: 62 69 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d  bits in the Bitm
2e10: 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65  ask.  So, in the
2e20: 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20   example above, 
2e30: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
2e40: 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d  rs.** would be m
2e50: 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67  apped into integ
2e60: 65 72 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e  ers 0 through 7.
2e70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  .**.** The numbe
2e80: 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20  r of terms in a 
2e90: 6a 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20  join is limited 
2ea0: 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
2eb0: 20 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72   bits.** in prer
2ec0: 65 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72  eqRight and prer
2ed0: 65 71 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61  eqAll.  The defa
2ee0: 75 6c 74 20 69 73 20 36 34 20 62 69 74 73 2c 20  ult is 64 bits, 
2ef0: 68 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20  hence SQLite.** 
2f00: 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20  is only able to 
2f10: 70 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69  process joins wi
2f20: 74 68 20 36 34 20 6f 72 20 66 65 77 65 72 20 74  th 64 or fewer t
2f30: 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  ables..*/.struct
2f40: 20 57 68 65 72 65 54 65 72 6d 20 7b 0a 20 20 45   WhereTerm {.  E
2f50: 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20  xpr *pExpr;     
2f60: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2f70: 72 20 74 6f 20 74 68 65 20 73 75 62 65 78 70 72  r to the subexpr
2f80: 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74  ession that is t
2f90: 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  his term */.  in
2fa0: 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
2fb0: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
2fc0: 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74 5d   pWC->a[iParent]
2fd0: 20 77 68 65 6e 20 74 68 69 73 20 74 65 72 6d 20   when this term 
2fe0: 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 69 6e  disabled */.  in
2ff0: 74 20 6c 65 66 74 43 75 72 73 6f 72 3b 20 20 20  t leftCursor;   
3000: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
3010: 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22  number of X in "
3020: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a  X <op> <expr>" *
3030: 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  /.  union {.    
3040: 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20  int leftColumn; 
3050: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
3060: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e  n number of X in
3070: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
3080: 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4f 72 49   */.    WhereOrI
3090: 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20  nfo *pOrInfo;   
30a0: 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61  /* Extra informa
30b0: 74 69 6f 6e 20 69 66 20 28 65 4f 70 65 72 61 74  tion if (eOperat
30c0: 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 20 2a  or & WO_OR)!=0 *
30d0: 2f 0a 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e  /.    WhereAndIn
30e0: 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a  fo *pAndInfo; /*
30f0: 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   Extra informati
3100: 6f 6e 20 69 66 20 28 65 4f 70 65 72 61 74 6f 72  on if (eOperator
3110: 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 2a 2f 0a  & WO_AND)!=0 */.
3120: 20 20 7d 20 75 3b 0a 20 20 57 68 65 72 65 43 6f    } u;.  WhereCo
3130: 73 74 20 74 72 75 74 68 50 72 6f 62 3b 20 20 20  st truthProb;   
3140: 20 2f 2a 20 50 72 6f 62 61 62 69 6c 69 74 79 20   /* Probability 
3150: 6f 66 20 74 72 75 74 68 20 66 6f 72 20 74 68 69  of truth for thi
3160: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
3170: 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b    u16 eOperator;
3180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
3190: 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63 72  O_xx value descr
31a0: 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20  ibing <op> */.  
31b0: 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20 20 20  u8 wtFlags;     
31c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f          /* TERM_
31d0: 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e 20 20  xxx bit flags.  
31e0: 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75  See below */.  u
31f0: 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20  8 nChild;       
3200: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3210: 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61   of children tha
3220: 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75  t must disable u
3230: 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  s */.  WhereClau
3240: 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f  se *pWC;       /
3250: 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74 68 69  * The clause thi
3260: 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f  s term is part o
3270: 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  f */.  Bitmask p
3280: 72 65 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f  rereqRight;    /
3290: 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62  * Bitmask of tab
32a0: 6c 65 73 20 75 73 65 64 20 62 79 20 70 45 78 70  les used by pExp
32b0: 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42  r->pRight */.  B
32c0: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c  itmask prereqAll
32d0: 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  ;      /* Bitmas
32e0: 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65  k of tables refe
32f0: 72 65 6e 63 65 64 20 62 79 20 70 45 78 70 72 20  renced by pExpr 
3300: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  */.};../*.** All
3310: 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57  owed values of W
3320: 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73  hereTerm.wtFlags
3330: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d  .*/.#define TERM
3340: 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31  _DYNAMIC    0x01
3350: 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61     /* Need to ca
3360: 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  ll sqlite3ExprDe
3370: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 20  lete(db, pExpr) 
3380: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
3390: 56 49 52 54 55 41 4c 20 20 20 20 30 78 30 32 20  VIRTUAL    0x02 
33a0: 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68    /* Added by th
33b0: 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f  e optimizer.  Do
33c0: 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65   not code */.#de
33d0: 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20  fine TERM_CODED 
33e0: 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54       0x04   /* T
33f0: 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65  his term is alre
3400: 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65  ady coded */.#de
3410: 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44  fine TERM_COPIED
3420: 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48       0x08   /* H
3430: 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64  as a child */.#d
3440: 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46  efine TERM_ORINF
3450: 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20  O     0x10   /* 
3460: 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65  Need to free the
3470: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
3480: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23  Info object */.#
3490: 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49  define TERM_ANDI
34a0: 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20 2f 2a  NFO    0x20   /*
34b0: 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74 68   Need to free th
34c0: 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 41  e WhereTerm.u.pA
34d0: 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64  ndInfo obj */.#d
34e0: 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b  efine TERM_OR_OK
34f0: 20 20 20 20 20 20 30 78 34 30 20 20 20 2f 2a 20        0x40   /* 
3500: 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63  Used during OR-c
3510: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
3520: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
3530: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
3540: 52 5f 53 54 41 54 34 0a 23 20 20 64 65 66 69 6e  R_STAT4.#  defin
3550: 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20 20 20  e TERM_VNULL    
3560: 30 78 38 30 20 20 20 2f 2a 20 4d 61 6e 75 66 61  0x80   /* Manufa
3570: 63 74 75 72 65 64 20 78 3e 4e 55 4c 4c 20 6f 72  ctured x>NULL or
3580: 20 78 3c 3d 4e 55 4c 4c 20 74 65 72 6d 20 2a 2f   x<=NULL term */
3590: 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
35a0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20 20 20 30   TERM_VNULL    0
35b0: 78 30 30 20 20 20 2f 2a 20 44 69 73 61 62 6c 65  x00   /* Disable
35c0: 64 20 69 66 20 6e 6f 74 20 75 73 69 6e 67 20 73  d if not using s
35d0: 74 61 74 33 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  tat3 */.#endif..
35e0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
35f0: 65 20 6f 66 20 74 68 65 20 57 68 65 72 65 53 63  e of the WhereSc
3600: 61 6e 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  an object is use
3610: 64 20 61 73 20 61 6e 20 69 74 65 72 61 74 6f 72  d as an iterator
3620: 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 0a 2a 2a   for locating.**
3630: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
3640: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
3650: 61 72 65 20 75 73 65 66 75 6c 20 74 6f 20 74 68  are useful to th
3660: 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  e query planner.
3670: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
3680: 53 63 61 6e 20 7b 0a 20 20 57 68 65 72 65 43 6c  Scan {.  WhereCl
3690: 61 75 73 65 20 2a 70 4f 72 69 67 57 43 3b 20 20  ause *pOrigWC;  
36a0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 2c      /* Original,
36b0: 20 69 6e 6e 65 72 6d 6f 73 74 20 57 68 65 72 65   innermost Where
36c0: 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  Clause */.  Wher
36d0: 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
36e0: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 43         /* WhereC
36f0: 6c 61 75 73 65 20 63 75 72 72 65 6e 74 6c 79 20  lause currently 
3700: 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f  being scanned */
3710: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 4e 61  .  char *zCollNa
3720: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
3730: 20 52 65 71 75 69 72 65 64 20 63 6f 6c 6c 61 74   Required collat
3740: 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 69 66  ing sequence, if
3750: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63   not NULL */.  c
3760: 68 61 72 20 69 64 78 61 66 66 3b 20 20 20 20 20  har idxaff;     
3770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
3780: 74 20 6d 61 74 63 68 20 74 68 69 73 20 61 66 66  t match this aff
3790: 69 6e 69 74 79 2c 20 69 66 20 7a 43 6f 6c 6c 4e  inity, if zCollN
37a0: 61 6d 65 21 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 75  ame!=NULL */.  u
37b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6e 45 71  nsigned char nEq
37c0: 75 69 76 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  uiv;      /* Num
37d0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
37e0: 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f 0a 20 20  n aEquiv[] */.  
37f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 45  unsigned char iE
3800: 71 75 69 76 3b 20 20 20 20 20 20 2f 2a 20 4e 65  quiv;      /* Ne
3810: 78 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  xt unused slot i
3820: 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f 0a 20 20  n aEquiv[] */.  
3830: 75 33 32 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20  u32 opMask;     
3840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
3850: 63 65 70 74 61 62 6c 65 20 6f 70 65 72 61 74 6f  ceptable operato
3860: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20  rs */.  int k;  
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3880: 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 63 61     /* Resume sca
3890: 6e 6e 69 6e 67 20 61 74 20 74 68 69 73 2d 3e 70  nning at this->p
38a0: 57 43 2d 3e 61 5b 74 68 69 73 2d 3e 6b 5d 20 2a  WC->a[this->k] *
38b0: 2f 0a 20 20 69 6e 74 20 61 45 71 75 69 76 5b 32  /.  int aEquiv[2
38c0: 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  2];            /
38d0: 2a 20 43 75 72 73 6f 72 2c 43 6f 6c 75 6d 6e 20  * Cursor,Column 
38e0: 70 61 69 72 73 20 66 6f 72 20 65 71 75 69 76 61  pairs for equiva
38f0: 6c 65 6e 63 65 20 63 6c 61 73 73 65 73 20 2a 2f  lence classes */
3900: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
3910: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
3920: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3930: 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f  e holds all info
3940: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a  rmation about a.
3950: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  ** WHERE clause.
3960: 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73    Mostly this is
3970: 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72   a container for
3980: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65   one or more Whe
3990: 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 45  reTerms..**.** E
39a0: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 70 4f  xplanation of pO
39b0: 75 74 65 72 3a 20 20 46 6f 72 20 61 20 57 48 45  uter:  For a WHE
39c0: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
39d0: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
39e0: 20 20 20 20 20 20 61 20 41 4e 44 20 28 28 62 20        a AND ((b 
39f0: 41 4e 44 20 63 29 20 4f 52 20 28 64 20 41 4e 44  AND c) OR (d AND
3a00: 20 65 29 29 20 41 4e 44 20 66 0a 2a 2a 0a 2a 2a   e)) AND f.**.**
3a10: 20 54 68 65 72 65 20 61 72 65 20 73 65 70 61 72   There are separ
3a20: 61 74 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  ate WhereClause 
3a30: 6f 62 6a 65 63 74 73 20 66 6f 72 20 74 68 65 20  objects for the 
3a40: 77 68 6f 6c 65 20 63 6c 61 75 73 65 20 61 6e 64  whole clause and
3a50: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 75 62 63   for.** the subc
3a60: 6c 61 75 73 65 73 20 22 28 62 20 41 4e 44 20 63  lauses "(b AND c
3a70: 29 22 20 61 6e 64 20 22 28 64 20 41 4e 44 20 65  )" and "(d AND e
3a80: 29 22 2e 20 20 54 68 65 20 70 4f 75 74 65 72 20  )".  The pOuter 
3a90: 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a 2a 20  field of the.** 
3aa0: 73 75 62 63 6c 61 75 73 65 73 20 70 6f 69 6e 74  subclauses point
3ab0: 73 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c  s to the WhereCl
3ac0: 61 75 73 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  ause object for 
3ad0: 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65  the whole clause
3ae0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
3af0: 65 43 6c 61 75 73 65 20 7b 0a 20 20 57 68 65 72  eClause {.  Wher
3b00: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
3b10: 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c       /* WHERE cl
3b20: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
3b30: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
3b40: 72 65 43 6c 61 75 73 65 20 2a 70 4f 75 74 65 72  reClause *pOuter
3b50: 3b 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20 63  ;     /* Outer c
3b60: 6f 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  onjunction */.  
3b70: 75 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  u8 op;          
3b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69           /* Spli
3b90: 74 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f  t operator.  TK_
3ba0: 41 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a  AND or TK_OR */.
3bb0: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
3bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3bd0: 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f  mber of terms */
3be0: 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20  .  int nSlot;   
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3c00: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3c10: 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65   in a[] */.  Whe
3c20: 72 65 54 65 72 6d 20 2a 61 3b 20 20 20 20 20 20  reTerm *a;      
3c30: 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 61 5b        /* Each a[
3c40: 5d 20 64 65 73 63 72 69 62 65 73 20 61 20 74 65  ] describes a te
3c50: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
3c60: 63 6c 75 61 73 65 20 2a 2f 0a 23 69 66 20 64 65  cluase */.#if de
3c70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 4d 41  fined(SQLITE_SMA
3c80: 4c 4c 5f 53 54 41 43 4b 29 0a 20 20 57 68 65 72  LL_STACK).  Wher
3c90: 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 31 5d  eTerm aStatic[1]
3ca0: 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20  ;    /* Initial 
3cb0: 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72  static space for
3cc0: 20 61 5b 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20   a[] */.#else.  
3cd0: 57 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69  WhereTerm aStati
3ce0: 63 5b 38 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74  c[8];    /* Init
3cf0: 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65  ial static space
3d00: 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64   for a[] */.#end
3d10: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57  if.};../*.** A W
3d20: 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f  hereTerm with eO
3d30: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68  perator==WO_OR h
3d40: 61 73 20 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f  as its u.pOrInfo
3d50: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
3d60: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
3d70: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
3d80: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
3d90: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
3da0: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f  */.struct WhereO
3db0: 72 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43  rInfo {.  WhereC
3dc0: 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20  lause wc;       
3dd0: 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
3de0: 69 6f 6e 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  ion into subterm
3df0: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  s */.  Bitmask i
3e00: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
3e10: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c  /* Bitmask of al
3e20: 6c 20 69 6e 64 65 78 61 62 6c 65 20 74 61 62 6c  l indexable tabl
3e30: 65 73 20 69 6e 20 74 68 65 20 63 6c 61 75 73 65  es in the clause
3e40: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
3e50: 57 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65  WhereTerm with e
3e60: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44  Operator==WO_AND
3e70: 20 68 61 73 20 69 74 73 20 75 2e 70 41 6e 64 49   has its u.pAndI
3e80: 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20  nfo pointer set 
3e90: 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61  to.** a dynamica
3ea0: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  lly allocated in
3eb0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
3ec0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3ed0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
3ee0: 72 65 41 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68  reAndInfo {.  Wh
3ef0: 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20  ereClause wc;   
3f00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
3f10: 62 65 78 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b  bexpression brok
3f20: 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  en out */.};../*
3f30: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
3f40: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3f50: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
3f60: 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61 70 70   track of a mapp
3f70: 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56  ing.** between V
3f80: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
3f90: 72 73 20 61 6e 64 20 62 69 74 73 20 6f 66 20 74  rs and bits of t
3fa0: 68 65 20 62 69 74 6d 61 73 6b 73 20 69 6e 20 57  he bitmasks in W
3fb0: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
3fc0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
3fd0: 6e 75 6d 62 65 72 73 20 61 72 65 20 73 6d 61 6c  numbers are smal
3fe0: 6c 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61  l integers conta
3ff0: 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c  ined in .** SrcL
4000: 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72  ist_item.iCursor
4010: 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62 6c 65   and Expr.iTable
4020: 20 66 69 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e   fields.  For an
4030: 79 20 67 69 76 65 6e 20 57 48 45 52 45 20 0a 2a  y given WHERE .*
4040: 2a 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 75  * clause, the cu
4050: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67  rsor numbers mig
4060: 68 74 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  ht not begin wit
4070: 68 20 30 20 61 6e 64 20 74 68 65 79 20 6d 69 67  h 0 and they mig
4080: 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61  ht.** contain ga
4090: 70 73 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ps in the number
40a0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 42  ing sequence.  B
40b0: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
40c0: 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73  ke maximum.** us
40d0: 65 20 6f 66 20 74 68 65 20 62 69 74 73 20 69 6e  e of the bits in
40e0: 20 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e 20 20   our bitmasks.  
40f0: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 70  This structure p
4100: 72 6f 76 69 64 65 73 20 61 20 6d 61 70 70 69 6e  rovides a mappin
4110: 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 70  g.** from the sp
4120: 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  arse cursor numb
4130: 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75  ers into consecu
4140: 74 69 76 65 20 69 6e 74 65 67 65 72 73 20 62 65  tive integers be
4150: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20  ginning.** with 
4160: 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72  0..**.** If Wher
4170: 65 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d  eMaskSet.ix[A]==
4180: 42 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  B it means that 
4190: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
41a0: 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72  a Bitmask.** cor
41b0: 72 65 73 70 6f 6e 64 73 20 56 44 42 45 20 63 75  responds VDBE cu
41c0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20 20  rsor number B.  
41d0: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
41e0: 61 20 62 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c  a bitmask is 1<<
41f0: 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  A..**.** For exa
4200: 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57 48 45  mple, if the WHE
4210: 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
4220: 73 69 6f 6e 20 75 73 65 64 20 74 68 65 73 65 20  sion used these 
4230: 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a  VDBE.** cursors:
4240: 20 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35    4, 5, 8, 29, 5
4250: 37 2c 20 37 33 2e 20 20 54 68 65 6e 20 74 68 65  7, 73.  Then the
4260: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73    WhereMaskSet s
4270: 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c  tructure.** woul
4280: 64 20 6d 61 70 20 74 68 6f 73 65 20 63 75 72 73  d map those curs
4290: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
42a0: 62 69 74 73 20 30 20 74 68 72 6f 75 67 68 20 35  bits 0 through 5
42b0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
42c0: 74 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  t the mapping is
42d0: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
42e0: 20 6f 72 64 65 72 65 64 2e 20 20 49 6e 20 74 68   ordered.  In th
42f0: 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f  e example.** abo
4300: 76 65 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ve, the mapping 
4310: 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65 20 74 68  might go like th
4320: 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c  is:  4->3, 5->1,
4330: 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a   8->2, 29->0,.**
4340: 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20   57->5, 73->4.  
4350: 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74  Or one of 719 ot
4360: 68 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  her combinations
4370: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 2e 20   might be used. 
4380: 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72  It.** does not r
4390: 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20 20 57  eally matter.  W
43a0: 68 61 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  hat is important
43b0: 20 69 73 20 74 68 61 74 20 73 70 61 72 73 65 20   is that sparse 
43c0: 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
43d0: 73 20 61 6c 6c 20 67 65 74 20 6d 61 70 70 65 64  s all get mapped
43e0: 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62 65 72   into bit number
43f0: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
4400: 68 20 30 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a  h 0 and contain.
4410: 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73  ** no gaps..*/.s
4420: 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53  truct WhereMaskS
4430: 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20  et {.  int n;   
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4460: 66 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f  f assigned curso
4470: 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  r values */.  in
4480: 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20  t ix[BMS];      
4490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
44a0: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
44b0: 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b  o each bit */.};
44c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6f 62 6a  ../*.** This obj
44d0: 65 63 74 20 69 73 20 61 20 63 6f 6e 76 65 6e 69  ect is a conveni
44e0: 65 6e 63 65 20 77 72 61 70 70 65 72 20 68 6f 6c  ence wrapper hol
44f0: 64 69 6e 67 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  ding all informa
4500: 74 69 6f 6e 20 6e 65 65 64 65 64 0a 2a 2a 20 74  tion needed.** t
4510: 6f 20 63 6f 6e 73 74 72 75 63 74 20 57 68 65 72  o construct Wher
4520: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
4530: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 71  r a particular q
4540: 75 65 72 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  uery..*/.struct 
4550: 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
4560: 20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a   {.  WhereInfo *
4570: 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 2f  pWInfo;        /
4580: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
4590: 6f 75 74 20 74 68 69 73 20 57 48 45 52 45 20 2a  out this WHERE *
45a0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
45b0: 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 2f 2a  *pWC;         /*
45c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
45d0: 72 6d 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  rms */.  ExprLis
45e0: 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
45f0: 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63     /* ORDER BY c
4600: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
4610: 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
4620: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
4630: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20   WhereLoop */.  
4640: 57 68 65 72 65 4f 72 53 65 74 20 2a 70 4f 72 53  WhereOrSet *pOrS
4650: 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 63  et;       /* Rec
4660: 6f 72 64 20 62 65 73 74 20 6c 6f 6f 70 73 20 68  ord best loops h
4670: 65 72 65 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  ere, if not NULL
4680: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
4690: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
46a0: 52 5f 53 54 41 54 34 0a 20 20 55 6e 70 61 63 6b  R_STAT4.  Unpack
46b0: 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 3b 20  edRecord *pRec; 
46c0: 20 20 20 20 2f 2a 20 50 72 6f 62 65 20 66 6f 72      /* Probe for
46d0: 20 73 74 61 74 34 20 28 69 66 20 72 65 71 75 69   stat4 (if requi
46e0: 72 65 64 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  red) */.  int nR
46f0: 65 63 56 61 6c 69 64 3b 20 20 20 20 20 20 20 20  ecValid;        
4700: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4710: 20 76 61 6c 69 64 20 66 69 65 6c 64 73 20 63 75   valid fields cu
4720: 72 72 65 6e 74 6c 79 20 69 6e 20 70 52 65 63 20  rrently in pRec 
4730: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
4740: 0a 2a 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c  .** The WHERE cl
4750: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
4760: 72 6f 75 74 69 6e 65 20 68 61 73 20 74 77 6f 20  routine has two 
4770: 68 61 6c 76 65 73 2e 20 20 54 68 65 0a 2a 2a 20  halves.  The.** 
4780: 66 69 72 73 74 20 70 61 72 74 20 64 6f 65 73 20  first part does 
4790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
47a0: 20 57 48 45 52 45 20 6c 6f 6f 70 20 61 6e 64 20   WHERE loop and 
47b0: 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 68 61  the second.** ha
47c0: 6c 66 20 64 6f 65 73 20 74 68 65 20 74 61 69 6c  lf does the tail
47d0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f   of the WHERE lo
47e0: 6f 70 2e 20 20 41 6e 20 69 6e 73 74 61 6e 63 65  op.  An instance
47f0: 20 6f 66 0a 2a 2a 20 74 68 69 73 20 73 74 72 75   of.** this stru
4800: 63 74 75 72 65 20 69 73 20 72 65 74 75 72 6e 65  cture is returne
4810: 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 68  d by the first h
4820: 61 6c 66 20 61 6e 64 20 70 61 73 73 65 64 0a 2a  alf and passed.*
4830: 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 63 6f 6e  * into the secon
4840: 64 20 68 61 6c 66 20 74 6f 20 67 69 76 65 20 73  d half to give s
4850: 6f 6d 65 20 63 6f 6e 74 69 6e 75 69 74 79 2e 0a  ome continuity..
4860: 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  **.** An instanc
4870: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
4880: 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6d 70 6c   holds the compl
4890: 65 74 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  ete state of the
48a0: 20 71 75 65 72 79 0a 2a 2a 20 70 6c 61 6e 6e 65   query.** planne
48b0: 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  r..*/.struct Whe
48c0: 72 65 49 6e 66 6f 20 7b 0a 20 20 50 61 72 73 65  reInfo {.  Parse
48d0: 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
48e0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
48f0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
4900: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
4910: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
4920: 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st;        /* Li
4930: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
4940: 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78  the join */.  Ex
4950: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
4960: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  ;       /* The O
4970: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
4980: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  r NULL */.  Expr
4990: 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74  List *pResultSet
49a0: 3b 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20  ;     /* Result 
49b0: 73 65 74 2e 20 44 49 53 54 49 4e 43 54 20 6f 70  set. DISTINCT op
49c0: 65 72 61 74 65 73 20 6f 6e 20 74 68 65 73 65 20  erates on these 
49d0: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
49e0: 70 4c 6f 6f 70 73 3b 20 20 20 20 20 20 20 20 2f  pLoops;        /
49f0: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 57 68  * List of all Wh
4a00: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
4a10: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 76  */.  Bitmask rev
4a20: 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  Mask;          /
4a30: 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20  * Mask of ORDER 
4a40: 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 6e 65  BY terms that ne
4a50: 65 64 20 72 65 76 65 72 73 69 6e 67 20 2a 2f 0a  ed reversing */.
4a60: 20 20 57 68 65 72 65 43 6f 73 74 20 6e 52 6f 77    WhereCost nRow
4a70: 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  Out;        /* E
4a80: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
4a90: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a  of output rows *
4aa0: 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
4ab0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs;           /*
4ac0: 20 46 6c 61 67 73 20 6f 72 69 67 69 6e 61 6c 6c   Flags originall
4ad0: 79 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  y passed to sqli
4ae0: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
4af0: 2a 2f 0a 20 20 75 38 20 62 4f 42 53 61 74 3b 20  */.  u8 bOBSat; 
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4b10: 2a 20 4f 52 44 45 52 20 42 59 20 73 61 74 69 73  * ORDER BY satis
4b20: 66 69 65 64 20 62 79 20 69 6e 64 69 63 65 73 20  fied by indices 
4b30: 2a 2f 0a 20 20 75 38 20 6f 6b 4f 6e 65 50 61 73  */.  u8 okOnePas
4b40: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
4b50: 2a 20 4f 6b 20 74 6f 20 75 73 65 20 6f 6e 65 2d  * Ok to use one-
4b60: 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 66  pass algorithm f
4b70: 6f 72 20 55 50 44 41 54 45 2f 44 45 4c 45 54 45  or UPDATE/DELETE
4b80: 20 2a 2f 0a 20 20 75 38 20 75 6e 74 65 73 74 65   */.  u8 unteste
4b90: 64 54 65 72 6d 73 3b 20 20 20 20 20 20 20 20 20  dTerms;         
4ba0: 2f 2a 20 4e 6f 74 20 61 6c 6c 20 57 48 45 52 45  /* Not all WHERE
4bb0: 20 74 65 72 6d 73 20 72 65 73 6f 6c 76 65 64 20   terms resolved 
4bc0: 62 79 20 6f 75 74 65 72 20 6c 6f 6f 70 20 2a 2f  by outer loop */
4bd0: 0a 20 20 75 38 20 65 44 69 73 74 69 6e 63 74 3b  .  u8 eDistinct;
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4bf0: 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
4c00: 5f 44 49 53 54 49 4e 43 54 5f 2a 20 76 61 6c 75  _DISTINCT_* valu
4c10: 65 73 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38  es below */.  u8
4c20: 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20   nLevel;        
4c30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4c40: 72 20 6f 66 20 6e 65 73 74 65 64 20 6c 6f 6f 70  r of nested loop
4c50: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f 70 3b 20   */.  int iTop; 
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 2f 2a 20 54 68 65 20 76 65 72 79 20 62 65 67 69  /* The very begi
4c80: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 57 48 45  nning of the WHE
4c90: 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  RE loop */.  int
4ca0: 20 69 43 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20   iContinue;     
4cb0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
4cc0: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
4cd0: 77 69 74 68 20 6e 65 78 74 20 72 65 63 6f 72 64  with next record
4ce0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
4cf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4d00: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
4d10: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
4d20: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 73   loop */.  int s
4d30: 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 20  avedNQueryLoop; 
4d40: 20 20 20 20 20 2f 2a 20 70 50 61 72 73 65 2d 3e       /* pParse->
4d50: 6e 51 75 65 72 79 4c 6f 6f 70 20 6f 75 74 73 69  nQueryLoop outsi
4d60: 64 65 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  de the WHERE loo
4d70: 70 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  p */.  WhereMask
4d80: 53 65 74 20 73 4d 61 73 6b 53 65 74 3b 20 20 20  Set sMaskSet;   
4d90: 20 2f 2a 20 4d 61 70 20 63 75 72 73 6f 72 20 6e   /* Map cursor n
4da0: 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73  umbers to bitmas
4db0: 6b 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ks */.  WhereCla
4dc0: 75 73 65 20 73 57 43 3b 20 20 20 20 20 20 20 20  use sWC;        
4dd0: 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69    /* Decompositi
4de0: 6f 6e 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  on of the WHERE 
4df0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
4e00: 65 4c 65 76 65 6c 20 61 5b 31 5d 3b 20 20 20 20  eLevel a[1];    
4e10: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
4e20: 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68 20  tion about each 
4e30: 6e 65 73 74 20 6c 6f 6f 70 20 69 6e 20 57 48 45  nest loop in WHE
4e40: 52 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  RE */.};../*.** 
4e50: 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65  Bitmasks for the
4e60: 20 6f 70 65 72 61 74 6f 72 73 20 6f 6e 20 57 68   operators on Wh
4e70: 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 73 2e  ereTerm objects.
4e80: 20 20 54 68 65 73 65 20 61 72 65 20 61 6c 6c 0a    These are all.
4e90: 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
4ea0: 74 20 61 72 65 20 6f 66 20 69 6e 74 65 72 65 73  t are of interes
4eb0: 74 20 74 6f 20 74 68 65 20 71 75 65 72 79 20 70  t to the query p
4ec0: 6c 61 6e 6e 65 72 2e 20 20 41 6e 0a 2a 2a 20 4f  lanner.  An.** O
4ed0: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  R-ed combination
4ee0: 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65 73   of these values
4ef0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
4f00: 6e 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 0a  n searching for.
4f10: 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 57 68  ** particular Wh
4f20: 65 72 65 54 65 72 6d 73 20 77 69 74 68 69 6e 20  ereTerms within 
4f30: 61 20 57 68 65 72 65 43 6c 61 75 73 65 2e 0a 2a  a WhereClause..*
4f40: 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20  /.#define WO_IN 
4f50: 20 20 20 20 30 78 30 30 31 0a 23 64 65 66 69 6e      0x001.#defin
4f60: 65 20 57 4f 5f 45 51 20 20 20 20 20 30 78 30 30  e WO_EQ     0x00
4f70: 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20  2.#define WO_LT 
4f80: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
4f90: 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  LT-TK_EQ)).#defi
4fa0: 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f  ne WO_LE     (WO
4fb0: 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45  _EQ<<(TK_LE-TK_E
4fc0: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47  Q)).#define WO_G
4fd0: 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  T     (WO_EQ<<(T
4fe0: 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65  K_GT-TK_EQ)).#de
4ff0: 66 69 6e 65 20 57 4f 5f 47 45 20 20 20 20 20 28  fine WO_GE     (
5000: 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b  WO_EQ<<(TK_GE-TK
5010: 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f  _EQ)).#define WO
5020: 5f 4d 41 54 43 48 20 20 30 78 30 34 30 0a 23 64  _MATCH  0x040.#d
5030: 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20  efine WO_ISNULL 
5040: 30 78 30 38 30 0a 23 64 65 66 69 6e 65 20 57 4f  0x080.#define WO
5050: 5f 4f 52 20 20 20 20 20 30 78 31 30 30 20 20 20  _OR     0x100   
5060: 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f      /* Two or mo
5070: 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  re OR-connected 
5080: 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65  terms */.#define
5090: 20 57 4f 5f 41 4e 44 20 20 20 20 30 78 32 30 30   WO_AND    0x200
50a0: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
50b0: 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e 65 63   more AND-connec
50c0: 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65  ted terms */.#de
50d0: 66 69 6e 65 20 57 4f 5f 45 51 55 49 56 20 20 30  fine WO_EQUIV  0
50e0: 78 34 30 30 20 20 20 20 20 20 20 2f 2a 20 4f 66  x400       /* Of
50f0: 20 74 68 65 20 66 6f 72 6d 20 41 3d 3d 42 2c 20   the form A==B, 
5100: 62 6f 74 68 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  both columns */.
5110: 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20  #define WO_NOOP 
5120: 20 20 30 78 38 30 30 20 20 20 20 20 20 20 2f 2a    0x800       /*
5130: 20 54 68 69 73 20 74 65 72 6d 20 64 6f 65 73 20   This term does 
5140: 6e 6f 74 20 72 65 73 74 72 69 63 74 20 73 65 61  not restrict sea
5150: 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 0a 23 64  rch space */..#d
5160: 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20  efine WO_ALL    
5170: 30 78 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d  0xfff       /* M
5180: 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69  ask of all possi
5190: 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20  ble WO_* values 
51a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49  */.#define WO_SI
51b0: 4e 47 4c 45 20 30 78 30 66 66 20 20 20 20 20 20  NGLE 0x0ff      
51c0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
51d0: 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f  non-compound WO_
51e0: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a  * values */../*.
51f0: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 64 65 66  ** These are def
5200: 69 6e 69 74 69 6f 6e 73 20 6f 66 20 62 69 74 73  initions of bits
5210: 20 69 6e 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   in the WhereLoo
5220: 70 2e 77 73 46 6c 61 67 73 20 66 69 65 6c 64 2e  p.wsFlags field.
5230: 0a 2a 2a 20 54 68 65 20 70 61 72 74 69 63 75 6c  .** The particul
5240: 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ar combination o
5250: 66 20 62 69 74 73 20 69 6e 20 65 61 63 68 20 57  f bits in each W
5260: 68 65 72 65 4c 6f 6f 70 20 68 65 6c 70 20 74 6f  hereLoop help to
5270: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 74 68  .** determine th
5280: 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74  e algorithm that
5290: 20 57 68 65 72 65 4c 6f 6f 70 20 72 65 70 72 65   WhereLoop repre
52a0: 73 65 6e 74 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  sents..*/.#defin
52b0: 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  e WHERE_COLUMN_E
52c0: 51 20 20 20 20 30 78 30 30 30 30 30 30 30 31 20  Q    0x00000001 
52d0: 20 2f 2a 20 78 3d 45 58 50 52 20 2a 2f 0a 23 64   /* x=EXPR */.#d
52e0: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
52f0: 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30 30 30 30  MN_RANGE 0x00000
5300: 30 30 32 20 20 2f 2a 20 78 3c 45 58 50 52 20 61  002  /* x<EXPR a
5310: 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a  nd/or x>EXPR */.
5320: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
5330: 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78 30 30 30  LUMN_IN    0x000
5340: 30 30 30 30 34 20 20 2f 2a 20 78 20 49 4e 20 28  00004  /* x IN (
5350: 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ...) */.#define 
5360: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
5370: 4c 20 20 30 78 30 30 30 30 30 30 30 38 20 20 2f  L  0x00000008  /
5380: 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23  * x IS NULL */.#
5390: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4e  define WHERE_CON
53a0: 53 54 52 41 49 4e 54 20 20 20 30 78 30 30 30 30  STRAINT   0x0000
53b0: 30 30 30 66 20 20 2f 2a 20 41 6e 79 20 6f 66 20  000f  /* Any of 
53c0: 74 68 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  the WHERE_COLUMN
53d0: 5f 78 78 78 20 76 61 6c 75 65 73 20 2a 2f 0a 23  _xxx values */.#
53e0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54 4f 50  define WHERE_TOP
53f0: 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 30 30  _LIMIT    0x0000
5400: 30 30 31 30 20 20 2f 2a 20 78 3c 45 58 50 52 20  0010  /* x<EXPR 
5410: 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e 73 74  or x<=EXPR const
5420: 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  raint */.#define
5430: 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
5440: 20 20 20 20 30 78 30 30 30 30 30 30 32 30 20 20      0x00000020  
5450: 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20 78 3e 3d  /* x>EXPR or x>=
5460: 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20  EXPR constraint 
5470: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
5480: 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20 20 30 78  _BOTH_LIMIT   0x
5490: 30 30 30 30 30 30 33 30 20 20 2f 2a 20 42 6f 74  00000030  /* Bot
54a0: 68 20 78 3e 45 58 50 52 20 61 6e 64 20 78 3c 45  h x>EXPR and x<E
54b0: 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  XPR */.#define W
54c0: 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20  HERE_IDX_ONLY   
54d0: 20 20 30 78 30 30 30 30 30 30 34 30 20 20 2f 2a    0x00000040  /*
54e0: 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   Use index only 
54f0: 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a  - omit table */.
5500: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 50  #define WHERE_IP
5510: 4b 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30  K          0x000
5520: 30 30 31 30 30 20 20 2f 2a 20 78 20 69 73 20 74  00100  /* x is t
5530: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
5540: 52 59 20 4b 45 59 20 2a 2f 0a 23 64 65 66 69 6e  RY KEY */.#defin
5550: 65 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  e WHERE_INDEXED 
5560: 20 20 20 20 20 30 78 30 30 30 30 30 32 30 30 20       0x00000200 
5570: 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75 2e   /* WhereLoop.u.
5580: 62 74 72 65 65 2e 70 49 6e 64 65 78 20 69 73 20  btree.pIndex is 
5590: 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66 69 6e 65  valid */.#define
55a0: 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
55b0: 42 4c 45 20 30 78 30 30 30 30 30 34 30 30 20 20  BLE 0x00000400  
55c0: 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75 2e 76  /* WhereLoop.u.v
55d0: 74 61 62 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  tab is valid */.
55e0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 4e  #define WHERE_IN
55f0: 5f 41 42 4c 45 20 20 20 20 20 20 30 78 30 30 30  _ABLE      0x000
5600: 30 30 38 30 30 20 20 2f 2a 20 41 62 6c 65 20 74  00800  /* Able t
5610: 6f 20 73 75 70 70 6f 72 74 20 61 6e 20 49 4e 20  o support an IN 
5620: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66  operator */.#def
5630: 69 6e 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  ine WHERE_ONEROW
5640: 20 20 20 20 20 20 20 30 78 30 30 30 30 31 30 30         0x0000100
5650: 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f  0  /* Selects no
5660: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
5670: 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  ow */.#define WH
5680: 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20 20 20  ERE_MULTI_OR    
5690: 20 30 78 30 30 30 30 32 30 30 30 20 20 2f 2a 20   0x00002000  /* 
56a0: 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c  OR using multipl
56b0: 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 23 64 65  e indices */.#de
56c0: 66 69 6e 65 20 57 48 45 52 45 5f 41 55 54 4f 5f  fine WHERE_AUTO_
56d0: 49 4e 44 45 58 20 20 20 30 78 30 30 30 30 34 30  INDEX   0x000040
56e0: 30 30 20 20 2f 2a 20 55 73 65 73 20 61 6e 20 65  00  /* Uses an e
56f0: 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 2a  phemeral index *
5700: 2f 0a 0a 0a 2f 2a 20 43 6f 6e 76 65 72 74 20 61  /.../* Convert a
5710: 20 57 68 65 72 65 43 6f 73 74 20 76 61 6c 75 65   WhereCost value
5720: 20 28 31 30 20 74 69 6d 65 73 20 6c 6f 67 32 28   (10 times log2(
5730: 58 29 29 20 69 6e 74 6f 20 69 74 73 20 69 6e 74  X)) into its int
5740: 65 67 65 72 20 76 61 6c 75 65 20 58 2e 0a 2a 2a  eger value X..**
5750: 20 41 20 72 6f 75 67 68 20 61 70 70 72 6f 78 69   A rough approxi
5760: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  mation is used. 
5770: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
5780: 6e 65 64 20 69 73 20 6e 6f 74 20 65 78 61 63 74  ned is not exact
5790: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20  ..*/.static u64 
57a0: 77 68 65 72 65 43 6f 73 74 54 6f 49 6e 74 28 57  whereCostToInt(W
57b0: 68 65 72 65 43 6f 73 74 20 78 29 7b 0a 20 20 75  hereCost x){.  u
57c0: 36 34 20 6e 3b 0a 20 20 69 66 28 20 78 3c 31 30  64 n;.  if( x<10
57d0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6e   ) return 1;.  n
57e0: 20 3d 20 78 25 31 30 3b 0a 20 20 78 20 2f 3d 20   = x%10;.  x /= 
57f0: 31 30 3b 0a 20 20 69 66 28 20 6e 3e 3d 35 20 29  10;.  if( n>=5 )
5800: 20 6e 20 2d 3d 20 32 3b 0a 20 20 65 6c 73 65 20   n -= 2;.  else 
5810: 69 66 28 20 6e 3e 3d 31 20 29 20 6e 20 2d 3d 20  if( n>=1 ) n -= 
5820: 31 3b 0a 20 20 69 66 28 20 78 3e 3d 33 20 29 20  1;.  if( x>=3 ) 
5830: 72 65 74 75 72 6e 20 28 6e 2b 38 29 3c 3c 28 78  return (n+8)<<(x
5840: 2d 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 6e  -3);.  return (n
5850: 2b 38 29 3e 3e 28 33 2d 78 29 3b 0a 7d 0a 0a 2f  +8)>>(3-x);.}../
5860: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5870: 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
5880: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
5890: 66 72 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61  from a WHERE cla
58a0: 75 73 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74  use.*/.u64 sqlit
58b0: 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77  e3WhereOutputRow
58c0: 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20  Count(WhereInfo 
58d0: 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75  *pWInfo){.  retu
58e0: 72 6e 20 77 68 65 72 65 43 6f 73 74 54 6f 49 6e  rn whereCostToIn
58f0: 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  t(pWInfo->nRowOu
5900: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
5910: 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 57  urn one of the W
5920: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78 78  HERE_DISTINCT_xx
5930: 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69 6e  xxx values to in
5940: 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73 0a  dicate how this.
5950: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
5960: 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73 20  returns outputs 
5970: 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f  for DISTINCT pro
5980: 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  cessing..*/.int 
5990: 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
59a0: 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66 6f  stinct(WhereInfo
59b0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
59c0: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  urn pWInfo->eDis
59d0: 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinct;.}../*.** 
59e0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
59f0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
5a00: 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20  returns rows in 
5a10: 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e 0a  ORDER BY order..
5a20: 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  ** Return FALSE 
5a30: 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e 65  if the output ne
5a40: 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65 64  eds to be sorted
5a50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5a60: 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 57  WhereIsOrdered(W
5a70: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
5a80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  ){.  return pWIn
5a90: 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30 3b 0a 7d  fo->bOBSat!=0;.}
5aa0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5ab0: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
5ac0: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
5ad0: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
5ae0: 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65  continue.** imme
5af0: 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65  diately with the
5b00: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57   next row of a W
5b10: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
5b20: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
5b30: 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68  ContinueLabel(Wh
5b40: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
5b50: 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  {.  return pWInf
5b60: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  o->iContinue;.}.
5b70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5b80: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
5b90: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
5ba0: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  to in order to b
5bb0: 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61  reak.** out of a
5bc0: 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a   WHERE loop..*/.
5bd0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
5be0: 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72 65  BreakLabel(Where
5bf0: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
5c00: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
5c10: 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iBreak;.}../*.**
5c20: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5c30: 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
5c40: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 63 61  ETE statement ca
5c50: 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65 63 74  n operate direct
5c60: 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f 77  ly on.** the row
5c70: 69 64 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ids returned by 
5c80: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  a WHERE clause. 
5c90: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
5ca0: 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55 50 44   doing an.** UPD
5cb0: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6d 69  ATE or DELETE mi
5cc0: 67 68 74 20 63 68 61 6e 67 65 20 73 75 62 73 65  ght change subse
5cd0: 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c 61 75  quent WHERE clau
5ce0: 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 69  se results..*/.i
5cf0: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f  nt sqlite3WhereO
5d00: 6b 4f 6e 65 50 61 73 73 28 57 68 65 72 65 49 6e  kOnePass(WhereIn
5d10: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
5d20: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6f 6b  eturn pWInfo->ok
5d30: 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  OnePass;.}../*.*
5d40: 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f 6e 74 65  * Move the conte
5d50: 6e 74 20 6f 66 20 70 53 72 63 20 69 6e 74 6f 20  nt of pSrc into 
5d60: 70 44 65 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  pDest.*/.static 
5d70: 76 6f 69 64 20 77 68 65 72 65 4f 72 4d 6f 76 65  void whereOrMove
5d80: 28 57 68 65 72 65 4f 72 53 65 74 20 2a 70 44 65  (WhereOrSet *pDe
5d90: 73 74 2c 20 57 68 65 72 65 4f 72 53 65 74 20 2a  st, WhereOrSet *
5da0: 70 53 72 63 29 7b 0a 20 20 70 44 65 73 74 2d 3e  pSrc){.  pDest->
5db0: 6e 20 3d 20 70 53 72 63 2d 3e 6e 3b 0a 20 20 6d  n = pSrc->n;.  m
5dc0: 65 6d 63 70 79 28 70 44 65 73 74 2d 3e 61 2c 20  emcpy(pDest->a, 
5dd0: 70 53 72 63 2d 3e 61 2c 20 70 44 65 73 74 2d 3e  pSrc->a, pDest->
5de0: 6e 2a 73 69 7a 65 6f 66 28 70 44 65 73 74 2d 3e  n*sizeof(pDest->
5df0: 61 5b 30 5d 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  a[0]));.}../*.**
5e00: 20 54 72 79 20 74 6f 20 69 6e 73 65 72 74 20 61   Try to insert a
5e10: 20 6e 65 77 20 70 72 65 72 65 71 75 69 73 69 74   new prerequisit
5e20: 65 2f 63 6f 73 74 20 65 6e 74 72 79 20 69 6e 74  e/cost entry int
5e30: 6f 20 74 68 65 20 57 68 65 72 65 4f 72 53 65 74  o the WhereOrSet
5e40: 20 70 53 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pSet..**.** The
5e50: 20 6e 65 77 20 65 6e 74 72 79 20 6d 69 67 68 74   new entry might
5e60: 20 6f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78   overwrite an ex
5e70: 69 73 74 69 6e 67 20 65 6e 74 72 79 2c 20 6f 72  isting entry, or
5e80: 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20   it might be.** 
5e90: 61 70 70 65 6e 64 65 64 2c 20 6f 72 20 69 74 20  appended, or it 
5ea0: 6d 69 67 68 74 20 62 65 20 64 69 73 63 61 72 64  might be discard
5eb0: 65 64 2e 20 20 44 6f 20 77 68 61 74 65 76 65 72  ed.  Do whatever
5ec0: 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 68   is the right th
5ed0: 69 6e 67 0a 2a 2a 20 73 6f 20 74 68 61 74 20 70  ing.** so that p
5ee0: 53 65 74 20 6b 65 65 70 73 20 74 68 65 20 4e 5f  Set keeps the N_
5ef0: 4f 52 5f 43 4f 53 54 20 62 65 73 74 20 65 6e 74  OR_COST best ent
5f00: 72 69 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72  ries seen so far
5f10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5f20: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 0a 20  whereOrInsert(. 
5f30: 20 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53 65   WhereOrSet *pSe
5f40: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  t,      /* The W
5f50: 68 65 72 65 4f 72 53 65 74 20 74 6f 20 62 65 20  hereOrSet to be 
5f60: 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 42 69 74  updated */.  Bit
5f70: 6d 61 73 6b 20 70 72 65 72 65 71 2c 20 20 20 20  mask prereq,    
5f80: 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 69 73      /* Prerequis
5f90: 69 74 65 73 20 6f 66 20 74 68 65 20 6e 65 77 20  ites of the new 
5fa0: 65 6e 74 72 79 20 2a 2f 0a 20 20 57 68 65 72 65  entry */.  Where
5fb0: 43 6f 73 74 20 72 52 75 6e 2c 20 20 20 20 20 20  Cost rRun,      
5fc0: 20 20 2f 2a 20 52 75 6e 2d 63 6f 73 74 20 6f 66    /* Run-cost of
5fd0: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a   the new entry *
5fe0: 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e 4f  /.  WhereCost nO
5ff0: 75 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ut         /* Nu
6000: 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73 20  mber of outputs 
6010: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
6020: 79 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 69 3b  y */.){.  u16 i;
6030: 0a 20 20 57 68 65 72 65 4f 72 43 6f 73 74 20 2a  .  WhereOrCost *
6040: 70 3b 0a 20 20 66 6f 72 28 69 3d 70 53 65 74 2d  p;.  for(i=pSet-
6050: 3e 6e 2c 20 70 3d 70 53 65 74 2d 3e 61 3b 20 69  >n, p=pSet->a; i
6060: 3e 30 3b 20 69 2d 2d 2c 20 70 2b 2b 29 7b 0a 20  >0; i--, p++){. 
6070: 20 20 20 69 66 28 20 72 52 75 6e 3c 3d 70 2d 3e     if( rRun<=p->
6080: 72 52 75 6e 20 26 26 20 28 70 72 65 72 65 71 20  rRun && (prereq 
6090: 26 20 70 2d 3e 70 72 65 72 65 71 29 3d 3d 70 72  & p->prereq)==pr
60a0: 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 67 6f  ereq ){.      go
60b0: 74 6f 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74  to whereOrInsert
60c0: 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  _done;.    }.   
60d0: 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52   if( p->rRun<=rR
60e0: 75 6e 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71  un && (p->prereq
60f0: 20 26 20 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70   & prereq)==p->p
6100: 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 72  rereq ){.      r
6110: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
6120: 20 7d 0a 20 20 69 66 28 20 70 53 65 74 2d 3e 6e   }.  if( pSet->n
6130: 3c 4e 5f 4f 52 5f 43 4f 53 54 20 29 7b 0a 20 20  <N_OR_COST ){.  
6140: 20 20 70 20 3d 20 26 70 53 65 74 2d 3e 61 5b 70    p = &pSet->a[p
6150: 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a 20 20 20 20 70  Set->n++];.    p
6160: 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a 20  ->nOut = nOut;. 
6170: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
6180: 70 53 65 74 2d 3e 61 3b 0a 20 20 20 20 66 6f 72  pSet->a;.    for
6190: 28 69 3d 31 3b 20 69 3c 70 53 65 74 2d 3e 6e 3b  (i=1; i<pSet->n;
61a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
61b0: 20 70 2d 3e 72 52 75 6e 3e 70 53 65 74 2d 3e 61   p->rRun>pSet->a
61c0: 5b 69 5d 2e 72 52 75 6e 20 29 20 70 20 3d 20 70  [i].rRun ) p = p
61d0: 53 65 74 2d 3e 61 20 2b 20 69 3b 0a 20 20 20 20  Set->a + i;.    
61e0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75  }.    if( p->rRu
61f0: 6e 3c 3d 72 52 75 6e 20 29 20 72 65 74 75 72 6e  n<=rRun ) return
6200: 20 30 3b 0a 20 20 7d 0a 77 68 65 72 65 4f 72 49   0;.  }.whereOrI
6210: 6e 73 65 72 74 5f 64 6f 6e 65 3a 0a 20 20 70 2d  nsert_done:.  p-
6220: 3e 70 72 65 72 65 71 20 3d 20 70 72 65 72 65 71  >prereq = prereq
6230: 3b 0a 20 20 70 2d 3e 72 52 75 6e 20 3d 20 72 52  ;.  p->rRun = rR
6240: 75 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 75  un;.  if( p->nOu
6250: 74 3e 6e 4f 75 74 20 29 20 70 2d 3e 6e 4f 75 74  t>nOut ) p->nOut
6260: 20 3d 20 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72   = nOut;.  retur
6270: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 1;.}../*.** In
6280: 69 74 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c  itialize a preal
6290: 6c 6f 63 61 74 65 64 20 57 68 65 72 65 43 6c 61  located WhereCla
62a0: 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  use structure..*
62b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
62c0: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20  ereClauseInit(. 
62d0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
62e0: 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  C,        /* The
62f0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20   WhereClause to 
6300: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  be initialized *
6310: 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
6320: 57 49 6e 66 6f 20 20 20 20 20 20 20 20 2f 2a 20  WInfo        /* 
6330: 54 68 65 20 57 48 45 52 45 20 70 72 6f 63 65 73  The WHERE proces
6340: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6350: 29 7b 0a 20 20 70 57 43 2d 3e 70 57 49 6e 66 6f  ){.  pWC->pWInfo
6360: 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 70 57 43   = pWInfo;.  pWC
6370: 2d 3e 70 4f 75 74 65 72 20 3d 20 30 3b 0a 20 20  ->pOuter = 0;.  
6380: 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a  pWC->nTerm = 0;.
6390: 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41    pWC->nSlot = A
63a0: 72 72 61 79 53 69 7a 65 28 70 57 43 2d 3e 61 53  rraySize(pWC->aS
63b0: 74 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61  tatic);.  pWC->a
63c0: 20 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b   = pWC->aStatic;
63d0: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
63e0: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
63f0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61  ic void whereCla
6400: 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c  useClear(WhereCl
6410: 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44  ause*);../*.** D
6420: 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65  eallocate all me
6430: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
6440: 77 69 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e  with a WhereOrIn
6450: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
6460: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f  atic void whereO
6470: 72 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69  rInfoDelete(sqli
6480: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72  te3 *db, WhereOr
6490: 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72  Info *p){.  wher
64a0: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d  eClauseClear(&p-
64b0: 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  >wc);.  sqlite3D
64c0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
64d0: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
64e0: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
64f0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57  ociated with a W
6500: 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65  hereAndInfo obje
6510: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
6520: 69 64 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44  id whereAndInfoD
6530: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
6540: 62 2c 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20  b, WhereAndInfo 
6550: 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75  *p){.  whereClau
6560: 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b  seClear(&p->wc);
6570: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
6580: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
6590: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57  * Deallocate a W
65a0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
65b0: 74 75 72 65 2e 20 20 54 68 65 20 57 68 65 72 65  ture.  The Where
65c0: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
65d0: 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f  .** itself is no
65e0: 74 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 72  t freed.  This r
65f0: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e  outine is the in
6600: 76 65 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c  verse of whereCl
6610: 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73  auseInit()..*/.s
6620: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
6630: 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72  ClauseClear(Wher
6640: 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20  eClause *pWC){. 
6650: 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54   int i;.  WhereT
6660: 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65  erm *a;.  sqlite
6670: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49  3 *db = pWC->pWI
6680: 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
6690: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
66a0: 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b  erm-1, a=pWC->a;
66b0: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29   i>=0; i--, a++)
66c0: 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46  {.    if( a->wtF
66d0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41  lags & TERM_DYNA
66e0: 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MIC ){.      sql
66f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
6700: 62 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20  b, a->pExpr);.  
6710: 20 20 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e 77    }.    if( a->w
6720: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
6730: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68  INFO ){.      wh
6740: 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28  ereOrInfoDelete(
6750: 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f  db, a->u.pOrInfo
6760: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
6770: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
6780: 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20  RM_ANDINFO ){.  
6790: 20 20 20 20 77 68 65 72 65 41 6e 64 49 6e 66 6f      whereAndInfo
67a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
67b0: 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  pAndInfo);.    }
67c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e  .  }.  if( pWC->
67d0: 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  a!=pWC->aStatic 
67e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
67f0: 46 72 65 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Free(db, pWC->a)
6800: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ;.  }.}../* Forw
6810: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
6820: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43  */.static WhereC
6830: 6f 73 74 20 77 68 65 72 65 43 6f 73 74 28 74 52  ost whereCost(tR
6840: 6f 77 63 6e 74 20 78 29 3b 0a 0a 2f 2a 0a 2a 2a  owcnt x);../*.**
6850: 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 6e 65   Add a single ne
6860: 77 20 57 68 65 72 65 54 65 72 6d 20 65 6e 74 72  w WhereTerm entr
6870: 79 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c  y to the WhereCl
6880: 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e  ause object pWC.
6890: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57 68 65 72  .** The new Wher
68a0: 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20  eTerm object is 
68b0: 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d  constructed from
68c0: 20 45 78 70 72 20 70 20 61 6e 64 20 77 69 74 68   Expr p and with
68d0: 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65   wtFlags..** The
68e0: 20 69 6e 64 65 78 20 69 6e 20 70 57 43 2d 3e 61   index in pWC->a
68f0: 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77 20 57 68  [] of the new Wh
6900: 65 72 65 54 65 72 6d 20 69 73 20 72 65 74 75 72  ereTerm is retur
6910: 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ned on success..
6920: 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  ** 0 is returned
6930: 20 69 66 20 74 68 65 20 6e 65 77 20 57 68 65 72   if the new Wher
6940: 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20  eTerm could not 
6950: 62 65 20 61 64 64 65 64 20 64 75 65 20 74 6f 20  be added due to 
6960: 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f  a memory.** allo
6970: 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54  cation error.  T
6980: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
6990: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 77 69 6c  tion failure wil
69a0: 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e  l be recorded in
69b0: 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  .** the db->mall
69c0: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 6f  ocFailed flag so
69d0: 20 74 68 61 74 20 68 69 67 68 65 72 2d 6c 65 76   that higher-lev
69e0: 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  el functions can
69f0: 20 64 65 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a   detect it..**.*
6a00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
6a10: 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65  ill increase the
6a20: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 57 43   size of the pWC
6a30: 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61 73 20 6e  ->a[] array as n
6a40: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
6a50: 49 66 20 74 68 65 20 77 74 46 6c 61 67 73 20 61  If the wtFlags a
6a60: 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73  rgument includes
6a70: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74   TERM_DYNAMIC, t
6a80: 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  hen responsibili
6a90: 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e  ty.** for freein
6aa0: 67 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  g the expression
6ab0: 20 70 20 69 73 20 61 73 73 75 6d 65 64 20 62 79   p is assumed by
6ac0: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
6ad0: 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20   object pWC..** 
6ae0: 54 68 69 73 20 69 73 20 74 72 75 65 20 65 76 65  This is true eve
6af0: 6e 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  n if this routin
6b00: 65 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63  e fails to alloc
6b10: 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 54  ate a new WhereT
6b20: 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49  erm..**.** WARNI
6b30: 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e  NG:  This routin
6b40: 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63 61  e might realloca
6b50: 74 65 20 74 68 65 20 73 70 61 63 65 20 75 73 65  te the space use
6b60: 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68  d to store.** Wh
6b70: 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70  ereTerms.  All p
6b80: 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65 72 65  ointers to Where
6b90: 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62 65 20  Terms should be 
6ba0: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 66 74 65  invalidated afte
6bb0: 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69  r.** calling thi
6bc0: 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75 63 68  s routine.  Such
6bd0: 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20 62 65   pointers may be
6be0: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62   reinitialized b
6bf0: 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a  y referencing.**
6c00: 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72   the pWC->a[] ar
6c10: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ray..*/.static i
6c20: 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  nt whereClauseIn
6c30: 73 65 72 74 28 57 68 65 72 65 43 6c 61 75 73 65  sert(WhereClause
6c40: 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 2c 20   *pWC, Expr *p, 
6c50: 75 38 20 77 74 46 6c 61 67 73 29 7b 0a 20 20 57  u8 wtFlags){.  W
6c60: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
6c70: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 74 65  .  int idx;.  te
6c80: 73 74 63 61 73 65 28 20 77 74 46 6c 61 67 73 20  stcase( wtFlags 
6c90: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
6ca0: 3b 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65  ;.  if( pWC->nTe
6cb0: 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29  rm>=pWC->nSlot )
6cc0: 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
6cd0: 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a  *pOld = pWC->a;.
6ce0: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
6cf0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
6d00: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70  Parse->db;.    p
6d10: 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  WC->a = sqlite3D
6d20: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
6d30: 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29  izeof(pWC->a[0])
6d40: 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b  *pWC->nSlot*2 );
6d50: 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d  .    if( pWC->a=
6d60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
6d70: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44  wtFlags & TERM_D
6d80: 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20  YNAMIC ){.      
6d90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6da0: 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ete(db, p);.    
6db0: 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61    }.      pWC->a
6dc0: 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72   = pOld;.      r
6dd0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
6de0: 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61     memcpy(pWC->a
6df0: 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70  , pOld, sizeof(p
6e00: 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e  WC->a[0])*pWC->n
6e10: 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Term);.    if( p
6e20: 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69  Old!=pWC->aStati
6e30: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
6e40: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c  e3DbFree(db, pOl
6e50: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  d);.    }.    pW
6e60: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74  C->nSlot = sqlit
6e70: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64  e3DbMallocSize(d
6e80: 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f  b, pWC->a)/sizeo
6e90: 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20  f(pWC->a[0]);.  
6ea0: 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43  }.  pTerm = &pWC
6eb0: 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e  ->a[idx = pWC->n
6ec0: 54 65 72 6d 2b 2b 5d 3b 0a 20 20 69 66 28 20 77  Term++];.  if( w
6ed0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
6ee0: 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 70 54 65  RTUAL ){.    pTe
6ef0: 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20 3d 20  rm->truthProb = 
6f00: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
6f10: 20 26 26 20 45 78 70 72 48 61 73 41 6e 79 50 72   && ExprHasAnyPr
6f20: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 48 69 6e  operty(p, EP_Hin
6f30: 74 29 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  t) ){.    pTerm-
6f40: 3e 74 72 75 74 68 50 72 6f 62 20 3d 20 77 68 65  >truthProb = whe
6f50: 72 65 43 6f 73 74 28 70 2d 3e 69 54 61 62 6c 65  reCost(p->iTable
6f60: 29 20 2d 20 39 39 3b 0a 20 20 7d 65 6c 73 65 7b  ) - 99;.  }else{
6f70: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 74 72 75 74  .    pTerm->trut
6f80: 68 50 72 6f 62 20 3d 20 2d 31 3b 0a 20 20 7d 0a  hProb = -1;.  }.
6f90: 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d    pTerm->pExpr =
6fa0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
6fb0: 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20 20 70 54  Collate(p);.  pT
6fc0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77  erm->wtFlags = w
6fd0: 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d  tFlags;.  pTerm-
6fe0: 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54  >pWC = pWC;.  pT
6ff0: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d  erm->iParent = -
7000: 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b  1;.  return idx;
7010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
7020: 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65  outine identifie
7030: 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  s subexpressions
7040: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
7050: 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61  ause where.** ea
7060: 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ch subexpression
7070: 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
7080: 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   the AND operato
7090: 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a  r or some other.
70a0: 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63  ** operator spec
70b0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20  ified in the op 
70c0: 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20  parameter.  The 
70d0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
70e0: 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c  cture.** is fill
70f0: 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73  ed with pointers
7100: 20 74 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f   to subexpressio
7110: 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ns.  For example
7120: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45  :.**.**    WHERE
7130: 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44    a=='hello' AND
7140: 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c   coalesce(b,11)<
7150: 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20  10 AND (c+12!=d 
7160: 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20  OR c==22).**    
7170: 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
7180: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
7190: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f  ______/     \___
71a0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
71b0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f  *            slo
71c0: 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20 20  t[0]            
71d0: 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20  slot[1]         
71e0: 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a        slot[2].**
71f0: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
7200: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
7210: 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65   pExpr is unalte
7220: 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72  red.  All this r
7230: 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69  outine.** does i
7240: 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e  s make slot[] en
7250: 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73  tries point to s
7260: 75 62 73 74 72 75 63 74 75 72 65 20 77 69 74 68  ubstructure with
7270: 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20  in pExpr..**.** 
7280: 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  In the previous 
7290: 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20  sentence and in 
72a0: 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c  the diagram, "sl
72b0: 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a  ot[]" refers to.
72c0: 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ** the WhereClau
72d0: 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54  se.a[] array.  T
72e0: 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20  he slot[] array 
72f0: 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20  grows as needed 
7300: 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c  to contain.** al
7310: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  l terms of the W
7320: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
7330: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
7340: 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75  eSplit(WhereClau
7350: 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
7360: 45 78 70 72 2c 20 75 38 20 6f 70 29 7b 0a 20 20  Expr, u8 op){.  
7370: 70 57 43 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20  pWC->op = op;.  
7380: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
7390: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
73a0: 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20  pr->op!=op ){.  
73b0: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73    whereClauseIns
73c0: 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20  ert(pWC, pExpr, 
73d0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
73e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
73f0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f   pExpr->pLeft, o
7400: 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  p);.    whereSpl
7410: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
7420: 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a  Right, op);.  }.
7430: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
7440: 69 7a 65 20 61 20 57 68 65 72 65 4d 61 73 6b 53  ize a WhereMaskS
7450: 65 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 23 64 65  et object.*/.#de
7460: 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74  fine initMaskSet
7470: 28 50 29 20 20 28 50 29 2d 3e 6e 3d 30 0a 0a 2f  (P)  (P)->n=0../
7480: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7490: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
74a0: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
74b0: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
74c0: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
74d0: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
74e0: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
74f0: 6b 20 67 65 74 4d 61 73 6b 28 57 68 65 72 65 4d  k getMask(WhereM
7500: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
7510: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
7520: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
7530: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d  t( pMaskSet->n<=
7540: 28 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d  (int)sizeof(Bitm
7550: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28  ask)*8 );.  for(
7560: 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d  i=0; i<pMaskSet-
7570: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  >n; i++){.    if
7580: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69  ( pMaskSet->ix[i
7590: 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  ]==iCursor ){.  
75a0: 20 20 20 20 72 65 74 75 72 6e 20 4d 41 53 4b 42      return MASKB
75b0: 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  IT(i);.    }.  }
75c0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
75d0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
75e0: 65 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73  ew mask for curs
75f0: 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  or iCursor..**.*
7600: 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63  * There is one c
7610: 75 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20  ursor per table 
7620: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
7630: 73 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  se.  The number 
7640: 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20  of.** tables in 
7650: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
7660: 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20  is limited by a 
7670: 74 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68  test early in th
7680: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72  e.** sqlite3Wher
7690: 65 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65  eBegin() routine
76a0: 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68  .  So we know th
76b0: 61 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d  at the pMaskSet-
76c0: 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77  >ix[].** array w
76d0: 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c  ill never overfl
76e0: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ow..*/.static vo
76f0: 69 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68  id createMask(Wh
7700: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
7710: 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f  kSet, int iCurso
7720: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d  r){.  assert( pM
7730: 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61  askSet->n < Arra
7740: 79 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e  ySize(pMaskSet->
7750: 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65  ix) );.  pMaskSe
7760: 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e  t->ix[pMaskSet->
7770: 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a  n++] = iCursor;.
7780: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72  }../*.** These r
7790: 6f 75 74 69 6e 65 73 20 77 61 6c 6b 20 28 72 65  outines walk (re
77a0: 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65 78  cursively) an ex
77b0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e  pression tree an
77c0: 64 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 61 20  d generate.** a 
77d0: 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69  bitmask indicati
77e0: 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65 73 20  ng which tables 
77f0: 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 61 74  are used in that
7800: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74   expression.** t
7810: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  ree..*/.static B
7820: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
7830: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
7840: 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73  askSet*, ExprLis
7850: 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d  t*);.static Bitm
7860: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
7870: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
7880: 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29  skSet*, Select*)
7890: 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  ;.static Bitmask
78a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
78b0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
78c0: 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29  askSet, Expr *p)
78d0: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
78e0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30   = 0;.  if( p==0
78f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
7900: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
7910: 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20  UMN ){.    mask 
7920: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
7930: 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a  et, p->iTable);.
7940: 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b      return mask;
7950: 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78  .  }.  mask = ex
7960: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
7970: 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74  skSet, p->pRight
7980: 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  );.  mask |= exp
7990: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
79a0: 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  kSet, p->pLeft);
79b0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
79c0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
79d0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6d  Select) ){.    m
79e0: 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63  ask |= exprSelec
79f0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
7a00: 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65  kSet, p->x.pSele
7a10: 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ct);.  }else{.  
7a20: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
7a30: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
7a40: 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73  skSet, p->x.pLis
7a50: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
7a60: 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20   mask;.}.static 
7a70: 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74  Bitmask exprList
7a80: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
7a90: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
7aa0: 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  t, ExprList *pLi
7ab0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
7ac0: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
7ad0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
7ae0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7af0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
7b00: 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c  +){.      mask |
7b10: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
7b20: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74  (pMaskSet, pList
7b30: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
7b40: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7b50: 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63  n mask;.}.static
7b60: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c   Bitmask exprSel
7b70: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68  ectTableUsage(Wh
7b80: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
7b90: 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53  kSet, Select *pS
7ba0: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  ){.  Bitmask mas
7bb0: 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  k = 0;.  while( 
7bc0: 70 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  pS ){.    SrcLis
7bd0: 74 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70 53  t *pSrc = pS->pS
7be0: 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  rc;.    mask |= 
7bf0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
7c00: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
7c10: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61  >pEList);.    ma
7c20: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
7c30: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
7c40: 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29  t, pS->pGroupBy)
7c50: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
7c60: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
7c70: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
7c80: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61  OrderBy);.    ma
7c90: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
7ca0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
7cb0: 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  S->pWhere);.    
7cc0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
7cd0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7ce0: 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20   pS->pHaving);. 
7cf0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53     if( ALWAYS(pS
7d00: 72 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  rc!=0) ){.      
7d10: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
7d20: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
7d30: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
7d40: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65    mask |= exprSe
7d50: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70  lectTableUsage(p
7d60: 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61  MaskSet, pSrc->a
7d70: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
7d80: 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78        mask |= ex
7d90: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
7da0: 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69  skSet, pSrc->a[i
7db0: 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ].pOn);.      }.
7dc0: 20 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20 70      }.    pS = p
7dd0: 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20  S->pPrior;.  }. 
7de0: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
7df0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
7e00: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
7e10: 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20  operator is one 
7e20: 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  of the operators
7e30: 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f   that is.** allo
7e40: 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  wed for an index
7e50: 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  able WHERE claus
7e60: 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c  e term.  The all
7e70: 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61  owed operators a
7e80: 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20  re.** "=", "<", 
7e90: 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c  ">", "<=", ">=",
7ea0: 20 22 49 4e 22 2c 20 61 6e 64 20 22 49 53 20 4e   "IN", and "IS N
7eb0: 55 4c 4c 22 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ULL".*/.static i
7ec0: 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74  nt allowedOp(int
7ed0: 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   op){.  assert( 
7ee0: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_GT>TK_EQ && T
7ef0: 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_GT<TK_GE );.  
7f00: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b  assert( TK_LT>TK
7f10: 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f  _EQ && TK_LT<TK_
7f20: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
7f30: 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LE>TK_EQ && T
7f40: 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LE<TK_GE );.  
7f50: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
7f60: 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75  K_EQ+4 );.  retu
7f70: 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  rn op==TK_IN || 
7f80: 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70  (op>=TK_EQ && op
7f90: 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d  <=TK_GE) || op==
7fa0: 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a  TK_ISNULL;.}../*
7fb0: 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a  .** Swap two obj
7fc0: 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 59 50  ects of type TYP
7fd0: 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57  E..*/.#define SW
7fe0: 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59  AP(TYPE,A,B) {TY
7ff0: 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74  PE t=A; A=B; B=t
8000: 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74  ;}../*.** Commut
8010: 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  e a comparison o
8020: 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73  perator.  Expres
8030: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
8040: 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72  m "X op Y".** ar
8050: 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
8060: 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a   "Y op X"..**.**
8070: 20 49 66 20 6c 65 66 74 2f 72 69 67 68 74 20 70   If left/right p
8080: 72 65 63 65 64 65 6e 63 65 20 72 75 6c 65 73 20  recedence rules 
8090: 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20 77  come into play w
80a0: 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  hen determining 
80b0: 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  the.** collating
80c0: 20 73 65 71 75 65 6e 63 65 2c 20 74 68 65 6e 20   sequence, then 
80d0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
80e0: 73 20 61 72 65 20 61 64 6a 75 73 74 65 64 20 74  s are adjusted t
80f0: 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74  o ensure.** that
8100: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
8110: 65 71 75 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74  equence does not
8120: 20 63 68 61 6e 67 65 2e 20 20 46 6f 72 20 65 78   change.  For ex
8130: 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20 63 6f 6c  ample:.** "Y col
8140: 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 58  late NOCASE op X
8150: 22 20 62 65 63 6f 6d 65 73 20 22 58 20 6f 70 20  " becomes "X op 
8160: 59 22 20 62 65 63 61 75 73 65 20 61 6e 79 20 63  Y" because any c
8170: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
8180: 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74  e on.** the left
8190: 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20   hand side of a 
81a0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72  comparison overr
81b0: 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69  ides any collati
81c0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20  on sequence .** 
81d0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
81e0: 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73  right. For the s
81f0: 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45  ame reason the E
8200: 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a  P_Collate flag.*
8210: 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65  * is not commute
8220: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
8230: 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50 61  d exprCommute(Pa
8240: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
8250: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36  r *pExpr){.  u16
8260: 20 65 78 70 52 69 67 68 74 20 3d 20 28 70 45 78   expRight = (pEx
8270: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67  pr->pRight->flag
8280: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b  s & EP_Collate);
8290: 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d  .  u16 expLeft =
82a0: 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   (pExpr->pLeft->
82b0: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
82c0: 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  te);.  assert( a
82d0: 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e  llowedOp(pExpr->
82e0: 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  op) && pExpr->op
82f0: 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66 28  !=TK_IN );.  if(
8300: 20 65 78 70 52 69 67 68 74 3d 3d 65 78 70 4c 65   expRight==expLe
8310: 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  ft ){.    /* Eit
8320: 68 65 72 20 58 20 61 6e 64 20 59 20 62 6f 74 68  her X and Y both
8330: 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70   have COLLATE op
8340: 65 72 61 74 6f 72 20 6f 72 20 6e 65 69 74 68 65  erator or neithe
8350: 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28 20  r do */.    if( 
8360: 65 78 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  expRight ){.    
8370: 20 20 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64 20    /* Both X and 
8380: 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f  Y have COLLATE o
8390: 70 65 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65 20  perators.  Make 
83a0: 73 75 72 65 20 58 20 69 73 20 61 6c 77 61 79 73  sure X is always
83b0: 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62  .      ** used b
83c0: 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 45  y clearing the E
83d0: 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20 66  P_Collate flag f
83e0: 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20 20  rom Y. */.      
83f0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
8400: 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c 6c  lags &= ~EP_Coll
8410: 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ate;.    }else i
8420: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
8430: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
8440: 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
8450: 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65 69 74 68  {.      /* Neith
8460: 65 72 20 58 20 6e 6f 72 20 59 20 68 61 76 65 20  er X nor Y have 
8470: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
8480: 73 2c 20 62 75 74 20 58 20 68 61 73 20 61 20 6e  s, but X has a n
8490: 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20 20 20 20  on-default.     
84a0: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65   ** collating se
84b0: 71 75 65 6e 63 65 2e 20 20 53 6f 20 61 64 64 20  quence.  So add 
84c0: 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 6d  the EP_Collate m
84d0: 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63 61  arker on X to ca
84e0: 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  use.      ** it 
84f0: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 66  to be searched f
8500: 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70  irst. */.      p
8510: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
8520: 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65  gs |= EP_Collate
8530: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53 57  ;.    }.  }.  SW
8540: 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e  AP(Expr*,pExpr->
8550: 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c  pRight,pExpr->pL
8560: 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70  eft);.  if( pExp
8570: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a  r->op>=TK_GT ){.
8580: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
8590: 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20  T==TK_GT+2 );.  
85a0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
85b0: 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20  =TK_LE+2 );.    
85c0: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
85d0: 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _EQ );.    asser
85e0: 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29  t( TK_GT<TK_LE )
85f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
8600: 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26  xpr->op>=TK_GT &
8610: 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f  & pExpr->op<=TK_
8620: 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  GE );.    pExpr-
8630: 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f  >op = ((pExpr->o
8640: 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47  p-TK_GT)^2)+TK_G
8650: 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  T;.  }.}../*.** 
8660: 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54  Translate from T
8670: 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f  K_xx operator to
8680: 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a   WO_xx bitmask..
8690: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70  */.static u16 op
86a0: 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f  eratorMask(int o
86b0: 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61  p){.  u16 c;.  a
86c0: 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70  ssert( allowedOp
86d0: 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70  (op) );.  if( op
86e0: 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63  ==TK_IN ){.    c
86f0: 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73   = WO_IN;.  }els
8700: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  e if( op==TK_ISN
8710: 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57  ULL ){.    c = W
8720: 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73  O_ISNULL;.  }els
8730: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e{.    assert( (
8740: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
8750: 29 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20  )) < 0x7fff );. 
8760: 20 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f     c = (u16)(WO_
8770: 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b  EQ<<(op-TK_EQ));
8780: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
8790: 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
87a0: 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a  c==WO_ISNULL );.
87b0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
87c0: 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20  _IN || c==WO_IN 
87d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
87e0: 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_EQ || c==WO_
87f0: 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EQ );.  assert( 
8800: 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d  op!=TK_LT || c==
8810: 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_LT );.  asser
8820: 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  t( op!=TK_LE || 
8830: 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73  c==WO_LE );.  as
8840: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20  sert( op!=TK_GT 
8850: 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20  || c==WO_GT );. 
8860: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
8870: 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29  GE || c==WO_GE )
8880: 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  ;.  return c;.}.
8890: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
88a0: 6f 20 74 68 65 20 6e 65 78 74 20 57 68 65 72 65  o the next Where
88b0: 54 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68 65  Term that matche
88c0: 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  s according to t
88d0: 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 65  he criteria.** e
88e0: 73 74 61 62 6c 69 73 68 65 64 20 77 68 65 6e 20  stablished when 
88f0: 74 68 65 20 70 53 63 61 6e 20 6f 62 6a 65 63 74  the pScan object
8900: 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64   was initialized
8910: 20 62 79 20 77 68 65 72 65 53 63 61 6e 49 6e 69   by whereScanIni
8920: 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e  t()..** Return N
8930: 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65  ULL if there are
8940: 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69 6e   no more matchin
8950: 67 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2f  g WhereTerms..*/
8960: 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72  .static WhereTer
8970: 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e 65 78 74  m *whereScanNext
8980: 28 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61  (WhereScan *pSca
8990: 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b 20  n){.  int iCur; 
89a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
89b0: 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20  e cursor on the 
89c0: 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 20  LHS of the term 
89d0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
89e0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
89f0: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 4c   column on the L
8a00: 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 2e 20  HS of the term. 
8a10: 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a 20   -1 for IPK */. 
8a20: 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
8a30: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72        /* An expr
8a40: 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 74 65 73  ession being tes
8a50: 74 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ted */.  WhereCl
8a60: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a  ause *pWC;    /*
8a70: 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70   Shorthand for p
8a80: 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20 57  Scan->pWC */.  W
8a90: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
8aa0: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
8ab0: 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a  being tested */.
8ac0: 20 20 69 6e 74 20 6b 20 3d 20 70 53 63 61 6e 2d    int k = pScan-
8ad0: 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20  >k;    /* Where 
8ae0: 74 6f 20 73 74 61 72 74 20 73 63 61 6e 6e 69 6e  to start scannin
8af0: 67 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 70  g */..  while( p
8b00: 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 70 53  Scan->iEquiv<=pS
8b10: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20  can->nEquiv ){. 
8b20: 20 20 20 69 43 75 72 20 3d 20 70 53 63 61 6e 2d     iCur = pScan-
8b30: 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e 69  >aEquiv[pScan->i
8b40: 45 71 75 69 76 2d 32 5d 3b 0a 20 20 20 20 69 43  Equiv-2];.    iC
8b50: 6f 6c 75 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61  olumn = pScan->a
8b60: 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71  Equiv[pScan->iEq
8b70: 75 69 76 2d 31 5d 3b 0a 20 20 20 20 77 68 69 6c  uiv-1];.    whil
8b80: 65 28 20 28 70 57 43 20 3d 20 70 53 63 61 6e 2d  e( (pWC = pScan-
8b90: 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20 20 20 20  >pWC)!=0 ){.    
8ba0: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
8bb0: 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65  >a+k; k<pWC->nTe
8bc0: 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; k++, pTerm++
8bd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
8be0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
8bf0: 3d 3d 69 43 75 72 20 26 26 20 70 54 65 72 6d 2d  ==iCur && pTerm-
8c00: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69  >u.leftColumn==i
8c10: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
8c20: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
8c30: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
8c40: 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20 20  QUIV)!=0.       
8c50: 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45      && pScan->nE
8c60: 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28 70  quiv<ArraySize(p
8c70: 53 63 61 6e 2d 3e 61 45 71 75 69 76 29 0a 20 20  Scan->aEquiv).  
8c80: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
8c90: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
8ca0: 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 73            pX = s
8cb0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
8cc0: 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45 78  llate(pTerm->pEx
8cd0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
8ce0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
8cf0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pX->op==TK_COLU
8d00: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  MN );.          
8d10: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 63    for(j=0; j<pSc
8d20: 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b 3d 32  an->nEquiv; j+=2
8d30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8d40: 20 69 66 28 20 70 53 63 61 6e 2d 3e 61 45 71 75   if( pScan->aEqu
8d50: 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c  iv[j]==pX->iTabl
8d60: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
8d70: 20 26 26 20 70 53 63 61 6e 2d 3e 61 45 71 75 69   && pScan->aEqui
8d80: 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c  v[j+1]==pX->iCol
8d90: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
8da0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8dd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
8de0: 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29  =pScan->nEquiv )
8df0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8e00: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d  pScan->aEquiv[j]
8e10: 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
8e30: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 20  an->aEquiv[j+1] 
8e40: 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  = pX->iColumn;. 
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
8e60: 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d 20 32 3b  an->nEquiv += 2;
8e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
8e80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8e90: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
8ea0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53 63  >eOperator & pSc
8eb0: 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29  an->opMask)!=0 )
8ec0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
8ed0: 20 56 65 72 69 66 79 20 74 68 65 20 61 66 66 69   Verify the affi
8ee0: 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69  nity and collati
8ef0: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74 63  ng sequence matc
8f00: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  h */.           
8f10: 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c   if( pScan->zCol
8f20: 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d 2d  lName && (pTerm-
8f30: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8f40: 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  ISNULL)==0 ){.  
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c              Coll
8f60: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
8f70: 20 20 20 20 20 20 20 20 20 20 50 61 72 73 65 20            Parse 
8f80: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
8f90: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20               pX 
8fb0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8fd0: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
8fe0: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53  ffinityOk(pX, pS
8ff0: 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a  can->idxaff) ){.
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9010: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9020: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9030: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
9040: 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  X->pLeft);.     
9050: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
9060: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
9070: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
9080: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65 66 74         pX->pLeft
90c0: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
90e0: 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
90f0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
9100: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
9110: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
9120: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
9130: 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d  l->zName, pScan-
9140: 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20  >zCollName) ){. 
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
9160: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
9170: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9190: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
91a0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
91b0: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
91c0: 20 20 26 26 20 28 70 58 20 3d 20 70 54 65 72 6d    && (pX = pTerm
91d0: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  ->pExpr->pRight)
91e0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
9200: 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 63 61  pX->iTable==pSca
9210: 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a 20 20 20  n->aEquiv[0].   
9220: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d            && pX-
9230: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d  >iColumn==pScan-
9240: 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20 20 20 20  >aEquiv[1].     
9250: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
9260: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
9270: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
9280: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61              pSca
9290: 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20  n->k = k+1;.    
92a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
92b0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
92c0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
92d0: 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e 2d    }.      pScan-
92e0: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57  >pWC = pScan->pW
92f0: 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 20  C->pOuter;.     
9300: 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20   k = 0;.    }.  
9310: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
9320: 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20  Scan->pOrigWC;. 
9330: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53     k = 0;.    pS
9340: 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b 3d 20 32  can->iEquiv += 2
9350: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
9360: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
9370: 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c  alize a WHERE cl
9380: 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a  ause scanner obj
9390: 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ect.  Return a p
93a0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
93b0: 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52   first match.  R
93c0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
93d0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68  ere are no match
93e0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  es..**.** The sc
93f0: 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65  anner will be se
9400: 61 72 63 68 69 6e 67 20 74 68 65 20 57 48 45 52  arching the WHER
9410: 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49  E clause pWC.  I
9420: 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66  t will look.** f
9430: 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  or terms of the 
9440: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
9450: 70 72 3e 22 20 77 68 65 72 65 20 58 20 69 73 20  pr>" where X is 
9460: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f  column iColumn o
9470: 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e  f table.** iCur.
9480: 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20    The <op> must 
9490: 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70  be one of the op
94a0: 65 72 61 74 6f 72 73 20 64 65 73 63 72 69 62 65  erators describe
94b0: 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a  d by opMask..**.
94c0: 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72 63 68  ** If the search
94d0: 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68   is for X and th
94e0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
94f0: 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66  ontains terms of
9500: 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59   the.** form X=Y
9510: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
9520: 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65  ne might also re
9530: 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  turn terms of th
9540: 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70  e form.** "Y <op
9550: 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20  > <expr>".  The 
9560: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
9570: 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69 74 79   of transitivity
9580: 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20   is limited,.** 
9590: 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f  but is enough to
95a0: 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d   handle most com
95b0: 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20  monly occurring 
95c0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  SQL statements..
95d0: 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f  **.** If X is no
95e0: 74 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  t the INTEGER PR
95f0: 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58  IMARY KEY then X
9600: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   must be compati
9610: 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65  ble with.** inde
9620: 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  x pIdx..*/.stati
9630: 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65  c WhereTerm *whe
9640: 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68  reScanInit(.  Wh
9650: 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20  ereScan *pScan, 
9660: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
9670: 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65  reScan object be
9680: 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ing initialized 
9690: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
96a0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20   *pWC,       /* 
96b0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
96c0: 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
96d0: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
96f0: 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f  ursor to scan fo
9700: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  r */.  int iColu
9710: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
9720: 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e  * Column to scan
9730: 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70   for */.  u32 op
9740: 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Mask,           
9750: 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29    /* Operator(s)
9760: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
9770: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
9780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
9790: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
97a0: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 20  with this index 
97b0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 0a  */.){.  int j;..
97c0: 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63 61    /* memset(pSca
97d0: 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53  n, 0, sizeof(*pS
97e0: 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63 61  can)); */.  pSca
97f0: 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57 43  n->pOrigWC = pWC
9800: 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d  ;.  pScan->pWC =
9810: 20 70 57 43 3b 0a 20 20 69 66 28 20 70 49 64 78   pWC;.  if( pIdx
9820: 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29   && iColumn>=0 )
9830: 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78  {.    pScan->idx
9840: 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  aff = pIdx->pTab
9850: 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
9860: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
9870: 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61  for(j=0; pIdx->a
9880: 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c  iColumn[j]!=iCol
9890: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
98a0: 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70 49   if( NEVER(j>=pI
98b0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20 72  dx->nColumn) ) r
98c0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
98d0: 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e     pScan->zCollN
98e0: 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  ame = pIdx->azCo
98f0: 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ll[j];.  }else{.
9900: 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66      pScan->idxaf
9910: 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e  f = 0;.    pScan
9920: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b  ->zCollName = 0;
9930: 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70  .  }.  pScan->op
9940: 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20  Mask = opMask;. 
9950: 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20   pScan->k = 0;. 
9960: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30   pScan->aEquiv[0
9970: 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63 61  ] = iCur;.  pSca
9980: 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20 3d 20 69  n->aEquiv[1] = i
9990: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d  Column;.  pScan-
99a0: 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 70  >nEquiv = 2;.  p
99b0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20 32  Scan->iEquiv = 2
99c0: 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72 65  ;.  return where
99d0: 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b  ScanNext(pScan);
99e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
99f0: 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74   for a term in t
9a00: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
9a10: 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66  that is of the f
9a20: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
9a30: 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69  r>".** where X i
9a40: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
9a50: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20   the iColumn of 
9a60: 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20 3c  table iCur and <
9a70: 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a  op> is one of.**
9a80: 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61   the WO_xx opera
9a90: 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69 66  tor codes specif
9aa0: 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70 61  ied by the op pa
9ab0: 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75  rameter..** Retu
9ac0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
9ad0: 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72  the term.  Retur
9ae0: 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  n 0 if not found
9af0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
9b00: 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20   returned might 
9b10: 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20 74  by Y=<expr> if t
9b20: 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72 20  here is another 
9b30: 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a  constraint in.**
9b40: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
9b50: 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  e that specifies
9b60: 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79 20   that X=Y.  Any 
9b70: 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 73  such constraints
9b80: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e   will be.** iden
9b90: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57 4f  tified by the WO
9ba0: 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74 68  _EQUIV bit in th
9bb0: 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  e pTerm->eOperat
9bc0: 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a  or field.  The.*
9bd0: 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72 61 79  * aEquiv[] array
9be0: 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61 6c 6c   holds X and all
9bf0: 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74 73   its equivalents
9c00: 2c 20 77 69 74 68 20 65 61 63 68 20 53 51 4c 20  , with each SQL 
9c10: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61 6b 69  variable.** taki
9c20: 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74 73 20  ng up two slots 
9c30: 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20 54 68  in aEquiv[].  Th
9c40: 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69 73 20  e first slot is 
9c50: 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20 6e  for the cursor n
9c60: 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65  umber.** and the
9c70: 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72 20 74   second is for t
9c80: 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
9c90: 2e 20 20 54 68 65 72 65 20 61 72 65 20 32 32 20  .  There are 22 
9ca0: 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76 5b  slots in aEquiv[
9cb0: 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d 65 61  ].** so that mea
9cc0: 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 66  ns we can look f
9cd0: 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f 20  or X plus up to 
9ce0: 31 30 20 6f 74 68 65 72 20 65 71 75 69 76 61 6c  10 other equival
9cf0: 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a 20 48  ent values..** H
9d00: 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66 6f  ence a search fo
9d10: 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  r X will return 
9d20: 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 20 61  <expr> if X=A1 a
9d30: 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32 3d  nd A1=A2 and A2=
9d40: 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20 61 6e  A3.** and ... an
9d50: 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31 30  d A9=A10 and A10
9d60: 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49  =<expr>..**.** I
9d70: 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c 74  f there are mult
9d80: 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74 68  iple terms in th
9d90: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
9da0: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
9db0: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74 68  p> <expr>".** th
9dc0: 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20 6f  en try for the o
9dd0: 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65 6e  ne with no depen
9de0: 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70 72  dencies on <expr
9df0: 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  > - in other wor
9e00: 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78 70  ds where.** <exp
9e10: 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  r> is a constant
9e20: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 73   expression of s
9e30: 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20  ome kind.  Only 
9e40: 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20 6f  return entries o
9e50: 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58  f.** the form "X
9e60: 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 59   <op> Y" where Y
9e70: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
9e80: 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 66  another table if
9e90: 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a 20   no terms of.** 
9ea0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
9eb0: 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20 65   <const-expr>" e
9ec0: 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74 65  xist.   If no te
9ed0: 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73 74  rms with a const
9ee0: 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73 74  ant RHS.** exist
9ef0: 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e 20  , try to return 
9f00: 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65 73  a term that does
9f10: 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55 49   not use WO_EQUI
9f20: 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  V..*/.static Whe
9f30: 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d  reTerm *findTerm
9f40: 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
9f50: 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pWC,     /* The
9f60: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
9f70: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
9f80: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
9f90: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
9fa0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  r number of LHS 
9fb0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
9fc0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
9fd0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c  lumn number of L
9fe0: 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  HS */.  Bitmask 
9ff0: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a  notReady,     /*
a000: 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76   RHS must not ov
a010: 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73 20  erlap with this 
a020: 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70  mask */.  u32 op
a030: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a040: 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78  /* Mask of WO_xx
a050: 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62 69   values describi
a060: 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ng operator */. 
a070: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
a080: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
a090: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
a0a0: 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66  h this index, if
a0b0: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a   not NULL */.){.
a0c0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 65    WhereTerm *pRe
a0d0: 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57 68 65 72  sult = 0;.  Wher
a0e0: 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72  eTerm *p;.  Wher
a0f0: 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70  eScan scan;..  p
a100: 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74   = whereScanInit
a110: 28 26 73 63 61 6e 2c 20 70 57 43 2c 20 69 43 75  (&scan, pWC, iCu
a120: 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20  r, iColumn, op, 
a130: 70 49 64 78 29 3b 0a 20 20 77 68 69 6c 65 28 20  pIdx);.  while( 
a140: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  p ){.    if( (p-
a150: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
a160: 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20  otReady)==0 ){. 
a170: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72       if( p->prer
a180: 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70  eqRight==0 && (p
a190: 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45  ->eOperator&WO_E
a1a0: 51 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Q)!=0 ){.       
a1b0: 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 20   return p;.     
a1c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52 65   }.      if( pRe
a1d0: 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73 75 6c  sult==0 ) pResul
a1e0: 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20  t = p;.    }.   
a1f0: 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65   p = whereScanNe
a200: 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d 0a 20  xt(&scan);.  }. 
a210: 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c 74 3b   return pResult;
a220: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
a230: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
a240: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
a250: 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 57 68  yze(SrcList*, Wh
a260: 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29  ereClause*, int)
a270: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78  ;../*.** Call ex
a280: 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c  prAnalyze on all
a290: 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52   terms in a WHER
a2a0: 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2f 0a 73  E clause.  .*/.s
a2b0: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
a2c0: 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63  nalyzeAll(.  Src
a2d0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
a2e0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
a2f0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
a300: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 20  ereClause *pWC  
a310: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48         /* the WH
a320: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
a330: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
a340: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
a350: 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69  =pWC->nTerm-1; i
a360: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65  >=0; i--){.    e
a370: 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c  xprAnalyze(pTabL
a380: 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20  ist, pWC, i);.  
a390: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
a3a0: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
a3b0: 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  TIMIZATION./*.**
a3c0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
a3d0: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
a3e0: 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20  ssion is a LIKE 
a3f0: 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  or GLOB operator
a400: 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20   that.** can be 
a410: 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20  optimized using 
a420: 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
a430: 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  raints.  Return 
a440: 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a  TRUE if it is.**
a450: 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66   so and false if
a460: 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f   not..**.** In o
a470: 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65  rder for the ope
a480: 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69  rator to be opti
a490: 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53  mizible, the RHS
a4a0: 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69 6e   must be a strin
a4b0: 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61  g.** literal tha
a4c0: 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
a4d0: 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72 64   with a wildcard
a4e0: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
a4f0: 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a  t isLikeOrGlob(.
a500: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a510: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
a520: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
a530: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
a540: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
a550: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
a560: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45  xpression */.  E
a570: 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c 20  xpr **ppPrefix, 
a580: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 54   /* Pointer to T
a590: 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73 73  K_STRING express
a5a0: 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72 6e  ion with pattern
a5b0: 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74   prefix */.  int
a5c0: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f   *pisComplete, /
a5d0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e  * True if the on
a5e0: 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20 25  ly wildcard is %
a5f0: 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61   in the last cha
a600: 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  racter */.  int 
a610: 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a  *pnoCase      /*
a620: 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63 61   True if upperca
a630: 73 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  se is equivalent
a640: 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f   to lowercase */
a650: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
a660: 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *z = 0;        
a670: 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52 48   /* String on RH
a680: 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74  S of LIKE operat
a690: 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  or */.  Expr *pR
a6a0: 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20  ight, *pLeft;   
a6b0: 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64 20     /* Right and 
a6c0: 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b  left size of LIK
a6d0: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
a6e0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
a6f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
a700: 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20 74  st of operands t
a710: 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  o the LIKE opera
a720: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20  tor */.  int c; 
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61      /* One chara
a750: 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20  cter in z[] */. 
a760: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
a770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a780: 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c  umber of non-wil
a790: 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68 61  dcard prefix cha
a7a0: 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68 61  racters */.  cha
a7b0: 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20 20  r wc[3];        
a7c0: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63          /* Wildc
a7d0: 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20 2a  ard characters *
a7e0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
a7f0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
a800: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
a810: 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ction */.  sqlit
a820: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
a830: 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   0;.  int op;   
a840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a850: 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70 52   /* Opcode of pR
a860: 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21  ight */..  if( !
a870: 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e  sqlite3IsLikeFun
a880: 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c  ction(db, pExpr,
a890: 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b   pnoCase, wc) ){
a8a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a8b0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
a8c0: 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70  _EBCDIC.  if( *p
a8d0: 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e 20  noCase ) return 
a8e0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73  0;.#endif.  pLis
a8f0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
a900: 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c  st;.  pLeft = pL
a910: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
a920: 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  .  if( pLeft->op
a930: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20  !=TK_COLUMN .   
a940: 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  || sqlite3ExprAf
a950: 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d 53  finity(pLeft)!=S
a960: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 0a  QLITE_AFF_TEXT .
a970: 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28     || IsVirtual(
a980: 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20 20 29  pLeft->pTab).  )
a990: 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  {.    /* IMP: R-
a9a0: 30 32 30 36 35 2d 34 39 34 36 35 20 54 68 65 20  02065-49465 The 
a9b0: 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  left-hand side o
a9c0: 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c  f the LIKE or GL
a9d0: 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  OB operator must
a9e0: 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 6e  .    ** be the n
a9f0: 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 65  ame of an indexe
aa00: 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45  d column with TE
aa10: 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  XT affinity. */.
aa20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
aa30: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  }.  assert( pLef
aa40: 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29  t->iColumn!=(-1)
aa50: 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 49   ); /* Because I
aa60: 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46 46  PK never has AFF
aa70: 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67  _TEXT */..  pRig
aa80: 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  ht = pList->a[0]
aa90: 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20 70  .pExpr;.  op = p
aaa0: 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28  Right->op;.  if(
aab0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
aac0: 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52 69   ){.    op = pRi
aad0: 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20  ght->op2;.  }.  
aae0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  if( op==TK_VARIA
aaf0: 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20  BLE ){.    Vdbe 
ab00: 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20 70 50  *pReprepare = pP
ab10: 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
ab20: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
ab30: 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
ab40: 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c  ;.    pVal = sql
ab50: 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
ab60: 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72 65  Value(pReprepare
ab70: 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41  , iCol, SQLITE_A
ab80: 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66  FF_NONE);.    if
ab90: 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65  ( pVal && sqlite
aba0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61  3_value_type(pVa
abb0: 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  l)==SQLITE_TEXT 
abc0: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68  ){.      z = (ch
abd0: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
abe0: 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20  ue_text(pVal);. 
abf0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ac00: 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70  VdbeSetVarmask(p
ac10: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 43  Parse->pVdbe, iC
ac20: 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ol);.    assert(
ac30: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
ac40: 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69 67  VARIABLE || pRig
ac50: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  ht->op==TK_REGIS
ac60: 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  TER );.  }else i
ac70: 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  f( op==TK_STRING
ac80: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69 67   ){.    z = pRig
ac90: 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ht->u.zToken;.  
aca0: 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20  }.  if( z ){.   
acb0: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68   cnt = 0;.    wh
acc0: 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21  ile( (c=z[cnt])!
acd0: 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26  =0 && c!=wc[0] &
ace0: 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21  & c!=wc[1] && c!
acf0: 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20  =wc[2] ){.      
ad00: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  cnt++;.    }.   
ad10: 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26 20 32   if( cnt!=0 && 2
ad20: 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d  55!=(u8)z[cnt-1]
ad30: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
ad40: 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 2a  pPrefix;.      *
ad50: 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d  pisComplete = c=
ad60: 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b  =wc[0] && z[cnt+
ad70: 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50 72  1]==0;.      pPr
ad80: 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45 78  efix = sqlite3Ex
ad90: 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47  pr(db, TK_STRING
ada0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , z);.      if( 
adb0: 70 50 72 65 66 69 78 20 29 20 70 50 72 65 66 69  pPrefix ) pPrefi
adc0: 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d  x->u.zToken[cnt]
add0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 70 50   = 0;.      *ppP
ade0: 72 65 66 69 78 20 3d 20 70 50 72 65 66 69 78 3b  refix = pPrefix;
adf0: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  .      if( op==T
ae00: 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20  K_VARIABLE ){.  
ae10: 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20        Vdbe *v = 
ae20: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
ae30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ae40: 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c 20  beSetVarmask(v, 
ae50: 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29  pRight->iColumn)
ae60: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70  ;.        if( *p
ae70: 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70 52  isComplete && pR
ae80: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  ight->u.zToken[1
ae90: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ] ){.          /
aea0: 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f 66 20  * If the rhs of 
aeb0: 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73 73  the LIKE express
aec0: 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62 6c  ion is a variabl
aed0: 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  e, and the curre
aee0: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
aef0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61 72  value of the var
af00: 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65 72  iable means ther
af10: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
af20: 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a  invoke the LIKE.
af30: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e            ** fun
af40: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f  ction, then no O
af50: 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c 20  P_Variable will 
af60: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
af70: 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20 20  program..       
af80: 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73 65     ** This cause
af90: 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74  s problems for t
afa0: 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
afb0: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29  parameter_name()
afc0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 50  .          ** AP
afd0: 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64  I. To workaround
afe0: 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75 6d   them, add a dum
aff0: 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 68  my OP_Variable h
b000: 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ere..          *
b010: 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  / .          int
b020: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
b030: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
b040: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b050: 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
b060: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
b070: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
b080: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
b090: 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56 64  eP3(v, sqlite3Vd
b0a0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
b0b0: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  -1, 0);.        
b0c0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
b0d0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
b0e0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r1);.        }. 
b0f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
b100: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20  {.      z = 0;. 
b110: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
b120: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
b130: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a 21  l);.  return (z!
b140: 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  =0);.}.#endif /*
b150: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
b160: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
b170: 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
b180: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
b190: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ABLE./*.** Check
b1a0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67   to see if the g
b1b0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
b1c0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  is of the form.*
b1d0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c  *.**         col
b1e0: 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a  umn MATCH expr.*
b1f0: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68  *.** If it is th
b200: 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20  en return TRUE. 
b210: 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   If not, return 
b220: 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  FALSE..*/.static
b230: 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f   int isMatchOfCo
b240: 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45  lumn(.  Expr *pE
b250: 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74  xpr      /* Test
b260: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
b270: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73   */.){.  ExprLis
b280: 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28  t *pList;..  if(
b290: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46   pExpr->op!=TK_F
b2a0: 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72  UNCTION ){.    r
b2b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
b2c0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
b2d0: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
b2e0: 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29 7b  n,"match")!=0 ){
b2f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
b300: 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78   }.  pList = pEx
b310: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69  pr->x.pList;.  i
b320: 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  f( pList->nExpr!
b330: 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =2 ){.    return
b340: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   0;.  }.  if( pL
b350: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d  ist->a[1].pExpr-
b360: 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  >op != TK_COLUMN
b370: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
b380: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
b390: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
b3a0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
b3b0: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
b3c0: 20 49 66 20 74 68 65 20 70 42 61 73 65 20 65 78   If the pBase ex
b3d0: 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61  pression origina
b3e0: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
b3f0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
b400: 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e  .** a join, then
b410: 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 61 70   transfer the ap
b420: 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e  propriate markin
b430: 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76  gs over to deriv
b440: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
b450: 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d  id transferJoinM
b460: 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44  arkings(Expr *pD
b470: 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42  erived, Expr *pB
b480: 61 73 65 29 7b 0a 20 20 69 66 28 20 70 44 65 72  ase){.  if( pDer
b490: 69 76 65 64 20 29 7b 0a 20 20 20 20 70 44 65 72  ived ){.    pDer
b4a0: 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70  ived->flags |= p
b4b0: 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50  Base->flags & EP
b4c0: 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70  _FromJoin;.    p
b4d0: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
b4e0: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
b4f0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
b500: 65 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  e;.  }.}..#if !d
b510: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b520: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
b530: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
b540: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b550: 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  UERY)./*.** Anal
b560: 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20  yze a term that 
b570: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20  consists of two 
b580: 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65  or more OR-conne
b590: 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73  cted.** subterms
b5a0: 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20  .  So in:.**.** 
b5b0: 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28      ... WHERE  (
b5c0: 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52  a=5) AND (b=7 OR
b5d0: 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e   c=9 OR d=13) AN
b5e0: 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20  D (d=13).**     
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b600: 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e       ^^^^^^^^^^^
b610: 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20  ^^^^^^^^^.**.** 
b620: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61  This routine ana
b630: 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68  lyzes terms such
b640: 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74   as the middle t
b650: 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65  erm in the above
b660: 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57   example..** A W
b670: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
b680: 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  t is computed an
b690: 64 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  d attached to th
b6a0: 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20  e term under.** 
b6b0: 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64  analysis, regard
b6c0: 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63  less of the outc
b6d0: 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79  ome of the analy
b6e0: 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a  sis.  Hence:.**.
b6f0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
b700: 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54  .wtFlags   |=  T
b710: 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20  ERM_ORINFO.**   
b720: 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f    WhereTerm.u.pO
b730: 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61  rInfo  =  a dyna
b740: 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
b750: 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62  d WhereOrTerm ob
b760: 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ject.**.** The t
b770: 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  erm being analyz
b780: 65 64 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f  ed must have two
b790: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63   or more of OR-c
b7a0: 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d  onnected subterm
b7b0: 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73  s..** A single s
b7c0: 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20  ubterm might be 
b7d0: 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e  a set of AND-con
b7e0: 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62 74 65  nected sub-subte
b7f0: 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  rms..** Examples
b800: 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20   of terms under 
b810: 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20  analysis:.**.** 
b820: 20 20 20 20 28 41 29 20 20 20 20 20 74 31 2e 78      (A)     t1.x
b830: 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32  =t2.y OR t1.x=t2
b840: 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52  .z OR t1.y=15 OR
b850: 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20   t1.z=t3.a+5.** 
b860: 20 20 20 20 28 42 29 20 20 20 20 20 78 3d 65 78      (B)     x=ex
b870: 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f  pr1 OR expr2=x O
b880: 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20  R x=expr3.**    
b890: 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (C)     t1.x=t2
b8a0: 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a  .y OR (t1.x=t2.z
b8b0: 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a   AND t1.y=15).**
b8c0: 20 20 20 20 20 28 44 29 20 20 20 20 20 78 3d 65       (D)     x=e
b8d0: 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e  xpr1 OR (y>11 AN
b8e0: 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b  D y<22 AND z LIK
b8f0: 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20  E '*hello*').** 
b900: 20 20 20 20 28 45 29 20 20 20 20 20 28 70 2e 61      (E)     (p.a
b910: 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44  =1 AND q.b=2 AND
b920: 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d   r.c=3) OR (p.x=
b930: 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20  4 AND q.y=5 AND 
b940: 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53  r.z=6).**.** CAS
b950: 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  E 1:.**.** If al
b960: 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f  l subterms are o
b970: 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65  f the form T.C=e
b980: 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e  xpr for some sin
b990: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20  gle column of C 
b9a0: 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  and.** a single 
b9b0: 74 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77  table T (as show
b9c0: 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61  n in example B a
b9d0: 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74  bove) then creat
b9e0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a  e a new virtual.
b9f0: 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  ** term that is 
ba00: 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e  an equivalent IN
ba10: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e   expression.  In
ba20: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
ba30: 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69   the term.** bei
ba40: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a  ng analyzed is:.
ba50: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65  **.**      x = e
ba60: 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20  xpr1  OR  expr2 
ba70: 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70  = x  OR  x = exp
ba80: 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72  r3.**.** then cr
ba90: 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75  eate a new virtu
baa0: 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69  al term like thi
bab0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  s:.**.**      x 
bac0: 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c  IN (expr1,expr2,
bad0: 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53  expr3).**.** CAS
bae0: 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  E 2:.**.** If al
baf0: 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69  l subterms are i
bb00: 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69  ndexable by a si
bb10: 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68  ngle table T, th
bb20: 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20  en set.**.**    
bb30: 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72   WhereTerm.eOper
bb40: 61 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  ator            
bb50: 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20    =  WO_OR.**   
bb60: 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f    WhereTerm.u.pO
bb70: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
bb80: 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72    |=  the cursor
bb90: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c   number for tabl
bba0: 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74  e T.**.** A subt
bbb0: 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c  erm is "indexabl
bbc0: 65 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74  e" if it is of t
bbd0: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20  he form.** "T.C 
bbe0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
bbf0: 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75  re C is any colu
bc00: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e  mn of table T an
bc10: 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e  d .** <op> is on
bc20: 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22  e of "=", "<", "
bc30: 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20  <=", ">", ">=", 
bc40: 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49  "IS NULL", or "I
bc50: 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  N"..** A subterm
bc60: 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62   is also indexab
bc70: 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41  le if it is an A
bc80: 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ND of two or mor
bc90: 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73  e.** subsubterms
bca0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
bcb0: 20 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61   which is indexa
bcc0: 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20  ble.  Indexable 
bcd0: 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73  AND .** subterms
bce0: 20 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65   have their eOpe
bcf0: 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f  rator set to WO_
bd00: 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76  AND and they hav
bd10: 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20  e.** u.pAndInfo 
bd20: 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63  set to a dynamic
bd30: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
bd40: 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65  hereAndTerm obje
bd50: 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61  ct..**.** From a
bd60: 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20  nother point of 
bd70: 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65  view, "indexable
bd80: 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  " means that the
bd90: 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a   subterm could.*
bda0: 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65  * potentially be
bdb0: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
bdc0: 64 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70  dex if an approp
bdd0: 72 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73  riate index exis
bde0: 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c  ts..** This anal
bdf0: 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ysis does not co
be00: 6e 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f  nsider whether o
be10: 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20  r not the index 
be20: 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20  exists; that.** 
be30: 69 73 20 64 65 63 69 64 65 64 20 65 6c 73 65 77  is decided elsew
be40: 68 65 72 65 2e 20 20 54 68 69 73 20 61 6e 61 6c  here.  This anal
be50: 79 73 69 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20  ysis only looks 
be60: 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65  at whether subte
be70: 72 6d 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61  rms.** appropria
be80: 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  te for indexing 
be90: 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  exist..**.** All
bea0: 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f   examples A thro
beb0: 75 67 68 20 45 20 61 62 6f 76 65 20 73 61 74 69  ugh E above sati
bec0: 73 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74  sfy case 2.  But
bed0: 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c   if a term.** al
bee0: 73 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61  so statisfies ca
bef0: 73 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29  se 1 (such as B)
bf00: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
bf10: 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c  e optimizer will
bf20: 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65  .** always prefe
bf30: 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20  r case 1, so in 
bf40: 74 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65  that case we pre
bf50: 74 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32  tend that case 2
bf60: 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73   is not.** satis
bf70: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d  fied..**.** It m
bf80: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
bf90: 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74   that multiple t
bfa0: 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61  ables are indexa
bfb0: 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ble.  For exampl
bfc0: 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20  e,.** (E) above 
bfd0: 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20  is indexable on 
bfe0: 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64  tables P, Q, and
bff0: 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20   R..**.** Terms 
c000: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73  that satisfy cas
c010: 65 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74  e 2 are candidat
c020: 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79  es for lookup by
c030: 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61   using.** separa
c040: 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69  te indices to fi
c050: 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61  nd rowids for ea
c060: 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63  ch subterm and c
c070: 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20  omposing.** the 
c080: 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77  union of all row
c090: 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53  ids using a RowS
c0a0: 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  et object.  This
c0b0: 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74   is similar.** t
c0c0: 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65  o "bitmap indice
c0d0: 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61  s" in other data
c0e0: 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a  base engines..**
c0f0: 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a  .** OTHERWISE:.*
c100: 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20  *.** If neither 
c110: 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20  case 1 nor case 
c120: 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65  2 apply, then le
c130: 61 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f  ave the eOperato
c140: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f  r set to.** zero
c150: 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20  .  This term is 
c160: 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73  not useful for s
c170: 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  earch..*/.static
c180: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
c190: 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69  eOrTerm(.  SrcLi
c1a0: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
c1b0: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
c1c0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
c1d0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
c1e0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f         /* the co
c1f0: 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61  mplete WHERE cla
c200: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
c210: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
c220: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
c230: 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65  he OR-term to be
c240: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
c250: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
c260: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
c270: 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45  o;        /* WHE
c280: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
c290: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c2a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
c2b0: 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
c2c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
c2d0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
c2e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c2f0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
c300: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
c310: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
c320: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
c330: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
c340: 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20  idxTerm];    /* 
c350: 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
c360: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70  nalyzed */.  Exp
c370: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
c380: 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->pExpr;        
c390: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
c3a0: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65  ession of the te
c3b0: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  rm */.  int i;  
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3e0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
c3f0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
c400: 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20  e *pOrWc;       
c410: 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54  /* Breakup of pT
c420: 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  erm into subterm
c430: 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  s */.  WhereTerm
c440: 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20   *pOrTerm;      
c450: 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77   /* A Sub-term w
c460: 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20  ithin the pOrWc 
c470: 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f  */.  WhereOrInfo
c480: 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f   *pOrInfo;     /
c490: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  * Additional inf
c4a0: 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61  ormation associa
c4b0: 74 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a  ted with pTerm *
c4c0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67  /.  Bitmask chng
c4d0: 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a  ToIN;         /*
c4e0: 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   Tables that mig
c4f0: 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ht satisfy case 
c500: 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  1 */.  Bitmask i
c510: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
c520: 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
c530: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73  are indexable, s
c540: 61 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32  atisfying case 2
c550: 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42   */..  /*.  ** B
c560: 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75  reak the OR clau
c570: 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61  se into its sepa
c580: 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20  rate subterms.  
c590: 54 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65  The subterms are
c5a0: 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  .  ** stored in 
c5b0: 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  a WhereClause st
c5c0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
c5d0: 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68  ng within the Wh
c5e0: 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f  ereOrInfo.  ** o
c5f0: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74  bject that is at
c600: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72  tached to the or
c610: 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65  iginal OR clause
c620: 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73   term..  */.  as
c630: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74  sert( (pTerm->wt
c640: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59  Flags & (TERM_DY
c650: 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46  NAMIC|TERM_ORINF
c660: 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29  O|TERM_ANDINFO))
c670: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
c680: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f   pExpr->op==TK_O
c690: 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e  R );.  pTerm->u.
c6a0: 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66  pOrInfo = pOrInf
c6b0: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
c6c0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
c6d0: 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20  of(*pOrInfo));. 
c6e0: 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20   if( pOrInfo==0 
c6f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72  ) return;.  pTer
c700: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
c710: 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72  RM_ORINFO;.  pOr
c720: 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77  Wc = &pOrInfo->w
c730: 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  c;.  whereClause
c740: 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 49 6e  Init(pOrWc, pWIn
c750: 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  fo);.  whereSpli
c760: 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20  t(pOrWc, pExpr, 
c770: 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e  TK_OR);.  exprAn
c780: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
c790: 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d  OrWc);.  if( db-
c7a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
c7b0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
c7c0: 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d  ( pOrWc->nTerm>=
c7d0: 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  2 );..  /*.  ** 
c7e0: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20  Compute the set 
c7f0: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d  of tables that m
c800: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
c810: 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a  es 1 or 2..  */.
c820: 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28    indexable = ~(
c830: 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e  Bitmask)0;.  chn
c840: 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73  gToIN = ~(Bitmas
c850: 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72  k)0;.  for(i=pOr
c860: 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72  Wc->nTerm-1, pOr
c870: 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69  Term=pOrWc->a; i
c880: 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65  >=0 && indexable
c890: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
c8a0: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54  ){.    if( (pOrT
c8b0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
c8c0: 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29   WO_SINGLE)==0 )
c8d0: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e 64  {.      WhereAnd
c8e0: 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a  Info *pAndInfo;.
c8f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
c900: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
c910: 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c  & (TERM_ANDINFO|
c920: 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30  TERM_ORINFO))==0
c930: 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f   );.      chngTo
c940: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41  IN = 0;.      pA
c950: 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  ndInfo = sqlite3
c960: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
c970: 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f  sizeof(*pAndInfo
c980: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  ));.      if( pA
c990: 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  ndInfo ){.      
c9a0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
c9b0: 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57  AndWC;.        W
c9c0: 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65  hereTerm *pAndTe
c9d0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rm;.        int 
c9e0: 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  j;.        Bitma
c9f0: 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk b = 0;.      
ca00: 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e    pOrTerm->u.pAn
ca10: 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f  dInfo = pAndInfo
ca20: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
ca30: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
ca40: 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20  RM_ANDINFO;.    
ca50: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70      pOrTerm->eOp
ca60: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b  erator = WO_AND;
ca70: 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20  .        pAndWC 
ca80: 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  = &pAndInfo->wc;
ca90: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c  .        whereCl
caa0: 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c  auseInit(pAndWC,
cab0: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20   pWC->pWInfo);. 
cac0: 20 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69         whereSpli
cad0: 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72  t(pAndWC, pOrTer
cae0: 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44  m->pExpr, TK_AND
caf0: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41  );.        exprA
cb00: 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20  nalyzeAll(pSrc, 
cb10: 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20  pAndWC);.       
cb20: 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20   pAndWC->pOuter 
cb30: 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74  = pWC;.        t
cb40: 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c  estcase( db->mal
cb50: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
cb60: 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61       if( !db->ma
cb70: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
cb80: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
cb90: 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43   pAndTerm=pAndWC
cba0: 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e  ->a; j<pAndWC->n
cbb0: 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54  Term; j++, pAndT
cbc0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
cbd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64      assert( pAnd
cbe0: 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
cbf0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
cc00: 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72  llowedOp(pAndTer
cc10: 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b  m->pExpr->op) ){
cc20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
cc30: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49   |= getMask(&pWI
cc40: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
cc50: 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  AndTerm->leftCur
cc60: 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sor);.          
cc70: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
cc80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cc90: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
cca0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
ccb0: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
ccc0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
ccd0: 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20 20  COPIED ){.      
cce0: 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65 72  /* Skip this ter
ccf0: 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72  m for now.  We r
cd00: 65 76 69 73 69 74 20 69 74 20 77 68 65 6e 20 77  evisit it when w
cd10: 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20 20  e process the.  
cd20: 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e      ** correspon
cd30: 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55 41  ding TERM_VIRTUA
cd40: 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65  L term */.    }e
cd50: 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
cd60: 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20  sk b;.      b = 
cd70: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
cd80: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  >sMaskSet, pOrTe
cd90: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  rm->leftCursor);
cda0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
cdb0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
cdc0: 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20  RM_VIRTUAL ){.  
cdd0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
cde0: 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63  *pOther = &pOrWc
cdf0: 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61  ->a[pOrTerm->iPa
ce00: 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62  rent];.        b
ce10: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49   |= getMask(&pWI
ce20: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
ce30: 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f  Other->leftCurso
ce40: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
ce50: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
ce60: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 72  ;.      if( (pOr
ce70: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
ce80: 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20  & WO_EQ)==0 ){. 
ce90: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
cea0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
ceb0: 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f  {.        chngTo
cec0: 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d  IN &= b;.      }
ced0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
cee0: 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  .  ** Record the
cef0: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
cf00: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
cf10: 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67   2.  The set mig
cf20: 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79  ht be.  ** empty
cf30: 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f  ..  */.  pOrInfo
cf40: 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e  ->indexable = in
cf50: 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d  dexable;.  pTerm
cf60: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e  ->eOperator = in
cf70: 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a  dexable==0 ? 0 :
cf80: 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20   WO_OR;..  /*.  
cf90: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64  ** chngToIN hold
cfa0: 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65  s a set of table
cfb0: 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73  s that *might* s
cfc0: 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20  atisfy case 1.  
cfd0: 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65  But.  ** we have
cfe0: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69   to do some addi
cff0: 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20  tional checking 
d000: 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31  to see if case 1
d010: 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20   really.  ** is 
d020: 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a  satisfied..  **.
d030: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69    ** chngToIN wi
d040: 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30  ll hold either 0
d050: 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20  , 1, or 2 bits. 
d060: 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 20   The 0-bit case 
d070: 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
d080: 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73  there is no poss
d090: 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73  ibility of trans
d0a0: 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63  forming the OR c
d0b0: 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20  lause into an.  
d0c0: 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62  ** IN operator b
d0d0: 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f  ecause one or mo
d0e0: 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
d0f0: 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  OR clause contai
d100: 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67  n.  ** something
d110: 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f   other than == o
d120: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  n a column in th
d130: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
d140: 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20   The 1-bit.  ** 
d150: 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20  case means that 
d160: 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
d170: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f  e OR clause is o
d180: 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20  f the form.  ** 
d190: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78  "table.column=ex
d1a0: 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e  pr" for some sin
d1b0: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
d1c0: 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 20  one bit that is 
d1d0: 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f  set.  ** will co
d1e0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
d1f0: 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57  common table.  W
d200: 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
d210: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20  check to make.  
d220: 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d 65  ** sure the same
d230: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
d240: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54  on all terms.  T
d250: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 73  he 2-bit case is
d260: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61   when.  ** the a
d270: 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20  ll terms are of 
d280: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31  the form "table1
d290: 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63  .column=table2.c
d2a0: 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a  olumn".  It.  **
d2b0: 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62   might be possib
d2c0: 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e  le to form an IN
d2d0: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 65   operator with e
d2e0: 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c  ither table1.col
d2f0: 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c  umn.  ** or tabl
d300: 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  e2.column as the
d310: 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 69   LHS if either i
d320: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72  s common to ever
d330: 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74  y term of.  ** t
d340: 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20  he OR clause..  
d350: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
d360: 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  t terms of the f
d370: 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d  orm "table.colum
d380: 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32  n1=table.column2
d390: 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  " (the.  ** same
d3a0: 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73   table on both s
d3b0: 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20  izes of the ==) 
d3c0: 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
d3d0: 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
d3e0: 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20  chngToIN ){.    
d3f0: 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  int okToChngToIN
d400: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
d410: 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73  e if the convers
d420: 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c  ion to IN is val
d430: 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  id */.    int iC
d440: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20  olumn = -1;     
d450: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e      /* Column in
d460: 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e  dex on lhs of IN
d470: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
d480: 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d   int iCursor = -
d490: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  1;         /* Ta
d4a0: 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f  ble cursor commo
d4b0: 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a  n to all terms *
d4c0: 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b  /.    int j = 0;
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
d4f0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  */..    /* Searc
d500: 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e  h for a table an
d510: 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70  d column that ap
d520: 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64  pears on one sid
d530: 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  e or the.    ** 
d540: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20  other of the == 
d550: 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72  operator in ever
d560: 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74  y subterm.  That
d570: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
d580: 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65  n.    ** will be
d590: 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75   recorded in iCu
d5a0: 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e  rsor and iColumn
d5b0: 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e  .  There might n
d5c0: 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a  ot be any.    **
d5d0: 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20   such table and 
d5e0: 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54  column.  Set okT
d5f0: 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20  oChngToIN if an 
d600: 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c  appropriate tabl
d610: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c  e.    ** and col
d620: 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74  umn is found but
d630: 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54   leave okToChngT
d640: 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  oIN false if not
d650: 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20   found..    */. 
d660: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20     for(j=0; j<2 
d670: 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  && !okToChngToIN
d680: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f  ; j++){.      pO
d690: 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61  rTerm = pOrWc->a
d6a0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f  ;.      for(i=pO
d6b0: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e  rWc->nTerm-1; i>
d6c0: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
d6d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
d6e0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
d6f0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
d700: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  );.        pOrTe
d710: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e  rm->wtFlags &= ~
d720: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
d730: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
d740: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
d750: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
d760: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
d770: 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20   2-bit case and 
d780: 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65  we are on the se
d790: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61  cond iteration a
d7a0: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
d7b0: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20  current term is 
d7c0: 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69  from the first i
d7d0: 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b  teration.  So sk
d7e0: 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f  ip this term. */
d7f0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
d800: 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20  t( j==1 );.     
d810: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
d820: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d830: 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26   if( (chngToIN &
d840: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
d850: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  ->sMaskSet, pOrT
d860: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
d870: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
d880: 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d    /* This term m
d890: 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f  ust be of the fo
d8a0: 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68  rm t1.a==t2.b wh
d8b0: 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65  ere t2 is in the
d8c0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68  .          ** ch
d8d0: 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74  ngToIN set but t
d8e0: 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20  1 is not.  This 
d8f0: 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74  term will be eit
d900: 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20  her preceeded.  
d910: 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f          ** or fo
d920: 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65  llwed by an inve
d930: 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d  rted copy (t2.b=
d940: 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68  =t1.a).  Skip th
d950: 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20  is term .       
d960: 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74     ** and use it
d970: 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a  s inversion. */.
d980: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
d990: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
d9a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
d9b0: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ED );.          
d9c0: 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72  testcase( pOrTer
d9d0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
d9e0: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
d9f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
da00: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
da10: 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54  & (TERM_COPIED|T
da20: 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a  ERM_VIRTUAL) );.
da30: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
da40: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
da50: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
da60: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
da70: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69  olumn;.        i
da80: 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d  Cursor = pOrTerm
da90: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20  ->leftCursor;.  
daa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dab0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
dac0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
dad0: 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61   No candidate ta
dae0: 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66  ble+column was f
daf0: 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20  ound.  This can 
db00: 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20  only occur.     
db10: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63     ** on the sec
db20: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ond iteration */
db30: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
db40: 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20   j==1 );.       
db50: 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72   assert( IsPower
db60: 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20  OfTwo(chngToIN) 
db70: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
db80: 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74  t( chngToIN==get
db90: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
dba0: 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29  askSet, iCursor)
dbb0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
dbc0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
dbd0: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20   testcase( j==1 
dbe0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  );..      /* We 
dbf0: 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e  have found a can
dc00: 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64  didate table and
dc10: 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20   column.  Check 
dc20: 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20  to see if that. 
dc30: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e       ** table an
dc40: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d  d column is comm
dc50: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
dc60: 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73   in the OR claus
dc70: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43  e */.      okToC
dc80: 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  hngToIN = 1;.   
dc90: 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26     for(; i>=0 &&
dca0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69   okToChngToIN; i
dcb0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
dcc0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
dcd0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
dce0: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
dcf0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
dd00: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
dd10: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
dd20: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
dd30: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
dd40: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
dd50: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
dd60: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43  u.leftColumn!=iC
dd70: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
dd80: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
dd90: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
dda0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
ddb0: 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69  t affLeft, affRi
ddc0: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  ght;.          /
ddd0: 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68  * If the right-h
dde0: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f  and side is also
ddf0: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
de00: 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20  the affinities. 
de10: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62           ** of b
de20: 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65  oth right and le
de30: 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65  ft sides must be
de40: 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79   such that no ty
de50: 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  pe.          ** 
de60: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20  conversions are 
de70: 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  required on the 
de80: 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20  right.  (Ticket 
de90: 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20  #2249).         
dea0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66   */.          af
deb0: 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  fRight = sqlite3
dec0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
ded0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
dee0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
def0: 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  affLeft = sqlite
df00: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
df10: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
df20: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
df30: 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20  if( affRight!=0 
df40: 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66  && affRight!=aff
df50: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
df60: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
df70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
df80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
df90: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
dfa0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f  ags |= TERM_OR_O
dfb0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
dfc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
dfd0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
dfe0: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b  t this point, ok
dff0: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72  ToChngToIN is tr
e000: 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70  ue if original p
e010: 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20  Term satisfies. 
e020: 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49     ** case 1.  I
e030: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e  n that case, con
e040: 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72  struct a new vir
e050: 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69  tual term that i
e060: 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20  s .    ** pTerm 
e070: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
e080: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n IN operator.. 
e090: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b     */.    if( ok
e0a0: 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ToChngToIN ){.  
e0b0: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20      Expr *pDup; 
e0c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
e0d0: 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63  transient duplic
e0e0: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  ate expression *
e0f0: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
e100: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f   *pList = 0;   /
e110: 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65  * The RHS of the
e120: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
e130: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
e140: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
e150: 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
e160: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
e170: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20      Expr *pNew; 
e180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e190: 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70  e complete IN op
e1a0: 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20  erator */..     
e1b0: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
e1c0: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
e1d0: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  OrWc->a; i>=0; i
e1e0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
e1f0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
e200: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
e210: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29  TERM_OR_OK)==0 )
e220: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
e230: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
e240: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
e250: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
e260: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
e270: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
e280: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20  ursor );.       
e290: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
e2a0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
e2b0: 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  iColumn );.     
e2c0: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
e2d0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72  3ExprDup(db, pOr
e2e0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
e2f0: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
e300: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
e310: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
e320: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
e330: 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20  List, pDup);.   
e340: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72       pLeft = pOr
e350: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
e360: 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ft;.      }.    
e370: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
e380: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70  =0 );.      pDup
e390: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
e3a0: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
e3b0: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
e3c0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
e3d0: 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20  e, TK_IN, pDup, 
e3e0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
e3f0: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
e400: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
e410: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
e420: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20  nMarkings(pNew, 
e430: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
e440: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
e450: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
e460: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
e470: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
e480: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
e490: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
e4a0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
e4b0: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52  t(pWC, pNew, TER
e4c0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
e4d0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
e4e0: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
e4f0: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  w==0 );.        
e500: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
e510: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
e520: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
e530: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
e540: 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61  ;.        pWC->a
e550: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
e560: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
e570: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
e580: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 1;.      }el
e590: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
e5a0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
e5b0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
e5c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72      }.      pTer
e5d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
e5e0: 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65  O_NOOP;  /* case
e5f0: 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32   1 trumps case 2
e600: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   */.    }.  }.}.
e610: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
e620: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
e630: 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54  ZATION && !SQLIT
e640: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
e650: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  */../*.** The in
e660: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
e670: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
e680: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
e690: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
e6a0: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
e6b0: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
e6c0: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
e6d0: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
e6e0: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
e6f0: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
e700: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
e710: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
e720: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
e730: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
e740: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e750: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
e760: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
e770: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
e780: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
e790: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
e7a0: 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49  <expr>"..**.** I
e7b0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e7c0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
e7d0: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
e7e0: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72   both X and Y ar
e7f0: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  e.** columns, th
e800: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
e810: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
e820: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65  changed and a ne
e830: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
e840: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59  m of the form "Y
e850: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
e860: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
e870: 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61  lause and.** ana
e880: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
e890: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
e8a0: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
e8b0: 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a  ith TERM_COPIED.
e8c0: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74  ** and the new t
e8d0: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
e8e0: 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20  th TERM_DYNAMIC 
e8f0: 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45  (because it's pE
e900: 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  xpr.** needs to 
e910: 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68  be freed with th
e920: 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61  e WhereClause) a
e930: 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  nd TERM_VIRTUAL 
e940: 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69  (because it.** i
e950: 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70  s a commuted cop
e960: 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72  y of a prior ter
e970: 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61  m.)  The origina
e980: 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c  l term has nChil
e990: 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  d=1.** and the c
e9a0: 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e  opy has idxParen
e9b0: 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  t set to the ind
e9c0: 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ex of the origin
e9d0: 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  al term..*/.stat
e9e0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
e9f0: 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  yze(.  SrcList *
ea00: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
ea10: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
ea20: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
ea30: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
ea40: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
ea50: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
ea60: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
ea70: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
ea80: 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  f the term to be
ea90: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
eaa0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
eab0: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
eac0: 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  o; /* WHERE clau
ead0: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f  se processing co
eae0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
eaf0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
eb10: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
eb20: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alyzed */.  Wher
eb30: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
eb40: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
eb50: 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64  Set of table ind
eb60: 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78  ex masks */.  Ex
eb70: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eb90: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
eba0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
ebb0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
ebc0: 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20  reqLeft;        
ebd0: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
ebe0: 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45  esites of the pE
ebf0: 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20  xpr->pLeft */.  
ec00: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
ec10: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
ec20: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
ec30: 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20  s of pExpr */.  
ec40: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67  Bitmask extraRig
ec50: 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ht = 0;         
ec60: 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64   /* Extra depend
ec70: 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a  encies on LEFT J
ec80: 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  OIN */.  Expr *p
ec90: 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Str1 = 0;       
eca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
ecb0: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
ecc0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
ecd0: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ecf0: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
ed00: 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63   ends with wildc
ed10: 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ard */.  int noC
ed20: 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ase = 0;        
ed30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b            /* LIK
ed40: 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69  E/GLOB distingui
ed50: 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69  shes case */.  i
ed60: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed80: 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65  /* Top-level ope
ed90: 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f  rator.  pExpr->o
eda0: 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  p */.  Parse *pP
edb0: 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
edc0: 50 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69  Parse;  /* Parsi
edd0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
ede0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
edf0: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
ee00: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
ee10: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  nection */..  if
ee20: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
ee30: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
ee40: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
ee50: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
ee60: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
ee70: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
ee80: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
ee90: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  m->pExpr;.  asse
eea0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
eeb0: 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_AS && pExpr->o
eec0: 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p!=TK_COLLATE );
eed0: 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20  .  prereqLeft = 
eee0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
eef0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
ef00: 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70  pLeft);.  op = p
ef10: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
ef20: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
ef30: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
ef40: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
ef50: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
ef60: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
ef70: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
ef80: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
ef90: 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65  Right = exprSele
efa0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
efb0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
efc0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
efd0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
efe0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
eff0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
f000: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
f010: 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
f020: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
f030: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
f040: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
f050: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d  eqRight = 0;.  }
f060: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
f070: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
f080: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
f090: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
f0a0: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
f0b0: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
f0c0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
f0d0: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
f0e0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
f0f0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
f100: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d  oin) ){.    Bitm
f110: 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28  ask x = getMask(
f120: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
f130: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
f140: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c  );.    prereqAll
f150: 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61   |= x;.    extra
f160: 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a  Right = x-1;  /*
f170: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
f180: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
f190: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20   with an index. 
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74        ** on left
f1c0: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
f1d0: 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23   JOIN.  Ticket #
f1e0: 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  3015 */.  }.  pT
f1f0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
f200: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
f210: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
f220: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
f230: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
f240: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f250: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
f260: 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20  edOp(op) ){.    
f270: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
f280: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
f290: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  late(pExpr->pLef
f2a0: 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  t);.    Expr *pR
f2b0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
f2c0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
f2d0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
f2e0: 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28    u16 opMask = (
f2f0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
f300: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
f310: 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57  ==0 ? WO_ALL : W
f320: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28  O_EQUIV;.    if(
f330: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
f340: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
f350: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
f360: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
f370: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75  ;.      pTerm->u
f380: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
f390: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
f3a0: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
f3b0: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
f3c0: 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b  ask(op) & opMask
f3d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f3e0: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
f3f0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
f400: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
f410: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
f420: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
f430: 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d    u16 eExtraOp =
f440: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78   0;        /* Ex
f450: 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65  tra bits for pNe
f460: 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  w->eOperator */.
f470: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
f480: 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29  >leftCursor>=0 )
f490: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
f4a0: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44  xNew;.        pD
f4b0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
f4c0: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
f4d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
f4e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f4f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
f500: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
f510: 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
f520: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
f530: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64      }.        id
f540: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
f550: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44  seInsert(pWC, pD
f560: 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  up, TERM_VIRTUAL
f570: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
f580: 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e          if( idxN
f590: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
f5a0: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26          pNew = &
f5b0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
f5c0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50          pNew->iP
f5d0: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
f5e0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
f5f0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
f600: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
f610: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
f620: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
f630: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
f640: 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IED;.        if(
f650: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
f660: 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45  Q.         && !E
f670: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
f680: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
f690: 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  n).         && O
f6a0: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
f6b0: 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72  ed(db, SQLITE_Tr
f6c0: 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20  ansitive).      
f6d0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
f6e0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f6f0: 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20  |= WO_EQUIV;.   
f700: 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20         eExtraOp 
f710: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
f720: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f730: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e{.        pDup 
f740: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
f750: 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20   pNew = pTerm;. 
f760: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
f770: 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c  rCommute(pParse,
f780: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c   pDup);.      pL
f790: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
f7a0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75  rSkipCollate(pDu
f7b0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  p->pLeft);.     
f7c0: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
f7d0: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
f7e0: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  e;.      pNew->u
f7f0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
f800: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
f810: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
f820: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
f830: 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65  aRight) != prere
f840: 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70  qLeft );.      p
f850: 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74  New->prereqRight
f860: 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20   = prereqLeft | 
f870: 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20  extraRight;.    
f880: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c    pNew->prereqAl
f890: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
f8a0: 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72       pNew->eOper
f8b0: 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72  ator = (operator
f8c0: 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b  Mask(pDup->op) +
f8d0: 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d   eExtraOp) & opM
f8e0: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ask;.    }.  }..
f8f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f900: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
f910: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66  MIZATION.  /* If
f920: 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42   a term is the B
f930: 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c  ETWEEN operator,
f940: 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20   create two new 
f950: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20  virtual terms.  
f960: 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74  ** that define t
f970: 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68  he range that th
f980: 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d  e BETWEEN implem
f990: 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ents.  For examp
f9a0: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
f9b0: 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41     a BETWEEN b A
f9c0: 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69  ND c.  **.  ** i
f9d0: 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  s converted into
f9e0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
f9f0: 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e   (a BETWEEN b AN
fa00: 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20  D c) AND (a>=b) 
fa10: 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a  AND (a<=c).  **.
fa20: 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77    ** The two new
fa30: 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
fa40: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
fa50: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
fa60: 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68   object..  ** Th
fa70: 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  e new terms are 
fa80: 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72  "dynamic" and ar
fa90: 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68  e children of th
faa0: 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45  e original BETWE
fab0: 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54  EN.  ** term.  T
fac0: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69  hat means that i
fad0: 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65  f the BETWEEN te
fae0: 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65  rm is coded, the
faf0: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20   children are.  
fb00: 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c  ** skipped.  Or,
fb10: 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e   if the children
fb20: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62   are satisfied b
fb30: 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20  y an index, the 
fb40: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45  original.  ** BE
fb50: 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b  TWEEN term is sk
fb60: 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
fb70: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
fb80: 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20  ==TK_BETWEEN && 
fb90: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
fba0: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
fbb0: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
fbc0: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  x.pList;.    int
fbd0: 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   i;.    static c
fbe0: 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20  onst u8 ops[] = 
fbf0: 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a  {TK_GE, TK_LE};.
fc00: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
fc10: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
fc20: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
fc30: 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==2 );.    for(i
fc40: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
fc50: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
fc60: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
fc70: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65  dxNew;.      pNe
fc80: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
fc90: 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73  Expr(pParse, ops
fca0: 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  [i], .          
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcc0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
fcd0: 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  p(db, pExpr->pLe
fce0: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fd10: 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
fd20: 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30  [i].pExpr, 0), 0
fd30: 29 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 66 65  );.      transfe
fd40: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e  rJoinMarkings(pN
fd50: 65 77 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a  ewExpr, pExpr);.
fd60: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
fd70: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
fd80: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
fd90: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
fda0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
fdb0: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
fdc0: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ew==0 );.      e
fdd0: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
fde0: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
fdf0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
fe00: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
fe10: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
fe20: 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew].iParent = id
fe30: 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  xTerm;.    }.   
fe40: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
fe50: 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   2;.  }.#endif /
fe60: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  * SQLITE_OMIT_BE
fe70: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
fe80: 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  ON */..#if !defi
fe90: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
fea0: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
feb0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
fec0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
fed0: 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  Y).  /* Analyze 
fee0: 61 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 63  a term that is c
fef0: 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f  omposed of two o
ff00: 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20  r more subterms 
ff10: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a  connected by.  *
ff20: 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72  * an OR operator
ff30: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
ff40: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
ff50: 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OR ){.    assert
ff60: 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  ( pWC->op==TK_AN
ff70: 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  D );.    exprAna
ff80: 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c  lyzeOrTerm(pSrc,
ff90: 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a   pWC, idxTerm);.
ffa0: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
ffb0: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
ffc0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ffd0: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
ffe0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
fff0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10000 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
10010 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74  N.  /* Add const
10020 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65  raints to reduce
10030 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
10040 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47  e on a LIKE or G
10050 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  LOB.  ** operato
10060 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c  r..  **.  ** A l
10070 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74  ike pattern of t
10080 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20  he form "x LIKE 
10090 27 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67  'abc%'" is chang
100a0 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69  ed into constrai
100b0 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  nts.  **.  **   
100c0 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20         x>='abc' 
100d0 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20  AND x<'abd' AND 
100e0 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20  x LIKE 'abc%'.  
100f0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74  **.  ** The last
10100 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
10110 65 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69  e prefix "abc" i
10120 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f  s incremented to
10130 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74   form the.  ** t
10140 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69  ermination condi
10150 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f  tion "abd"..  */
10160 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d  .  if( pWC->op==
10170 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73  TK_AND .   && is
10180 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73  LikeOrGlob(pPars
10190 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31  e, pExpr, &pStr1
101a0 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26  , &isComplete, &
101b0 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20  noCase).  ){.   
101c0 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20   Expr *pLeft;   
101d0 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49      /* LHS of LI
101e0 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
101f0 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53   */.    Expr *pS
10200 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f  tr2;       /* Co
10210 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48  py of pStr1 - RH
10220 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
10230 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
10240 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a  xpr *pNewExpr1;.
10250 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
10260 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  pr2;.    int idx
10270 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64  New1;.    int id
10280 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e  xNew2;.    Token
10290 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20   sCollSeqName;  
102a0 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
102b0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
102c0 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45  ..    pLeft = pE
102d0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
102e0 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53  1].pExpr;.    pS
102f0 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tr2 = sqlite3Exp
10300 72 44 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20  rDup(db, pStr1, 
10310 30 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d  0);.    if( !db-
10320 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
10330 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43  .      u8 c, *pC
10340 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  ;       /* Last 
10350 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65  character before
10360 20 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63   the first wildc
10370 61 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20  ard */.      pC 
10380 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75  = (u8*)&pStr2->u
10390 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53  .zToken[sqlite3S
103a0 74 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75  trlen30(pStr2->u
103b0 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20  .zToken)-1];.   
103c0 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20     c = *pC;.    
103d0 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a    if( noCase ){.
103e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
103f0 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65  oint is to incre
10400 6d 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68  ment the last ch
10410 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74  aracter before t
10420 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
10430 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42   ** wildcard.  B
10440 75 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65  ut if we increme
10450 6e 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c  nt '@', that wil
10460 6c 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74  l push it into t
10470 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  he.        ** al
10480 70 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77  phabetic range w
10490 68 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72  here case conver
104a0 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20  sions will mess 
104b0 75 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  up the .        
104c0 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  ** inequality.  
104d0 54 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d  To avoid this, m
104e0 61 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f  ake sure to also
104f0 20 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20   run the full.  
10500 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e        ** LIKE on
10510 20 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65   all candidate e
10520 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c  xpressions by cl
10530 65 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d  earing the isCom
10540 70 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20  plete flag.     
10550 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
10560 28 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43  ( c=='A'-1 ) isC
10570 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20  omplete = 0;.   
10580 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
10590 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b  UpperToLower[c];
105a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
105b0 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20  pC = c + 1;.    
105c0 7d 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61  }.    sCollSeqNa
105d0 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20  me.z = noCase ? 
105e0 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41  "NOCASE" : "BINA
105f0 52 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65  RY";.    sCollSe
10600 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20  qName.n = 6;.   
10610 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
10620 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
10630 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70  pLeft, 0);.    p
10640 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
10650 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
10660 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20  TK_GE, .        
10670 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
10680 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
10690 61 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26  arse,pNewExpr1,&
106a0 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20  sCollSeqName),. 
106b0 20 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c            pStr1,
106c0 20 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65   0);.    transfe
106d0 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e  rJoinMarkings(pN
106e0 65 77 45 78 70 72 31 2c 20 70 45 78 70 72 29 3b  ewExpr1, pExpr);
106f0 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77  .    idxNew1 = w
10700 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
10710 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c  (pWC, pNewExpr1,
10720 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
10730 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
10740 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
10750 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70  w1==0 );.    exp
10760 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
10770 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20  WC, idxNew1);.  
10780 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71    pNewExpr2 = sq
10790 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
107a0 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20   pLeft, 0);.    
107b0 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69  pNewExpr2 = sqli
107c0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
107d0 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20   TK_LT,.        
107e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
107f0 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
10800 61 72 73 65 2c 70 4e 65 77 45 78 70 72 32 2c 26  arse,pNewExpr2,&
10810 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20  sCollSeqName),. 
10820 20 20 20 20 20 20 20 20 20 20 70 53 74 72 32 2c            pStr2,
10830 20 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65   0);.    transfe
10840 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e  rJoinMarkings(pN
10850 65 77 45 78 70 72 32 2c 20 70 45 78 70 72 29 3b  ewExpr2, pExpr);
10860 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77  .    idxNew2 = w
10870 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
10880 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c  (pWC, pNewExpr2,
10890 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
108a0 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
108b0 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
108c0 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70  w2==0 );.    exp
108d0 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
108e0 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20  WC, idxNew2);.  
108f0 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
10900 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
10910 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29  if( isComplete )
10920 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  {.      pWC->a[i
10930 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20  dxNew1].iParent 
10940 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
10950 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d   pWC->a[idxNew2]
10960 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
10970 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  rm;.      pTerm-
10980 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20  >nChild = 2;.   
10990 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
109a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
109b0 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
109c0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
109d0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
109e0 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57  BLE.  /* Add a W
109f0 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72  O_MATCH auxiliar
10a00 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f  y term to the co
10a10 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20  nstraint set if 
10a20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
10a30 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
10a40 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c  f the form:  col
10a50 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a  umn MATCH expr..
10a60 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d    ** This inform
10a70 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  ation is used by
10a80 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
10a90 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20  methods of.  ** 
10aa0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20  virtual tables. 
10ab0 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72   The native quer
10ac0 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73  y optimizer does
10ad0 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a   not attempt.  *
10ae0 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67  * to do anything
10af0 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63   with MATCH func
10b00 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
10b10 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  ( isMatchOfColum
10b20 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
10b30 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
10b40 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
10b50 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54  Left;.    WhereT
10b60 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20  erm *pNewTerm;. 
10b70 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65     Bitmask prere
10b80 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45  qColumn, prereqE
10b90 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74  xpr;..    pRight
10ba0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
10bb0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
10bc0 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
10bd0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
10be0 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65  pExpr;.    prere
10bf0 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c  qExpr = exprTabl
10c00 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
10c10 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72   pRight);.    pr
10c20 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70  ereqColumn = exp
10c30 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
10c40 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20  kSet, pLeft);.  
10c50 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78 70    if( (prereqExp
10c60 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  r & prereqColumn
10c70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
10c80 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
10c90 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
10ca0 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
10cb0 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20  se, TK_MATCH, . 
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
10ce0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
10cf0 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30  b, pRight, 0), 0
10d00 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
10d10 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
10d20 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
10d30 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
10d40 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
10d50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
10d60 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
10d70 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57    pNewTerm = &pW
10d80 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
10d90 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
10da0 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72  ereqRight = prer
10db0 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  eqExpr;.      pN
10dc0 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ewTerm->leftCurs
10dd0 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
10de0 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  le;.      pNewTe
10df0 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
10e00 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
10e10 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  n;.      pNewTer
10e20 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
10e30 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70  O_MATCH;.      p
10e40 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  NewTerm->iParent
10e50 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
10e60 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
10e70 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
10e80 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
10e90 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  = 1;.      pTerm
10ea0 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
10eb0 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
10ec0 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
10ed0 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65  All = pTerm->pre
10ee0 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  reqAll;.    }.  
10ef0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10f00 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
10f10 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ABLE */..#ifdef 
10f20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
10f30 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f  AT3_OR_STAT4.  /
10f40 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74  * When sqlite_st
10f50 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61  at3 histogram da
10f60 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ta is available 
10f70 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74  an operator of t
10f80 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20  he.  ** form "x 
10f90 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e  IS NOT NULL" can
10fa0 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76   sometimes be ev
10fb0 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66  aluated more eff
10fc0 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73  iciently.  ** as
10fd0 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69   "x>NULL" if x i
10fe0 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
10ff0 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53   PRIMARY KEY.  S
11000 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20  o construct a.  
11010 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  ** virtual term 
11020 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20  of that form..  
11030 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
11040 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 65  t the virtual te
11050 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67 65  rm must be tagge
11060 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c  d with TERM_VNUL
11070 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45  L.  This.  ** TE
11080 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c  RM_VNULL tag wil
11090 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20 6e  l suppress the n
110a0 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74  ot-null check at
110b0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
110c0 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e   ** of the loop.
110d0 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54 45    Without the TE
110e0 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74  RM_VNULL flag, t
110f0 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63  he not-null chec
11100 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74  k at.  ** the st
11110 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  art of the loop 
11120 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79  will prevent any
11130 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65   results from be
11140 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  ing returned..  
11150 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
11160 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20  op==TK_NOTNULL. 
11170 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
11180 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
11190 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
111a0 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a  eft->iColumn>=0.
111b0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
111c0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
111d0 4c 49 54 45 5f 53 74 61 74 33 29 0a 20 20 29 7b  LITE_Stat3).  ){
111e0 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
111f0 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
11200 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
11210 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  eft;.    int idx
11220 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65  New;.    WhereTe
11230 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20  rm *pNewTerm;.. 
11240 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
11250 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
11260 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20  e, TK_GT,.      
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11290 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20  rDup(db, pLeft, 
112a0 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
112d0 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c  rse, TK_NULL, 0,
112e0 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20   0, 0), 0);..   
112f0 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
11300 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
11310 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20   pNewExpr,.     
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11330 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56 49           TERM_VI
11340 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
11350 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a  IC|TERM_VNULL);.
11360 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 20 29      if( idxNew )
11370 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  {.      pNewTerm
11380 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65   = &pWC->a[idxNe
11390 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  w];.      pNewTe
113a0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
113b0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  = 0;.      pNewT
113c0 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
113d0 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
113e0 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
113f0 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
11400 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
11410 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
11420 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47  eOperator = WO_G
11430 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  T;.      pNewTer
11440 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  m->iParent = idx
11450 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
11460 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
11470 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  erm];.      pTer
11480 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
11490 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
114a0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
114b0 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  ED;.      pNewTe
114c0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
114d0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
114e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
114f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
11500 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
11510 54 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76  T4 */..  /* Prev
11520 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65  ent ON clause te
11530 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  rms of a LEFT JO
11540 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73  IN from being us
11550 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a  ed to drive.  **
11560 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61   an index for ta
11570 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
11580 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
11590 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  */.  pTerm->prer
115a0 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72 61  eqRight |= extra
115b0 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Right;.}../*.** 
115c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
115d0 61 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72  arches pList for
115e0 20 61 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61   a entry that ma
115f0 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74  tches the iCol-t
11600 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69  h column.** of i
11610 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
11620 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72   If such an expr
11630 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
11640 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c   its index in pL
11650 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75  ist->a[] is retu
11660 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65  rned. If.** no e
11670 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
11680 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  nd, -1 is return
11690 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
116a0 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a  t findIndexCol(.
116b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
116c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116d0 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
116e0 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
116f0 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
11700 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
11710 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65  ssion list to se
11720 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42  arch */.  int iB
11730 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
11740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
11750 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73  sor for table as
11760 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
11770 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
11780 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
11790 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
117a0 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e   to match column
117b0 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   of */.  int iCo
117c0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
117d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
117e0 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d  mn of index to m
117f0 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
11800 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
11810 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
11820 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20  azColl[iCol];.. 
11830 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
11840 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
11850 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
11860 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
11870 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  late(pList->a[i]
11880 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
11890 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
118a0 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f  N.     && p->iCo
118b0 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
118c0 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20  lumn[iCol].     
118d0 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
118e0 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ase.    ){.     
118f0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
11900 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
11910 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
11920 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
11930 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
11940 53 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73  S(pColl) && 0==s
11950 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
11960 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  oll->zName, zCol
11970 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  l) ){.        re
11980 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a  turn i;.      }.
11990 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
119a0 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
119b0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
119c0 74 68 65 20 44 49 53 54 49 4e 43 54 20 65 78 70  the DISTINCT exp
119d0 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73  ression-list pas
119e0 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72 64  sed as the third
119f0 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
11a00 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a  redundant..**.**
11a10 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74   A DISTINCT list
11a20 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66   is redundant if
11a30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
11a40 6e 74 61 69 6e 73 20 73 6f 6d 65 20 73 75 62 73  ntains some subs
11a50 65 74 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73  et of.** columns
11a60 20 74 68 61 74 20 61 72 65 20 75 6e 69 71 75 65   that are unique
11a70 20 61 6e 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a   and non-null..*
11a80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 44  /.static int isD
11a90 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74  istinctRedundant
11aa0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11ab0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
11ac0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
11ad0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
11ae0 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20  TabList,        
11af0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
11b00 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
11b10 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
11b20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
11b30 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
11b40 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20  ist *pDistinct  
11b50 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75       /* The resu
11b60 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65 65 64  lt set that need
11b70 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54  s to be DISTINCT
11b80 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
11b90 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
11ba0 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20  Idx;.  int i;   
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42         .  int iB
11bd0 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ase;..  /* If th
11be0 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  ere is more than
11bf0 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75   one table or su
11c00 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20  b-select in the 
11c10 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20  FROM clause of. 
11c20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20   ** this query, 
11c30 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74  then it will not
11c40 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
11c50 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44 49  show that the DI
11c60 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61  STINCT .  ** cla
11c70 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74  use is redundant
11c80 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c  . */.  if( pTabL
11c90 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  ist->nSrc!=1 ) r
11ca0 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65  eturn 0;.  iBase
11cb0 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30   = pTabList->a[0
11cc0 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61  ].iCursor;.  pTa
11cd0 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
11ce0 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49  0].pTab;..  /* I
11cf0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70  f any of the exp
11d00 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49  ressions is an I
11d10 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62  PK column on tab
11d20 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72  le iBase, then r
11d30 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65  eturn .  ** true
11d40 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e  . Note: The (p->
11d50 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70  iTable==iBase) p
11d60 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73 74  art of this test
11d70 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69 66   may be false if
11d80 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
11d90 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f  t SELECT is a co
11da0 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65  rrelated sub-que
11db0 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ry..  */.  for(i
11dc0 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d  =0; i<pDistinct-
11dd0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11de0 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
11df0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
11e00 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b  te(pDistinct->a[
11e10 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
11e20 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
11e30 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65  UMN && p->iTable
11e40 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43  ==iBase && p->iC
11e50 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
11e60 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f   1;.  }..  /* Lo
11e70 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69  op through all i
11e80 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
11e90 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61  ble, checking ea
11ea0 63 68 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ch to see if it 
11eb0 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44  makes.  ** the D
11ec0 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65  ISTINCT qualifie
11ed0 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20  r redundant. It 
11ee0 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a  does so if:.  **
11ef0 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69  .  **   1. The i
11f00 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66 20 55  ndex is itself U
11f10 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a  NIQUE, and.  **.
11f20 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66    **   2. All of
11f30 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   the columns in 
11f40 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 65 69  the index are ei
11f50 74 68 65 72 20 70 61 72 74 20 6f 66 20 74 68 65  ther part of the
11f60 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20   pDistinct.  ** 
11f70 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c       list, or el
11f80 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  se the WHERE cla
11f90 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74  use contains a t
11fa0 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  erm of the form 
11fb0 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20  "col=X",.  **   
11fc0 20 20 20 77 68 65 72 65 20 58 20 69 73 20 61 20     where X is a 
11fd0 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20  constant value. 
11fe0 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
11ff0 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20  quences of the. 
12000 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69   **      compari
12010 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c  son and select-l
12020 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ist expressions 
12030 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65  must match those
12040 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
12050 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c   **.  **   3. Al
12060 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78  l of those index
12070 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69   columns for whi
12080 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ch the WHERE cla
12090 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a  use does not.  *
120a0 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61  *      contain a
120b0 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72   "col=X" term ar
120c0 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e  e subject to a N
120d0 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
120e0 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  nt..  */.  for(p
120f0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
12100 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
12110 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
12120 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
12130 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74  ==OE_None ) cont
12140 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  inue;.    for(i=
12150 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
12160 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
12170 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d  int iCol = pIdx-
12180 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
12190 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e 64 54      if( 0==findT
121a0 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c 20  erm(pWC, iBase, 
121b0 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29  iCol, ~(Bitmask)
121c0 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 20  0, WO_EQ, pIdx) 
121d0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
121e0 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64  IdxCol = findInd
121f0 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44  exCol(pParse, pD
12200 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c 20  istinct, iBase, 
12210 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 20 20  pIdx, i);.      
12220 20 20 69 66 28 20 69 49 64 78 43 6f 6c 3c 30 20    if( iIdxCol<0 
12230 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49  || pTab->aCol[pI
12240 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  dx->aiColumn[i]]
12250 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  .notNull==0 ){. 
12260 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
12270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12280 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
12290 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  i==pIdx->nColumn
122a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
122b0 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20  s index implies 
122c0 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43  that the DISTINC
122d0 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72  T qualifier is r
122e0 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20  edundant. */.   
122f0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
12300 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
12310 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 46 69   0;.}../* .** Fi
12320 6e 64 20 28 61 6e 20 61 70 70 72 6f 78 69 6d 61  nd (an approxima
12330 74 65 29 20 73 75 6d 20 6f 66 20 74 77 6f 20 57  te) sum of two W
12340 68 65 72 65 43 6f 73 74 73 2e 20 20 54 68 69 73  hereCosts.  This
12350 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 0a   computation is.
12360 2a 2a 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20  ** not a simple 
12370 22 2b 22 20 6f 70 65 72 61 74 6f 72 20 62 65 63  "+" operator bec
12380 61 75 73 65 20 57 68 65 72 65 43 6f 73 74 20 69  ause WhereCost i
12390 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6c 6f  s stored as a lo
123a0 67 61 72 69 74 68 6d 69 63 0a 2a 2a 20 76 61 6c  garithmic.** val
123b0 75 65 2e 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  ue..** .*/.stati
123c0 63 20 57 68 65 72 65 43 6f 73 74 20 77 68 65 72  c WhereCost wher
123d0 65 43 6f 73 74 41 64 64 28 57 68 65 72 65 43 6f  eCostAdd(WhereCo
123e0 73 74 20 61 2c 20 57 68 65 72 65 43 6f 73 74 20  st a, WhereCost 
123f0 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  b){.  static con
12400 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
12410 20 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 31 30   x[] = {.     10
12420 2c 20 31 30 2c 20 20 20 20 20 20 20 20 20 20 20  , 10,           
12430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12440 20 30 2c 31 20 2a 2f 0a 20 20 20 20 20 20 39 2c   0,1 */.      9,
12450 20 39 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   9,             
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12470 32 2c 33 20 2a 2f 0a 20 20 20 20 20 20 38 2c 20  2,3 */.      8, 
12480 38 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8,              
12490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34              /* 4
124a0 2c 35 20 2a 2f 0a 20 20 20 20 20 20 37 2c 20 37  ,5 */.      7, 7
124b0 2c 20 37 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 7,            
124c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 2c             /* 6,
124d0 37 2c 38 20 2a 2f 0a 20 20 20 20 20 20 36 2c 20  7,8 */.      6, 
124e0 36 2c 20 36 2c 20 20 20 20 20 20 20 20 20 20 20  6, 6,           
124f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 39              /* 9
12500 2c 31 30 2c 31 31 20 2a 2f 0a 20 20 20 20 20 20  ,10,11 */.      
12510 35 2c 20 35 2c 20 35 2c 20 20 20 20 20 20 20 20  5, 5, 5,        
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12530 2a 20 31 32 2d 31 34 20 2a 2f 0a 20 20 20 20 20  * 12-14 */.     
12540 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 20 20 20   4, 4, 4, 4,    
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12560 2f 2a 20 31 35 2d 31 38 20 2a 2f 0a 20 20 20 20  /* 15-18 */.    
12570 20 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20 33 2c    3, 3, 3, 3, 3,
12580 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
12590 20 2f 2a 20 31 39 2d 32 34 20 2a 2f 0a 20 20 20   /* 19-24 */.   
125a0 20 20 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32     2, 2, 2, 2, 2
125b0 2c 20 32 2c 20 32 2c 20 20 20 20 20 20 20 20 20  , 2, 2,         
125c0 20 20 2f 2a 20 32 35 2d 33 31 20 2a 2f 0a 20 20    /* 25-31 */.  
125d0 7d 3b 0a 20 20 69 66 28 20 61 3e 3d 62 20 29 7b  };.  if( a>=b ){
125e0 0a 20 20 20 20 69 66 28 20 61 3e 62 2b 34 39 20  .    if( a>b+49 
125f0 29 20 72 65 74 75 72 6e 20 61 3b 0a 20 20 20 20  ) return a;.    
12600 69 66 28 20 61 3e 62 2b 33 31 20 29 20 72 65 74  if( a>b+31 ) ret
12610 75 72 6e 20 61 2b 31 3b 0a 20 20 20 20 72 65 74  urn a+1;.    ret
12620 75 72 6e 20 61 2b 78 5b 61 2d 62 5d 3b 0a 20 20  urn a+x[a-b];.  
12630 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 62  }else{.    if( b
12640 3e 61 2b 34 39 20 29 20 72 65 74 75 72 6e 20 62  >a+49 ) return b
12650 3b 0a 20 20 20 20 69 66 28 20 62 3e 61 2b 33 31  ;.    if( b>a+31
12660 20 29 20 72 65 74 75 72 6e 20 62 2b 31 3b 0a 20   ) return b+1;. 
12670 20 20 20 72 65 74 75 72 6e 20 62 2b 78 5b 62 2d     return b+x[b-
12680 61 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a];.  }.}../*.**
12690 20 43 6f 6e 76 65 72 74 20 61 6e 20 69 6e 74 65   Convert an inte
126a0 67 65 72 20 69 6e 74 6f 20 61 20 57 68 65 72 65  ger into a Where
126b0 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  Cost.  In other 
126c0 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65 20 61  words, compute a
126d0 0a 2a 2a 20 67 6f 6f 64 20 61 70 70 72 6f 78 69  .** good approxi
126e0 6d 61 74 61 74 69 6f 6e 20 66 6f 72 20 31 30 2a  matation for 10*
126f0 6c 6f 67 32 28 78 29 2e 0a 2a 2f 0a 73 74 61 74  log2(x)..*/.stat
12700 69 63 20 57 68 65 72 65 43 6f 73 74 20 77 68 65  ic WhereCost whe
12710 72 65 43 6f 73 74 28 74 52 6f 77 63 6e 74 20 78  reCost(tRowcnt x
12720 29 7b 0a 20 20 73 74 61 74 69 63 20 57 68 65 72  ){.  static Wher
12730 65 43 6f 73 74 20 61 5b 5d 20 3d 20 7b 20 30 2c  eCost a[] = { 0,
12740 20 32 2c 20 33 2c 20 35 2c 20 36 2c 20 37 2c 20   2, 3, 5, 6, 7, 
12750 38 2c 20 39 20 7d 3b 0a 20 20 57 68 65 72 65 43  8, 9 };.  WhereC
12760 6f 73 74 20 79 20 3d 20 34 30 3b 0a 20 20 69 66  ost y = 40;.  if
12770 28 20 78 3c 38 20 29 7b 0a 20 20 20 20 69 66 28  ( x<8 ){.    if(
12780 20 78 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b   x<2 ) return 0;
12790 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3c 38 20  .    while( x<8 
127a0 29 7b 20 20 79 20 2d 3d 20 31 30 3b 20 78 20 3c  ){  y -= 10; x <
127b0 3c 3d 20 31 3b 20 7d 0a 20 20 7d 65 6c 73 65 7b  <= 1; }.  }else{
127c0 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3e 32 35  .    while( x>25
127d0 35 20 29 7b 20 79 20 2b 3d 20 34 30 3b 20 78 20  5 ){ y += 40; x 
127e0 3e 3e 3d 20 34 3b 20 7d 0a 20 20 20 20 77 68 69  >>= 4; }.    whi
127f0 6c 65 28 20 78 3e 31 35 20 29 7b 20 20 79 20 2b  le( x>15 ){  y +
12800 3d 20 31 30 3b 20 78 20 3e 3e 3d 20 31 3b 20 7d  = 10; x >>= 1; }
12810 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 5b  .  }.  return a[
12820 78 26 37 5d 20 2b 20 79 20 2d 20 31 30 3b 0a 7d  x&7] + y - 10;.}
12830 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12840 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12850 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  LE./*.** Convert
12860 20 61 20 64 6f 75 62 6c 65 20 28 61 73 20 72 65   a double (as re
12870 63 65 69 76 65 64 20 66 72 6f 6d 20 78 42 65 73  ceived from xBes
12880 74 49 6e 64 65 78 20 6f 66 20 61 20 76 69 72 74  tIndex of a virt
12890 75 61 6c 20 74 61 62 6c 65 29 0a 2a 2a 20 69 6e  ual table).** in
128a0 74 6f 20 61 20 57 68 65 72 65 43 6f 73 74 2e 20  to a WhereCost. 
128b0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
128c0 20 63 6f 6d 70 75 74 65 20 61 6e 20 61 70 70 72   compute an appr
128d0 6f 78 69 6d 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a  oximation for.**
128e0 20 31 30 2a 6c 6f 67 32 28 78 29 2e 0a 2a 2f 0a   10*log2(x)..*/.
128f0 73 74 61 74 69 63 20 57 68 65 72 65 43 6f 73 74  static WhereCost
12900 20 77 68 65 72 65 43 6f 73 74 46 72 6f 6d 44 6f   whereCostFromDo
12910 75 62 6c 65 28 64 6f 75 62 6c 65 20 78 29 7b 0a  uble(double x){.
12920 20 20 75 36 34 20 61 3b 0a 20 20 57 68 65 72 65    u64 a;.  Where
12930 43 6f 73 74 20 65 3b 0a 20 20 61 73 73 65 72 74  Cost e;.  assert
12940 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
12950 26 20 73 69 7a 65 6f 66 28 61 29 3d 3d 38 20 29  & sizeof(a)==8 )
12960 3b 0a 20 20 69 66 28 20 78 3c 3d 31 20 29 20 72  ;.  if( x<=1 ) r
12970 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 78  eturn 0;.  if( x
12980 3c 3d 32 30 30 30 30 30 30 30 30 30 20 29 20 72  <=2000000000 ) r
12990 65 74 75 72 6e 20 77 68 65 72 65 43 6f 73 74 28  eturn whereCost(
129a0 28 74 52 6f 77 63 6e 74 29 78 29 3b 0a 20 20 6d  (tRowcnt)x);.  m
129b0 65 6d 63 70 79 28 26 61 2c 20 26 78 2c 20 38 29  emcpy(&a, &x, 8)
129c0 3b 0a 20 20 65 20 3d 20 28 61 3e 3e 35 32 29 20  ;.  e = (a>>52) 
129d0 2d 20 31 30 32 32 3b 0a 20 20 72 65 74 75 72 6e  - 1022;.  return
129e0 20 65 2a 31 30 3b 0a 7d 0a 23 65 6e 64 69 66 20   e*10;.}.#endif 
129f0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
12a00 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
12a10 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
12a20 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20  he logarithm of 
12a30 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 20  the input value 
12a40 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74  to base 2..*/.st
12a50 61 74 69 63 20 57 68 65 72 65 43 6f 73 74 20 65  atic WhereCost e
12a60 73 74 4c 6f 67 28 57 68 65 72 65 43 6f 73 74 20  stLog(WhereCost 
12a70 4e 29 7b 0a 20 20 57 68 65 72 65 43 6f 73 74 20  N){.  WhereCost 
12a80 78 20 3d 20 77 68 65 72 65 43 6f 73 74 28 4e 29  x = whereCost(N)
12a90 3b 0a 20 20 72 65 74 75 72 6e 20 78 3e 33 33 20  ;.  return x>33 
12aa0 3f 20 78 20 2d 20 33 33 20 3a 20 30 3b 0a 7d 0a  ? x - 33 : 0;.}.
12ab0 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69  ./*.** Two routi
12ac0 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67  nes for printing
12ad0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
12ae0 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  an sqlite3_index
12af0 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  _info.** structu
12b00 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65  re.  Used for te
12b10 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
12b20 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65  ing only.  If ne
12b30 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f  ither.** SQLITE_
12b40 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44  TEST or SQLITE_D
12b50 45 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64  EBUG are defined
12b60 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75  , then these rou
12b70 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d  tines.** are no-
12b80 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ops..*/.#if !def
12b90 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
12ba0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26  _VIRTUALTABLE) &
12bb0 26 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54  & defined(WHERET
12bc0 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74  RACE_ENABLED).st
12bd0 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
12be0 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74  IDX_INPUTS(sqlit
12bf0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
12c00 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
12c10 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
12c20 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
12c30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
12c40 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
12c50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
12c60 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73  ugPrintf("  cons
12c70 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d  traint[%d]: col=
12c80 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d  %d termid=%d op=
12c90 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22  %d usabled=%d\n"
12ca0 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
12cb0 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
12cc0 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  t[i].iColumn,.  
12cd0 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
12ce0 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  int[i].iTermOffs
12cf0 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  et,.       p->aC
12d00 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c  onstraint[i].op,
12d10 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
12d20 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
12d30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
12d40 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b  ; i<p->nOrderBy;
12d50 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
12d60 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
12d70 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f   orderby[%d]: co
12d80 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c  l=%d desc=%d\n",
12d90 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
12da0 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
12db0 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
12dc0 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
12dd0 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  desc);.  }.}.sta
12de0 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
12df0 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74  DX_OUTPUTS(sqlit
12e00 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
12e10 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
12e20 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
12e30 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
12e40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
12e50 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
12e60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
12e70 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67  ugPrintf("  usag
12e80 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25  e[%d]: argvIdx=%
12e90 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20  d omit=%d\n",.  
12ea0 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
12eb0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
12ec0 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c  ge[i].argvIndex,
12ed0 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
12ee0 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f  traintUsage[i].o
12ef0 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mit);.  }.  sqli
12f00 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12f10 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20    idxNum=%d\n", 
12f20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71  p->idxNum);.  sq
12f30 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12f40 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22  ("  idxStr=%s\n"
12f50 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  , p->idxStr);.  
12f60 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
12f70 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e  tf("  orderByCon
12f80 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e  sumed=%d\n", p->
12f90 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29  orderByConsumed)
12fa0 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
12fb0 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61  Printf("  estima
12fc0 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70  tedCost=%g\n", p
12fd0 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
12fe0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
12ff0 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
13000 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
13010 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
13020 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  A).#endif..#ifnd
13030 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13040 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
13050 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
13060 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
13070 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20  ause term pTerm 
13080 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65  is of a form whe
13090 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62  re it.** could b
130a0 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
130b0 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70  ndex to access p
130c0 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e  Src, assuming an
130d0 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
130e0 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a  index existed..*
130f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72  /.static int ter
13100 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a  mCanDriveIndex(.
13110 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
13120 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
13130 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
13140 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a   term to check *
13150 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
13160 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
13170 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61     /* Table we a
13180 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63  re trying to acc
13190 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ess */.  Bitmask
131a0 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20   notReady       
131b0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
131c0 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s in outer loops
131d0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
131e0 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
131f0 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
13200 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43  Cursor!=pSrc->iC
13210 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30  ursor ) return 0
13220 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  ;.  if( (pTerm->
13230 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
13240 51 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  Q)==0 ) return 0
13250 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  ;.  if( (pTerm->
13260 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f  prereqRight & no
13270 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65 74  tReady)!=0 ) ret
13280 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65  urn 0;.  if( pTe
13290 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
132a0 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <0 ) return 0;. 
132b0 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61   aff = pSrc->pTa
132c0 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75  b->aCol[pTerm->u
132d0 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66  .leftColumn].aff
132e0 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71  inity;.  if( !sq
132f0 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
13300 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70  tyOk(pTerm->pExp
13310 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e  r, aff) ) return
13320 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
13330 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
13340 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13350 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
13360 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
13370 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
13380 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
13390 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
133a0 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
133b0 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
133c0 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
133d0 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
133e0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
133f0 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
13400 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
13410 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
13420 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
13430 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
13440 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
13450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13460 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
13470 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
13480 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
13490 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
134a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
134b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
134c0 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
134d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
134e0 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
134f0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
13500 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
13510 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
13520 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
13530 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
13540 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
13550 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
13560 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
13570 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
13580 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20  .  int nColumn; 
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
135a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
135b0 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
135c0 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
135d0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
135e0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
135f0 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
13600 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
13610 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
13620 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
13630 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
13640 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  C->a[] */.  int 
13650 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
13660 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
13670 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64  of memory needed
13680 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 49   for pIdx */.  I
13690 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
136a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
136b0 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20  ject describing 
136c0 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  the transient in
136d0 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
136e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
136f0 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
13700 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
13710 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
13720 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b  .  int addrInit;
13730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13740 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
13750 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
13760 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20  bypass jump */. 
13770 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20   Table *pTable; 
13780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13790 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
137a0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65 79  indexed */.  Key
137b0 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b 20  Info *pKeyinfo; 
137c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20           /* Key 
137d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
137e0 74 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20 0a  the index */   .
137f0 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13810 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65   Top of the inde
13820 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20  x fill loop */. 
13830 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13850 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
13860 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64   an index record
13870 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
13880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13890 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e    /* Column coun
138a0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ter */.  int i; 
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138c0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
138d0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  nter */.  int mx
138e0 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  BitCol;         
138f0 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
13900 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d   column in pSrc-
13910 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f  >colUsed */.  Co
13920 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
13930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
13940 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
13950 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a  to on a column *
13960 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
13970 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
13980 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65  /* The Loop obje
13990 63 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ct */.  Bitmask 
139a0 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  idxCols;        
139b0 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
139c0 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f   columns used fo
139d0 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
139e0 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c  Bitmask extraCol
139f0 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  s;          /* B
13a00 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f  itmap of additio
13a10 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nal columns */. 
13a20 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20   u8 sentWarning 
13a30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
13a40 54 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69  True if a warnni
13a50 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73 73 75  ng has been issu
13a60 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ed */..  /* Gene
13a70 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
13a80 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
13a90 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
13aa0 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
13ab0 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
13ac0 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
13ad0 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
13ae0 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
13af0 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
13b00 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
13b10 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
13b20 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
13b30 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
13b40 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
13b50 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
13b60 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
13b70 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64  added to the ind
13b80 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65 64  ex.  ** and used
13b90 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45 20   to match WHERE 
13ba0 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
13bb0 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d 6e 20  ts */.  nColumn 
13bc0 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20  = 0;.  pTable = 
13bd0 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57  pSrc->pTab;.  pW
13be0 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70  CEnd = &pWC->a[p
13bf0 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c  WC->nTerm];.  pL
13c00 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
13c10 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20  Loop;.  idxCols 
13c20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
13c30 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
13c40 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
13c50 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
13c60 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
13c70 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
13c80 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
13c90 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
13ca0 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
13cb0 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
13cc0 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53   iCol>=BMS ? MAS
13cd0 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41  KBIT(BMS-1) : MA
13ce0 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20  SKBIT(iCol);.   
13cf0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
13d00 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
13d10 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
13d20 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69  BMS-1 );.      i
13d30 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20  f( !sentWarning 
13d40 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13d50 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
13d60 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c  RNING_AUTOINDEX,
13d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75  .            "au
13d80 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e  tomatic index on
13d90 20 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65   %s(%s)", pTable
13da0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
13db0 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
13dc0 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a  l[iCol].zName);.
13dd0 20 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e          sentWarn
13de0 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ing = 1;.      }
13df0 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
13e00 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
13e10 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  ){.        if( w
13e20 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70  hereLoopResize(p
13e30 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70  Parse->db, pLoop
13e40 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 29 20 29 20 72  , nColumn+1) ) r
13e50 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70  eturn;.        p
13e60 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 43 6f  Loop->aLTerm[nCo
13e70 6c 75 6d 6e 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b  lumn++] = pTerm;
13e80 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73  .        idxCols
13e90 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20   |= cMask;.     
13ea0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
13eb0 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3e 30  ssert( nColumn>0
13ec0 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62   );.  pLoop->u.b
13ed0 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70  tree.nEq = pLoop
13ee0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 43 6f 6c 75  ->nLTerm = nColu
13ef0 6d 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  mn;.  pLoop->wsF
13f00 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
13f10 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49  UMN_EQ | WHERE_I
13f20 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f  DX_ONLY | WHERE_
13f30 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20 20  INDEXED.        
13f40 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57               | W
13f50 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b  HERE_AUTO_INDEX;
13f60 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
13f70 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69 74   number of addit
13f80 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
13f90 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  eded to create a
13fa0 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69  .  ** covering i
13fb0 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72 69  ndex.  A "coveri
13fc0 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e 20  ng index" is an 
13fd0 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
13fe0 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c  ins all.  ** col
13ff0 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 65  umns that are ne
14000 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65 72  eded by the quer
14010 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65 72  y.  With a cover
14020 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a 20  ing index, the. 
14030 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
14040 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  le never needs t
14050 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20 20  o be accessed.  
14060 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65  Automatic indice
14070 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61  s must.  ** be a
14080 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
14090 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64 65  because the inde
140a0 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70  x will not be up
140b0 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20 2a  dated if the.  *
140c0 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65  * original table
140d0 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68 65   changes and the
140e0 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
140f0 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20   cannot both be 
14100 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68 65  used.  ** if the
14110 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63  y go out of sync
14120 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f  ..  */.  extraCo
14130 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73  ls = pSrc->colUs
14140 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c  ed & (~idxCols |
14150 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 29   MASKBIT(BMS-1))
14160 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28  ;.  mxBitCol = (
14170 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20  pTable->nCol >= 
14180 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a  BMS-1) ? BMS-1 :
14190 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20   pTable->nCol;. 
141a0 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
141b0 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e->nCol==BMS-1 )
141c0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  ;.  testcase( pT
141d0 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  able->nCol==BMS-
141e0 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  2 );.  for(i=0; 
141f0 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
14200 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
14210 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29  ols & MASKBIT(i)
14220 20 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20   ) nColumn++;.  
14230 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
14240 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
14250 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 43  BMS-1) ){.    nC
14260 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d  olumn += pTable-
14270 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b  >nCol - BMS + 1;
14280 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  .  }.  pLoop->ws
14290 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
142a0 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
142b0 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f 2a  _IDX_ONLY;..  /*
142c0 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   Construct the I
142d0 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64  ndex object to d
142e0 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64  escribe this ind
142f0 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20  ex */.  nByte = 
14300 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20  sizeof(Index);. 
14310 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d   nByte += nColum
14320 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20  n*sizeof(int);  
14330 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f     /* Index.aiCo
14340 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20  lumn */.  nByte 
14350 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f  += nColumn*sizeo
14360 66 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49  f(char*);   /* I
14370 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20  ndex.azColl */. 
14380 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d   nByte += nColum
14390 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
143a0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72     /* Index.aSor
143b0 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78  tOrder */.  pIdx
143c0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
143d0 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
143e0 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  b, nByte);.  if(
143f0 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72   pIdx==0 ) retur
14400 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  n;.  pLoop->u.bt
14410 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
14420 78 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  x;.  pIdx->azCol
14430 6c 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64  l = (char**)&pId
14440 78 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69  x[1];.  pIdx->ai
14450 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26  Column = (int*)&
14460 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f  pIdx->azColl[nCo
14470 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn];.  pIdx->a
14480 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
14490 29 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  )&pIdx->aiColumn
144a0 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64  [nColumn];.  pId
144b0 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f  x->zName = "auto
144c0 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d  -index";.  pIdx-
144d0 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75  >nColumn = nColu
144e0 6d 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62  mn;.  pIdx->pTab
144f0 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e  le = pTable;.  n
14500 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20   = 0;.  idxCols 
14510 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
14520 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
14530 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
14540 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
14550 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
14560 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
14570 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
14580 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
14590 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
145a0 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
145b0 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53   iCol>=BMS ? MAS
145c0 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41  KBIT(BMS-1) : MA
145d0 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20  SKBIT(iCol);.   
145e0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
145f0 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
14600 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
14610 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69  ==BMS );.      i
14620 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
14630 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
14640 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
14650 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
14660 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63      idxCols |= c
14670 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49  Mask;.        pI
14680 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
14690 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
146a0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70  olumn;.        p
146b0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
146c0 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
146d0 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
146e0 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
146f0 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  );.        pIdx-
14700 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57  >azColl[n] = ALW
14710 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f  AYS(pColl) ? pCo
14720 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e  ll->zName : "BIN
14730 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b  ARY";.        n+
14740 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
14750 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
14760 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e  u32)n==pLoop->u.
14770 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20  btree.nEq );..  
14780 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61  /* Add additiona
14790 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  l columns needed
147a0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74   to make the aut
147b0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74  omatic index int
147c0 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e  o.  ** a coverin
147d0 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72  g index */.  for
147e0 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
147f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
14800 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b  extraCols & MASK
14810 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20  BIT(i) ){.      
14820 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
14830 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64  ] = i;.      pId
14840 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22  x->azColl[n] = "
14850 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e  BINARY";.      n
14860 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
14870 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  if( pSrc->colUse
14880 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  d & MASKBIT(BMS-
14890 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  1) ){.    for(i=
148a0 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d  BMS-1; i<pTable-
148b0 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
148c0 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
148d0 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
148e0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
148f0 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
14900 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
14910 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43  .  assert( n==nC
14920 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43  olumn );..  /* C
14930 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61  reate the automa
14940 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  tic index */.  p
14950 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65  Keyinfo = sqlite
14960 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
14970 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 61  arse, pIdx);.  a
14980 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69  ssert( pLevel->i
14990 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70  IdxCur>=0 );.  p
149a0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
149b0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
149c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
149d0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 41  dOp4(v, OP_OpenA
149e0 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c  utoindex, pLevel
149f0 2d 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f 6c 75  ->iIdxCur, nColu
14a00 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20 20  mn+1, 0,.       
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
14a20 61 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20 50 34  ar*)pKeyinfo, P4
14a30 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
14a40 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
14a50 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
14a60 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
14a70 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
14a80 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
14a90 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
14aa0 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
14ab0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
14ac0 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65  OP_Rewind, pLeve
14ad0 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 72  l->iTabCur);.  r
14ae0 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
14af0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
14b00 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  rse);.  sqlite3G
14b10 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
14b20 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c  pParse, pIdx, pL
14b30 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72  evel->iTabCur, r
14b40 65 67 52 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b  egRecord, 1, 0);
14b50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14b60 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
14b70 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  sert, pLevel->iI
14b80 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  dxCur, regRecord
14b90 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14ba0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
14bb0 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
14bc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14bd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
14be0 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  t, pLevel->iTabC
14bf0 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a  ur, addrTop+1);.
14c00 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
14c10 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
14c20 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
14c30 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33  NDEX);.  sqlite3
14c40 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14c50 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
14c60 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
14c70 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
14c80 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75  ord);.  .  /* Ju
14c90 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69  mp here when ski
14ca0 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
14cb0 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  lization */.  sq
14cc0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14cd0 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a  e(v, addrInit);.
14ce0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
14cf0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
14d00 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e  C_INDEX */..#ifn
14d10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14d20 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
14d30 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
14d40 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69  populate an sqli
14d50 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
14d60 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20  tructure. It is 
14d70 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
14d80 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
14d90 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
14da0 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73  ly release the s
14db0 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70  tructure.** by p
14dc0 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74  assing the point
14dd0 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
14de0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
14df0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
14e00 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
14e10 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c  3_index_info *al
14e20 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
14e30 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
14e40 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ,.  WhereClause 
14e50 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53  *pWC,.  struct S
14e60 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
14e70 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
14e80 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74  OrderBy.){.  int
14e90 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
14ea0 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
14eb0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
14ec0 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
14ed0 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
14ee0 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
14ef0 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
14f00 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
14f10 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
14f20 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
14f30 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
14f40 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
14f50 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
14f60 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
14f70 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  o;..  /* Count t
14f80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
14f90 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
14fa0 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
14fb0 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
14fc0 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
14fd0 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
14fe0 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
14ff0 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
15000 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
15010 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
15020 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
15030 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
15040 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
15050 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
15060 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
15070 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
15080 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
15090 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
150a0 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
150b0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
150c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
150d0 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
150e0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
150f0 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
15100 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
15110 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
15120 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
15130 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
15140 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a     nTerm++;.  }.
15150 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44  .  /* If the ORD
15160 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e  ER BY clause con
15170 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d  tains only colum
15180 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ns in the curren
15190 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  t .  ** virtual 
151a0 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63  table then alloc
151b0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
151c0 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20  e aOrderBy part 
151d0 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  of.  ** the sqli
151e0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
151f0 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  tructure..  */. 
15200 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
15210 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
15220 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72  .    int n = pOr
15230 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
15240 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
15250 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
15260 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
15270 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
15280 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
15290 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
152a0 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
152b0 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
152c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
152d0 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20    if( i==n){.   
152e0 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b     nOrderBy = n;
152f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
15300 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
15310 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
15320 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a   structure.  */.
15330 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c    pIdxInfo = sql
15340 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
15350 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
15360 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20  eof(*pIdxInfo). 
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15380 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a            + (siz
15390 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b  eof(*pIdxCons) +
153a0 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29   sizeof(*pUsage)
153b0 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  )*nTerm.        
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153d0 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64     + sizeof(*pId
153e0 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72  xOrderBy)*nOrder
153f0 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78  By );.  if( pIdx
15400 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Info==0 ){.    s
15410 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15420 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d  Parse, "out of m
15430 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74  emory");.    ret
15440 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
15450 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
15460 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
15470 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
15480 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  fo structure con
15490 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20  tains.  ** many 
154a0 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20  fields that are 
154b0 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22  declared "const"
154c0 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73   to prevent xBes
154d0 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a  tIndex from.  **
154e0 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20   changing them. 
154f0 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73   We have to do s
15500 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e  ome funky castin
15510 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20  g in order to.  
15520 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** initialize th
15530 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f  ose fields..  */
15540 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73  .  pIdxCons = (s
15550 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
15560 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29  dex_constraint*)
15570 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20  &pIdxInfo[1];.  
15580 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73  pIdxOrderBy = (s
15590 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
155a0 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49  dex_orderby*)&pI
155b0 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20  dxCons[nTerm];. 
155c0 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63   pUsage = (struc
155d0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
155e0 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
155f0 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e  *)&pIdxOrderBy[n
15600 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e  OrderBy];.  *(in
15610 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t*)&pIdxInfo->nC
15620 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72  onstraint = nTer
15630 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  m;.  *(int*)&pId
15640 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
15650 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  = nOrderBy;.  *(
15660 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
15670 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
15680 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
15690 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43  nstraint = pIdxC
156a0 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  ons;.  *(struct 
156b0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
156c0 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66  derby**)&pIdxInf
156d0 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49  o->aOrderBy = pI
156e0 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73  dxOrderBy;.  *(s
156f0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
15700 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
15710 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f  sage**)&pIdxInfo
15720 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
15730 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ge =.           
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15770 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a          pUsage;.
15780 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54  .  for(i=j=0, pT
15790 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
157a0 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
157b0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20  Term++){.    u8 
157c0 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  op;.    if( pTer
157d0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
157e0 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
157f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
15800 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
15810 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
15820 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
15830 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
15840 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
15850 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
15860 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
15870 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
15880 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
15890 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
158a0 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
158b0 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LL) ) continue;.
158c0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
158d0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
158e0 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
158f0 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
15900 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d  iColumn = pTerm-
15910 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
15920 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
15930 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a  TermOffset = i;.
15940 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54 65      op = (u8)pTe
15950 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
15960 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20  WO_ALL;.    if( 
15970 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d  op==WO_IN ) op =
15980 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64 78   WO_EQ;.    pIdx
15990 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b  Cons[j].op = op;
159a0 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65  .    /* The dire
159b0 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e  ct assignment in
159c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69   the previous li
159d0 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f  ne is possible o
159e0 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20  nly because.    
159f0 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53  ** the WO_ and S
15a00 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
15a10 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72  TRAINT_ codes ar
15a20 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68  e identical.  Th
15a30 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  e.    ** followi
15a40 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66  ng asserts verif
15a50 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  y this fact. */.
15a60 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45      assert( WO_E
15a70 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  Q==SQLITE_INDEX_
15a80 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b  CONSTRAINT_EQ );
15a90 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
15aa0 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LT==SQLITE_INDEX
15ab0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29  _CONSTRAINT_LT )
15ac0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
15ad0 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LE==SQLITE_INDE
15ae0 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20  X_CONSTRAINT_LE 
15af0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
15b00 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GT==SQLITE_IND
15b10 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54  EX_CONSTRAINT_GT
15b20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15b30 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GE==SQLITE_IN
15b40 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
15b50 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
15b60 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54   WO_MATCH==SQLIT
15b70 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
15b80 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20  NT_MATCH );.    
15b90 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
15ba0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
15bb0 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f  N|WO_EQ|WO_LT|WO
15bc0 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _LE|WO_GT|WO_GE|
15bd0 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20  WO_MATCH) );.   
15be0 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   j++;.  }.  for(
15bf0 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
15c00 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
15c10 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
15c20 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
15c30 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
15c40 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ].iColumn = pExp
15c50 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
15c60 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64  pIdxOrderBy[i].d
15c70 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  esc = pOrderBy->
15c80 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
15c90 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
15ca0 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dxInfo;.}../*.**
15cb0 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63   The table objec
15cc0 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73  t reference pass
15cd0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
15ce0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
15cf0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
15d00 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76  st represent a v
15d10 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68  irtual table. Th
15d20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  is function invo
15d30 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64  kes the xBestInd
15d40 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  ex().** method o
15d50 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
15d60 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c  ble with the sql
15d70 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
15d80 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63  object that.** c
15d90 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20 33  omes in as the 3
15da0 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  rd argument to t
15db0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
15dc0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
15dd0 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69  occurs, pParse i
15de0 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
15df0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
15e00 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a  e and a.** non-z
15e10 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74  ero value is ret
15e20 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
15e30 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 0 is returned 
15e40 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
15e50 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71  * part of the sq
15e60 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
15e70 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65   structure is le
15e80 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a  ft populated..**
15e90 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
15ea0 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  ot an error is r
15eb0 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74  eturned, it is t
15ec0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
15ed0 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  y of the.** call
15ee0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
15ef0 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20   free p->idxStr 
15f00 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65  if p->needToFree
15f10 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73  IdxStr indicates
15f20 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73  .** that this is
15f30 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
15f40 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73  atic int vtabBes
15f50 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  tIndex(Parse *pP
15f60 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
15f70 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  b, sqlite3_index
15f80 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c  _info *p){.  sql
15f90 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
15fa0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61   = sqlite3GetVTa
15fb0 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
15fc0 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20  pTab)->pVtab;.  
15fd0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
15fe0 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ..  TRACE_IDX_IN
15ff0 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20  PUTS(p);.  rc = 
16000 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e  pVtab->pModule->
16010 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62  xBestIndex(pVtab
16020 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44  , p);.  TRACE_ID
16030 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20  X_OUTPUTS(p);.. 
16040 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16050 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
16060 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
16070 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
16080 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
16090 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
160a0 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72  if( !pVtab->zErr
160b0 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
160c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
160d0 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  rse, "%s", sqlit
160e0 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20  e3ErrStr(rc));. 
160f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16100 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16110 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56  pParse, "%s", pV
16120 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
16130 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
16140 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
16150 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
16160 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a  ->zErrMsg = 0;..
16170 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
16180 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
16190 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61  ){.    if( !p->a
161a0 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
161b0 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73  able && p->aCons
161c0 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
161d0 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20  rgvIndex>0 ){.  
161e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
161f0 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
16200 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73         "table %s
16210 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74  : xBestIndex ret
16220 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64  urned an invalid
16230 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e   plan", pTab->zN
16240 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
16250 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
16260 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66  ->nErr;.}.#endif
16270 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
16280 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
16290 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23 69 66 64  TABLE) */...#ifd
162a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
162b0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
162c0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
162d0 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61  he location of a
162e0 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20   particular key 
162f0 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69  among all keys i
16300 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20  n an.** index.  
16310 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
16320 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f  s in aStat as fo
16330 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
16340 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73  aStat[0]      Es
16350 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  t. number of row
16360 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c  s less than pVal
16370 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  .**    aStat[1] 
16380 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
16390 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74   of rows equal t
163a0 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74  o pVal.**.** Ret
163b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
163c0 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
163d0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4b 65  tic void whereKe
163e0 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20  yStats(.  Parse 
163f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
16400 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
16410 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
16420 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16440 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
16450 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
16460 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
16470 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a   *pRec,       /*
16480 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65   Vector of value
16490 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f  s to consider */
164a0 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20  .  int roundUp, 
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
164c0 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72  * Round up if tr
164d0 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20  ue.  Round down 
164e0 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52  if false */.  tR
164f0 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20  owcnt *aStat    
16500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
16510 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20  : stats written 
16520 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
16530 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
16540 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  e = pIdx->aSampl
16550 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  e;.  int iCol;  
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16570 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71   /* Index of req
16580 75 69 72 65 64 20 73 74 61 74 73 20 69 6e 20 61  uired stats in a
16590 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20  nEq[] etc. */.  
165a0 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20  int iMin = 0;   
165b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
165c0 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e  mallest sample n
165d0 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f  ot yet tested */
165e0 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 64 78 2d  .  int i = pIdx-
165f0 3e 6e 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 2f  >nSample;      /
16600 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  * Smallest sampl
16610 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72  e larger than or
16620 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a   equal to pRec *
16630 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20  /.  int iTest;  
16640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16650 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74  /* Next sample t
16660 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20  o test */.  int 
16670 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
16680 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
16690 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
166a0 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  operation */..  
166b0 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20  assert( pRec!=0 
166c0 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
166d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
166e0 20 69 66 28 20 70 52 65 63 3d 3d 30 20 29 20 72   if( pRec==0 ) r
166f0 65 74 75 72 6e 3b 0a 20 20 69 43 6f 6c 20 3d 20  eturn;.  iCol = 
16700 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 2d 20 31  pRec->nField - 1
16710 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
16720 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
16730 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e   assert( pRec->n
16740 46 69 65 6c 64 3e 30 20 26 26 20 69 43 6f 6c 3c  Field>0 && iCol<
16750 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  pIdx->nSampleCol
16760 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 54   );.  do{.    iT
16770 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 29 2f 32  est = (iMin+i)/2
16780 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  ;.    res = sqli
16790 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
167a0 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 54 65  pare(aSample[iTe
167b0 73 74 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  st].n, aSample[i
167c0 54 65 73 74 5d 2e 70 2c 20 70 52 65 63 29 3b 0a  Test].p, pRec);.
167d0 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
167e0 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54  .      iMin = iT
167f0 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  est+1;.    }else
16800 7b 0a 20 20 20 20 20 20 69 20 3d 20 69 54 65 73  {.      i = iTes
16810 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  t;.    }.  }whil
16820 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69  e( res && iMin<i
16830 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
16840 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
16850 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
16860 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68  rt statements ch
16870 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e  eck that the bin
16880 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a  ary search code.
16890 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64    ** above found
168a0 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77 65   the right answe
168b0 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  r. This block se
168c0 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20  rves no purpose 
168d0 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20  other.  ** than 
168e0 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73  to invoke the as
168f0 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28  serts.  */.  if(
16900 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   res==0 ){.    /
16910 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73  * If (res==0) is
16920 20 74 72 75 65 2c 20 74 68 65 6e 20 73 61 6d 70   true, then samp
16930 6c 65 20 24 69 20 6d 75 73 74 20 62 65 20 65 71  le $i must be eq
16940 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20  ual to pRec */. 
16950 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64     assert( i<pId
16960 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20  x->nSample );.  
16970 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
16980 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
16990 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d  mpare(aSample[i]
169a0 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70  .n, aSample[i].p
169b0 2c 20 70 52 65 63 29 0a 20 20 20 20 20 20 20 20  , pRec).        
169c0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
169d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
169e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
169f0 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63 20  Otherwise, pRec 
16a00 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20  must be smaller 
16a10 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20 61  than sample $i a
16a20 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  nd larger than. 
16a30 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69     ** sample ($i
16a40 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  -1).  */.    ass
16a50 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  ert( i==pIdx->nS
16a60 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20  ample .         
16a70 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  || sqlite3VdbeRe
16a80 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
16a90 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
16aa0 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a  e[i].p, pRec)>0.
16ab0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
16ac0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
16ad0 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65  iled );.    asse
16ae0 72 74 28 20 69 3d 3d 30 0a 20 20 20 20 20 20 20  rt( i==0.       
16af0 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65    || sqlite3Vdbe
16b00 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
16b10 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53  ample[i-1].n, aS
16b20 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52  ample[i-1].p, pR
16b30 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  ec)<0.         |
16b40 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
16b50 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
16b60 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65  }.#endif /* ifde
16b70 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
16b80 2f 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  /..  /* At this 
16b90 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69  point, aSample[i
16ba0 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  ] is the first s
16bb0 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67 72  ample that is gr
16bc0 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20  eater than.  ** 
16bd0 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c  or equal to pVal
16be0 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49 64 78  .  Or if i==pIdx
16bf0 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20  ->nSample, then 
16c00 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72 65 20  all samples are 
16c10 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70  less.  ** than p
16c20 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c 65  Val.  If aSample
16c30 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20  [i]==pVal, then 
16c40 72 65 73 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 69  res==0..  */.  i
16c50 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
16c60 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d   aStat[0] = aSam
16c70 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  ple[i].anLt[iCol
16c80 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  ];.    aStat[1] 
16c90 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45  = aSample[i].anE
16ca0 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65  q[iCol];.  }else
16cb0 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c  {.    tRowcnt iL
16cc0 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20 69 47  ower, iUpper, iG
16cd0 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 30  ap;.    if( i==0
16ce0 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
16cf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70   = 0;.      iUpp
16d00 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e  er = aSample[0].
16d10 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
16d20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70  }else{.      iUp
16d30 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e  per = i>=pIdx->n
16d40 53 61 6d 70 6c 65 20 3f 20 70 49 64 78 2d 3e 61  Sample ? pIdx->a
16d50 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 61 53 61  iRowEst[0] : aSa
16d60 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
16d70 6c 5d 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72  l];.      iLower
16d80 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e   = aSample[i-1].
16d90 61 6e 45 71 5b 69 43 6f 6c 5d 20 2b 20 61 53 61  anEq[iCol] + aSa
16da0 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 4c 74 5b 69  mple[i-1].anLt[i
16db0 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col];.    }.    
16dc0 61 53 74 61 74 5b 31 5d 20 3d 20 28 70 49 64 78  aStat[1] = (pIdx
16dd0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 69 43 6f 6c 20 3f  ->nColumn>iCol ?
16de0 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43   pIdx->aAvgEq[iC
16df0 6f 6c 5d 20 3a 20 31 29 3b 0a 20 20 20 20 69 66  ol] : 1);.    if
16e00 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72  ( iLower>=iUpper
16e10 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
16e20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
16e30 20 20 20 20 20 69 47 61 70 20 3d 20 69 55 70 70       iGap = iUpp
16e40 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20  er - iLower;.   
16e50 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64   }.    if( round
16e60 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70  Up ){.      iGap
16e70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20   = (iGap*2)/3;. 
16e80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16e90 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20  iGap = iGap/3;. 
16ea0 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30     }.    aStat[0
16eb0 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61  ] = iLower + iGa
16ec0 70 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  p;.  }.}.#endif 
16ed0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
16ee0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
16ef0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
16f00 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
16f10 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
16f20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
16f30 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69  hat will be visi
16f40 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69  ted.** by scanni
16f50 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ng an index for 
16f60 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65  a range of value
16f70 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79  s. The range may
16f80 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a   have an upper.*
16f90 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72  * bound, a lower
16fa0 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e   bound, or both.
16fb0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
16fc0 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74  e terms that set
16fd0 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e   the upper.** an
16fe0 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61  d lower bounds a
16ff0 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62  re represented b
17000 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  y pLower and pUp
17010 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
17020 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65  . For.** example
17030 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
17040 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
17050 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  (a):.**.**   ...
17060 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
17070 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
17080 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
17090 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c           |_____|
170a0 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20     |_____|.**   
170b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170c0 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a      |         |.
170d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
170e0 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20         pLower   
170f0 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66   pUpper.**.** If
17100 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75   either of the u
17110 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f  pper or lower bo
17120 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65  und is not prese
17130 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73  nt, then NULL is
17140 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c   passed in.** pl
17150 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ace of the corre
17160 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65  sponding WhereTe
17170 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  rm..**.** The va
17180 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72  lue in (pBuilder
17190 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
171a0 6e 45 71 29 20 69 73 20 74 68 65 20 69 6e 64 65  nEq) is the inde
171b0 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a  x of the index.*
171c0 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74  * column subject
171d0 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63 6f   to the range co
171e0 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71  nstraint. Or, eq
171f0 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20  uivalently, the 
17200 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75  number of.** equ
17210 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
17220 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74  s optimized by t
17230 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65  he proposed inde
17240 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d  x scan. For exam
17250 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67  ple,.** assuming
17260 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74   index p is on t
17270 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65  1(a, b), and the
17280 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a   SQL query is:.*
17290 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
172a0 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41  t1 WHERE a = ? A
172b0 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c  ND b > ? AND b <
172c0 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
172d0 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20  n nEq is set to 
172e0 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20  1 (as the range 
172f0 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d  restricted colum
17300 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65 63  n, b, is the sec
17310 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73  ond .** left-mos
17320 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
17330 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74  index). Or, if t
17340 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  he query is:.**.
17350 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
17360 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
17370 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   a < ? ....**.**
17380 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74   then nEq is set
17390 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   to 0..**.** Whe
173a0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
173b0 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75  is called, *pnOu
173c0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
173d0 77 68 65 72 65 43 6f 73 74 28 29 20 6f 66 20 74  whereCost() of t
173e0 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
173f0 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 69 6e  rows that the in
17400 64 65 78 20 73 63 61 6e 20 69 73 20 65 78 70 65  dex scan is expe
17410 63 74 65 64 20 74 6f 20 76 69 73 69 74 20 77 69  cted to visit wi
17420 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  thout .** consid
17430 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20  ering the range 
17440 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20  constraints. If 
17450 6e 45 71 20 69 73 20 30 2c 20 74 68 69 73 20 69  nEq is 0, this i
17460 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
17470 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20  .** rows in the 
17480 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20  index. Assuming 
17490 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
174a0 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73   *pnOut is adjus
174b0 74 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a  ted (reduced).**
174c0 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
174d0 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 74 72 61  the range contra
174e0 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20  ints pLower and 
174f0 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49  pUpper..** .** I
17500 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66  n the absence of
17510 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e   sqlite_stat4 AN
17520 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69  ALYZE data, or i
17530 66 20 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e  f such data cann
17540 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 65  ot be.** used, e
17550 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75 61  ach range inequa
17560 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68 65  lity reduces the
17570 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79   search space by
17580 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20   a factor of 4. 
17590 0a 2a 2a 20 48 65 6e 63 65 20 61 20 70 61 69 72  .** Hence a pair
175a0 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   of constraints 
175b0 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65  (x>? AND x<?) re
175c0 64 75 63 65 73 20 74 68 65 20 65 78 70 65 63 74  duces the expect
175d0 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  ed number of.** 
175e0 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  rows visited by 
175f0 61 20 66 61 63 74 6f 72 20 6f 66 20 31 36 2e 0a  a factor of 16..
17600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
17610 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
17620 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
17630 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
17640 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
17650 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
17660 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
17670 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
17680 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
17690 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
176a0 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
176b0 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
176c0 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
176d0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
176e0 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
176f0 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
17700 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
17710 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
17720 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 6e 4f    WhereCost *pnO
17730 75 74 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54  ut     /* IN/OUT
17740 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  : Number of rows
17750 20 76 69 73 69 74 65 64 20 2a 2f 0a 29 7b 0a 20   visited */.){. 
17760 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17770 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20  _OK;.  int nOut 
17780 3d 20 28 69 6e 74 29 2a 70 6e 4f 75 74 3b 0a 0a  = (int)*pnOut;..
17790 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
177a0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
177b0 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  AT4.  Index *p =
177c0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
177d0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
177e0 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 42 75  .  int nEq = pBu
177f0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
17800 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28  tree.nEq;..  if(
17810 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 0a 20 20   p->nSample>0.  
17820 20 26 26 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65   && nEq==pBuilde
17830 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a 20 20 20  r->nRecValid.   
17840 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c  && nEq<p->nSampl
17850 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70 74 69 6d  eCol.   && Optim
17860 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
17870 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
17880 45 5f 53 74 61 74 33 29 20 0a 20 20 29 7b 0a 20  E_Stat3) .  ){. 
17890 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72     UnpackedRecor
178a0 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64  d *pRec = pBuild
178b0 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20 74 52  er->pRec;.    tR
178c0 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20  owcnt a[2];.    
178d0 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 2f 2a 20  u8 aff;..    /* 
178e0 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72 20  Variable iLower 
178f0 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74  will be set to t
17900 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  he estimate of t
17910 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
17920 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  s in .    ** the
17930 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20   index that are 
17940 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f  less than the lo
17950 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  wer bound of the
17960 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54 68   range query. Th
17970 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62  e.    ** lower b
17980 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63  ound being the c
17990 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20  oncatenation of 
179a0 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65  $P and $L, where
179b0 20 24 50 20 69 73 20 74 68 65 0a 20 20 20 20 2a   $P is the.    *
179c0 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72  * key-prefix for
179d0 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 76  med by the nEq v
179e0 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61 67  alues matched ag
179f0 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65  ainst the nEq le
17a00 66 74 2d 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 63  ft-most.    ** c
17a10 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
17a20 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20 74  dex, and $L is t
17a30 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77  he value in pLow
17a40 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  er..    **.    *
17a50 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20  * Or, if pLower 
17a60 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61  is NULL or $L ca
17a70 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
17a80 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75  d from it (becau
17a90 73 65 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20  se it.    ** is 
17aa0 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61 72  not a simple var
17ab0 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61 6c  iable or literal
17ac0 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f 77   value), the low
17ad0 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 0a  er bound of the.
17ae0 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73 20      ** range is 
17af0 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75 69  $P. Due to a qui
17b00 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77 68  rk in the way wh
17b10 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 77 6f  ereKeyStats() wo
17b20 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a  rks, even.    **
17b30 20 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c 61   if $L is availa
17b40 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74 61  ble, whereKeySta
17b50 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66  ts() is called f
17b60 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e 64  or both ($P) and
17b70 20 0a 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29   .    ** ($P:$L)
17b80 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20   and the larger 
17b90 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74 75 72  of the two retur
17ba0 6e 65 64 20 76 61 6c 75 65 73 20 75 73 65 64 2e  ned values used.
17bb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
17bc0 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72  imilarly, iUpper
17bd0 20 69 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f   is to be set to
17be0 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66   the estimate of
17bf0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
17c00 6f 77 73 0a 20 20 20 20 2a 2a 20 6c 65 73 73 20  ows.    ** less 
17c10 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62  than the upper b
17c20 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67  ound of the rang
17c30 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20 74  e query. Where t
17c40 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20  he upper bound. 
17c50 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
17c60 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55 29 2e  ($P) or ($P:$U).
17c70 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69 66 20   Again, even if 
17c80 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  $U is available,
17c90 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 20   both values.   
17ca0 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72   ** of iUpper ar
17cb0 65 20 72 65 71 75 65 73 74 65 64 20 6f 66 20 77  e requested of w
17cc0 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 61  hereKeyStats() a
17cd0 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75  nd the smaller u
17ce0 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  sed..    */.    
17cf0 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 0a  tRowcnt iLower;.
17d00 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70      tRowcnt iUpp
17d10 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 6e 45 71  er;..    if( nEq
17d20 3d 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  ==p->nColumn ){.
17d30 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
17d40 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
17d50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17d60 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
17d70 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
17d80 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69 6e 69 74  mn[nEq]].affinit
17d90 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  y;.    }.    /* 
17da0 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72  Determine iLower
17db0 20 61 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e   and iUpper usin
17dc0 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a  g ($P) only. */.
17dd0 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29      if( nEq==0 )
17de0 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  {.      iLower =
17df0 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72   0;.      iUpper
17e00 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30   = p->aiRowEst[0
17e10 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
17e20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69      /* Note: thi
17e30 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20  s call could be 
17e40 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20 2d  optimized away -
17e50 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65 20   since the same 
17e60 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20 20  values must .   
17e70 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20     ** have been 
17e80 72 65 71 75 65 73 74 65 64 20 77 68 65 6e 20 74  requested when t
17e90 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20 69 6e  esting key $P in
17ea0 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
17eb0 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20  st().  */.      
17ec0 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
17ed0 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30  arse, p, pRec, 0
17ee0 2c 20 61 29 3b 0a 20 20 20 20 20 20 69 4c 6f 77  , a);.      iLow
17ef0 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  er = a[0];.     
17f00 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b   iUpper = a[0] +
17f10 20 61 5b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20   a[1];.    }..  
17f20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65    /* If possible
17f30 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65  , improve on the
17f40 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61 74 65   iLower estimate
17f50 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20   using ($P:$L). 
17f60 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 77 65  */.    if( pLowe
17f70 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  r ){.      int b
17f80 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Ok;             
17f90 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
17fa0 66 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61  f value is extra
17fb0 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20  cted from pExpr 
17fc0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
17fd0 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70  Expr = pLower->p
17fe0 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
17ff0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
18000 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
18010 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21   (WO_GT|WO_GE))!
18020 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
18030 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
18040 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
18050 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
18060 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62  pr, aff, nEq, &b
18070 4f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Ok);.      if( r
18080 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18090 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 74  bOk ){.        t
180a0 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20  Rowcnt iNew;.   
180b0 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61       whereKeySta
180c0 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
180d0 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 0, a);.     
180e0 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b     iNew = a[0] +
180f0 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72   ((pLower->eOper
18100 61 74 6f 72 20 26 20 57 4f 5f 47 54 29 20 3f 20  ator & WO_GT) ? 
18110 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
18120 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f 77     if( iNew>iLow
18130 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69 4e  er ) iLower = iN
18140 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ew;.      }.    
18150 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  }..    /* If pos
18160 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
18170 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74  n the iUpper est
18180 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
18190 24 55 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  $U). */.    if( 
181a0 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  pUpper ){.      
181b0 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20  int bOk;        
181c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
181d0 72 75 65 20 69 66 20 76 61 6c 75 65 20 69 73 20  rue if value is 
181e0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
181f0 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  Expr */.      Ex
18200 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70  pr *pExpr = pUpp
18210 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
18220 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
18230 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61   (pUpper->eOpera
18240 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f  tor & (WO_LT|WO_
18250 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  LE))!=0 );.     
18260 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
18270 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
18280 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
18290 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
182a0 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
182b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
182c0 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20  K && bOk ){.    
182d0 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77      tRowcnt iNew
182e0 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b  ;.        whereK
182f0 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
18300 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a  p, pRec, 1, a);.
18310 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61          iNew = a
18320 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d 3e  [0] + ((pUpper->
18330 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
18340 45 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a  E) ? a[1] : 0);.
18350 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
18360 3c 69 55 70 70 65 72 20 29 20 69 55 70 70 65 72  <iUpper ) iUpper
18370 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = iNew;.      }
18380 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 42 75 69  .    }..    pBui
18390 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65  lder->pRec = pRe
183a0 63 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  c;.    if( rc==S
183b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
183c0 20 20 57 68 65 72 65 43 6f 73 74 20 6e 4e 65 77    WhereCost nNew
183d0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 55 70 70  ;.      if( iUpp
183e0 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20  er>iLower ){.   
183f0 20 20 20 20 20 6e 4e 65 77 20 3d 20 77 68 65 72       nNew = wher
18400 65 43 6f 73 74 28 69 55 70 70 65 72 20 2d 20 69  eCost(iUpper - i
18410 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d 65  Lower);.      }e
18420 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4e 65  lse{.        nNe
18430 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61  w = 10;        a
18440 73 73 65 72 74 28 20 31 30 3d 3d 77 68 65 72 65  ssert( 10==where
18450 43 6f 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20  Cost(2) );.     
18460 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 65   }.      if( nNe
18470 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  w<nOut ){.      
18480 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20    nOut = nNew;. 
18490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e       }.      *pn
184a0 4f 75 74 20 3d 20 28 57 68 65 72 65 43 6f 73 74  Out = (WhereCost
184b0 29 6e 4f 75 74 3b 0a 20 20 20 20 20 20 57 48 45  )nOut;.      WHE
184c0 52 45 54 52 41 43 45 28 30 78 31 30 30 2c 20 28  RETRACE(0x100, (
184d0 22 72 61 6e 67 65 20 73 63 61 6e 20 72 65 67 69  "range scan regi
184e0 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 65 73 74  ons: %u..%u  est
184f0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
18500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18510 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75   (u32)iLower, (u
18520 33 32 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29  32)iUpper, nOut)
18530 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18540 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
18550 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
18560 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
18570 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  arse);.  UNUSED_
18580 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64  PARAMETER(pBuild
18590 65 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  er);.#endif.  as
185a0 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20  sert( pLower || 
185b0 70 55 70 70 65 72 20 29 3b 0a 20 20 2f 2a 20 54  pUpper );.  /* T
185c0 55 4e 49 4e 47 3a 20 20 45 61 63 68 20 69 6e 65  UNING:  Each ine
185d0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
185e0 6e 74 20 72 65 64 75 63 65 73 20 74 68 65 20 73  nt reduces the s
185f0 65 61 72 63 68 20 73 70 61 63 65 20 34 2d 66 6f  earch space 4-fo
18600 6c 64 2e 0a 20 20 2a 2a 20 41 20 42 45 54 57 45  ld..  ** A BETWE
18610 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65  EN operator, the
18620 72 65 66 6f 72 65 2c 20 72 65 64 75 63 65 73 20  refore, reduces 
18630 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
18640 20 31 36 2d 66 6f 6c 64 20 2a 2f 0a 20 20 69 66   16-fold */.  if
18650 28 20 70 4c 6f 77 65 72 20 26 26 20 28 70 4c 6f  ( pLower && (pLo
18660 77 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  wer->wtFlags & T
18670 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b  ERM_VNULL)==0 ){
18680 0a 20 20 20 20 6e 4f 75 74 20 2d 3d 20 32 30 3b  .    nOut -= 20;
18690 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
186a0 32 30 3d 3d 77 68 65 72 65 43 6f 73 74 28 34 29  20==whereCost(4)
186b0 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 55   );.  }.  if( pU
186c0 70 70 65 72 20 29 7b 0a 20 20 20 20 6e 4f 75 74  pper ){.    nOut
186d0 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61   -= 20;        a
186e0 73 73 65 72 74 28 20 32 30 3d 3d 77 68 65 72 65  ssert( 20==where
186f0 43 6f 73 74 28 34 29 20 29 3b 0a 20 20 7d 0a 20  Cost(4) );.  }. 
18700 20 69 66 28 20 6e 4f 75 74 3c 31 30 20 29 20 6e   if( nOut<10 ) n
18710 4f 75 74 20 3d 20 31 30 3b 0a 20 20 2a 70 6e 4f  Out = 10;.  *pnO
18720 75 74 20 3d 20 28 57 68 65 72 65 43 6f 73 74 29  ut = (WhereCost)
18730 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  nOut;.  return r
18740 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
18750 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
18760 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
18770 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
18780 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
18790 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
187a0 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
187b0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
187c0 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64  aint x=VALUE and
187d0 20 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55   where that VALU
187e0 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74  E occurs in.** t
187f0 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  he histogram dat
18800 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f  a.  This only wo
18810 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68  rks when x is th
18820 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63  e left-most.** c
18830 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65  olumn of an inde
18840 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61  x and sqlite_sta
18850 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  t3 histogram dat
18860 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a  a is available.*
18870 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78  * for that index
18880 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e  .  When pExpr==N
18890 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ULL that means t
188a0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
188b0 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20  .** "x IS NULL" 
188c0 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41  instead of "x=VA
188d0 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  LUE"..**.** Writ
188e0 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
188f0 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
18900 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
18910 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
18920 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
18930 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
18940 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
18950 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
18960 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
18970 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18980 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
18990 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
189a0 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
189b0 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
189c0 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
189d0 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
189e0 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
189f0 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
18a00 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
18a10 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
18a20 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
18a30 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
18a40 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
18a50 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
18a60 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45  tatic int whereE
18a70 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50  qualScanEst(.  P
18a80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18a90 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
18aa0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
18ab0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
18ac0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
18ad0 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72  pBuilder,.  Expr
18ae0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
18af0 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
18b00 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20  or VALUE in the 
18b10 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69  x=VALUE constrai
18b20 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  nt */.  tRowcnt 
18b30 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
18b40 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
18b50 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
18b60 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
18b70 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  x *p = pBuilder-
18b80 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70  >pNew->u.btree.p
18b90 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
18ba0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
18bb0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
18bc0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
18bd0 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65   *pRec = pBuilde
18be0 72 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20 61 66  r->pRec;.  u8 af
18bf0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
18c00 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61       /* Column a
18c10 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74  ffinity */.  int
18c20 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
18c30 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e         /* Subfun
18c40 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
18c50 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  e */.  tRowcnt a
18c60 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [2];            
18c70 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a   /* Statistics *
18c80 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20  /.  int bOk;..  
18c90 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29  assert( nEq>=1 )
18ca0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c  ;.  assert( nEq<
18cb0 3d 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 20  =(p->nColumn+1) 
18cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
18cd0 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
18ce0 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70  assert( p->nSamp
18cf0 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  le>0 );.  assert
18d00 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  ( pBuilder->nRec
18d10 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20  Valid<nEq );..  
18d20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20 61 72 65  /* If values are
18d30 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
18d40 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66  or all fields of
18d50 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 74 68   the index to th
18d60 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74  e left.  ** of t
18d70 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69  his one, no esti
18d80 6d 61 74 65 20 63 61 6e 20 62 65 20 6d 61 64 65  mate can be made
18d90 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
18da0 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69  NOTFOUND. */.  i
18db0 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  f( pBuilder->nRe
18dc0 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29  cValid<(nEq-1) )
18dd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
18de0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
18df0 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  }..  /* This is 
18e00 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
18e10 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c 20 74  only. The call t
18e20 6f 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  o sqlite3Stat4Pr
18e30 6f 62 65 53 65 74 56 61 6c 75 65 28 29 0a 20 20  obeSetValue().  
18e40 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72  ** below would r
18e50 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 76  eturn the same v
18e60 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  alue.  */.  if( 
18e70 6e 45 71 3e 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  nEq>p->nColumn )
18e80 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31  {.    *pnRow = 1
18e90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
18ea0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61  ITE_OK;.  }..  a
18eb0 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  ff = p->pTable->
18ec0 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e  aCol[p->aiColumn
18ed0 5b 6e 45 71 2d 31 5d 5d 2e 61 66 66 69 6e 69 74  [nEq-1]].affinit
18ee0 79 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  y;.  rc = sqlite
18ef0 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
18f00 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
18f10 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66  pRec, pExpr, aff
18f20 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a  , nEq-1, &bOk);.
18f30 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63    pBuilder->pRec
18f40 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72   = pRec;.  if( r
18f50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
18f60 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
18f70 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  bOk==0 ) return 
18f80 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
18f90 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  .  pBuilder->nRe
18fa0 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20  cValid = nEq;.. 
18fb0 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
18fc0 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
18fd0 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52  0, a);.  WHERETR
18fe0 41 43 45 28 30 78 31 30 30 2c 28 22 65 71 75 61  ACE(0x100,("equa
18ff0 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e  lity scan region
19000 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61  s: %d\n", (int)a
19010 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20  [1]));.  *pnRow 
19020 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74  = a[1];.  .  ret
19030 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
19040 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
19050 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
19060 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
19070 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
19080 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
19090 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
190a0 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
190b0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
190c0 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
190d0 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68  IN constraint wh
190e0 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61  ere the right-ha
190f0 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
19100 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  N operator.** is
19110 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65   a list of value
19120 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  s.  Example:.**.
19130 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20  **        WHERE 
19140 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a  x IN (1,2,3,4).*
19150 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65  *.** Write the e
19160 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75  stimated row cou
19170 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61  nt into *pnRow a
19180 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
19190 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62  _OK. .** If unab
191a0 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73  le to make an es
191b0 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70  timate, leave *p
191c0 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61  nRow unchanged a
191d0 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
191e0 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -zero..**.** Thi
191f0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61  s routine can fa
19200 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62  il if it is unab
19210 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c  le to load a col
19220 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a  lating sequence.
19230 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ** required for 
19240 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f  string compariso
19250 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20  n, or if unable 
19260 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
19270 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20  ry.** for a UTF 
19280 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69  conversion requi
19290 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  red for comparis
192a0 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69  on.  The error i
192b0 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  s stored.** in t
192c0 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
192d0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
192e0 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73  nt whereInScanEs
192f0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
19300 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
19310 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
19320 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
19330 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
19340 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
19350 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
19360 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  t,     /* The va
19370 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20  lue list on the 
19380 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31  RHS of "x IN (v1
19390 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a  ,v2,v3,...)" */.
193a0 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77    tRowcnt *pnRow
193b0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
193c0 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
193d0 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
193e0 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  .){.  Index *p =
193f0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
19400 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
19410 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64  .  int nRecValid
19420 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65   = pBuilder->nRe
19430 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63  cValid;.  int rc
19440 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
19450 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
19460 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
19470 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20    tRowcnt nEst; 
19480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19490 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20  ber of rows for 
194a0 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f  a single term */
194b0 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45  .  tRowcnt nRowE
194c0 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65  st = 0;    /* Ne
194d0 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  w estimate of th
194e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
194f0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19510 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
19520 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ..  assert( p->a
19530 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66  Sample!=0 );.  f
19540 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
19550 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74  TE_OK && i<pList
19560 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
19570 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61 69 52     nEst = p->aiR
19580 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 72 63  owEst[0];.    rc
19590 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
195a0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
195b0 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b  ilder, pList->a[
195c0 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29  i].pExpr, &nEst)
195d0 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d  ;.    nRowEst +=
195e0 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69 6c   nEst;.    pBuil
195f0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
19600 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a   nRecValid;.  }.
19610 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
19630 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69 52  nRowEst > p->aiR
19640 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45  owEst[0] ) nRowE
19650 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74  st = p->aiRowEst
19660 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  [0];.    *pnRow 
19670 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57  = nRowEst;.    W
19680 48 45 52 45 54 52 41 43 45 28 30 78 31 30 30 2c  HERETRACE(0x100,
19690 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74  ("IN row estimat
196a0 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52  e: est=%g\n", nR
196b0 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61  owEst));.  }.  a
196c0 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d  ssert( pBuilder-
196d0 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63  >nRecValid==nRec
196e0 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72  Valid );.  retur
196f0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
19700 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
19710 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
19720 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65  /../*.** Disable
19730 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
19740 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78  HERE clause.  Ex
19750 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73  cept, do not dis
19760 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a  able the term.**
19770 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20   if it controls 
19780 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
19790 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74  N and it did not
197a0 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68   originate in th
197b0 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47  e ON.** or USING
197c0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20   clause of that 
197d0 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  join..**.** Cons
197e0 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32  ider the term t2
197f0 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66  .z='ok' in the f
19800 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73  ollowing queries
19810 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53  :.**.**   (1)  S
19820 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
19830 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
19840 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20  t1.a=t2.x WHERE 
19850 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
19860 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2)  SELECT * FRO
19870 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
19880 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41  2 ON t1.a=t2.x A
19890 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  ND t2.z='ok'.** 
198a0 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20    (3)  SELECT * 
198b0 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52  FROM t1, t2 WHER
198c0 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  E t1.a=t2.x AND 
198d0 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20  t2.z='ok'.**.** 
198e0 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73  The t2.z='ok' is
198f0 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65   disabled in the
19900 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20   in (2) because 
19910 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a  it originates.**
19920 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
19930 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20  e.  The term is 
19940 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20  disabled in (3) 
19950 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f  because it is no
19960 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c  t part.** of a L
19970 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20  EFT OUTER JOIN. 
19980 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72   In (1), the ter
19990 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65  m is not disable
199a0 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69  d..**.** Disabli
199b0 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73  ng a term causes
199c0 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f   that term to no
199d0 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74  t be tested in t
199e0 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
199f0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44   of the join.  D
19a00 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f  isabling is an o
19a10 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68  ptimization.  Wh
19a20 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74  en terms are sat
19a30 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64  isfied.** by ind
19a40 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65  ices, we disable
19a50 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74   them to prevent
19a60 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73   redundant tests
19a70 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a   in the inner.**
19a80 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64   loop.  We would
19a90 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   get the correct
19aa0 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68   results if noth
19ab0 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69  ing were ever di
19ac0 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a  sabled,.** but j
19ad0 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61  oins might run a
19ae0 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20   little slower. 
19af0 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f   The trick is to
19b00 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68   disable as much
19b10 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69  .** as we can wi
19b20 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20  thout disabling 
19b30 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65  too much.  If we
19b40 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29   disabled in (1)
19b50 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68  , we'd get.** th
19b60 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20  e wrong answer. 
19b70 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33   See ticket #813
19b80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19b90 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65   disableTerm(Whe
19ba0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
19bb0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
19bc0 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a  m){.  if( pTerm.
19bd0 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
19be0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
19bf0 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  CODED)==0.      
19c00 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  && (pLevel->iLef
19c10 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72  tJoin==0 || Expr
19c20 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
19c30 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
19c40 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 26 26  mJoin)).      &&
19c50 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61   (pLevel->notRea
19c60 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72 65 72  dy & pTerm->prer
19c70 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20  eqAll)==0.  ){. 
19c80 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
19c90 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
19ca0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
19cb0 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20  iParent>=0 ){.  
19cc0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
19cd0 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e  Other = &pTerm->
19ce0 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50  pWC->a[pTerm->iP
19cf0 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66  arent];.      if
19d00 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68  ( (--pOther->nCh
19d10 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ild)==0 ){.     
19d20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
19d30 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a  Level, pOther);.
19d40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19d50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  }.}../*.** Code 
19d60 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  an OP_Affinity o
19d70 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20 74  pcode to apply t
19d80 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  he column affini
19d90 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a  ty string zAff.*
19da0 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69 73  * to the n regis
19db0 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  ters starting at
19dc0 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73   base. .**.** As
19dd0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
19de0 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  , SQLITE_AFF_NON
19df0 45 20 65 6e 74 72 69 65 73 20 28 77 68 69 63 68  E entries (which
19e00 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20   are no-ops) at 
19e10 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67  the.** beginning
19e20 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66 66   and end of zAff
19e30 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 49   are ignored.  I
19e40 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  f all entries in
19e50 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c   zAff are.** SQL
19e60 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68  ITE_AFF_NONE, th
19e70 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73 20  en no code gets 
19e80 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  generated..**.**
19e90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
19ea0 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  kes its own copy
19eb0 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61 74   of zAff so that
19ec0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 66   the caller is f
19ed0 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79  ree.** to modify
19ee0 20 7a 41 66 66 20 61 66 74 65 72 20 74 68 69 73   zAff after this
19ef0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
19f00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19f10 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69   codeApplyAffini
19f20 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ty(Parse *pParse
19f30 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20  , int base, int 
19f40 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a  n, char *zAff){.
19f50 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
19f60 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
19f70 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20   zAff==0 ){.    
19f80 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
19f90 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19fa0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
19fb0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76 21    }.  assert( v!
19fc0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75  =0 );..  /* Adju
19fd0 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74 6f  st base and n to
19fe0 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49 54   skip over SQLIT
19ff0 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69  E_AFF_NONE entri
1a000 65 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  es at the beginn
1a010 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64  ing.  ** and end
1a020 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74 79   of the affinity
1a030 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20   string..  */.  
1a040 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41  while( n>0 && zA
1a050 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46  ff[0]==SQLITE_AF
1a060 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d  F_NONE ){.    n-
1a070 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20  -;.    base++;. 
1a080 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20     zAff++;.  }. 
1a090 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
1a0a0 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45  Aff[n-1]==SQLITE
1a0b0 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
1a0c0 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   n--;.  }..  /* 
1a0d0 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66 69  Code the OP_Affi
1a0e0 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20 74  nity opcode if t
1a0f0 68 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67  here is anything
1a100 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a   left to do. */.
1a110 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
1a120 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a130 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74  p2(v, OP_Affinit
1a140 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20  y, base, n);.   
1a150 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1a160 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66  geP4(v, -1, zAff
1a170 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , n);.    sqlite
1a180 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1a190 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1a1a0 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d   base, n);.  }.}
1a1b0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
1a1c0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  e code for a sin
1a1d0 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  gle equality ter
1a1e0 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
1a1f0 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c  lause.  An equal
1a200 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20  ity.** term can 
1a210 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70 72  be either X=expr
1a220 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20   or X IN (...). 
1a230 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20 74    pTerm is the t
1a240 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  erm to be .** co
1a250 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ded..**.** The c
1a260 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72  urrent value for
1a270 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
1a280 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  is left in regis
1a290 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20  ter iReg..**.** 
1a2a0 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  For a constraint
1a2b0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65   of the form X=e
1a2c0 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73 73  xpr, the express
1a2d0 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64  ion is evaluated
1a2e0 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75   and its.** resu
1a2f0 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68  lt is left on th
1a300 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f  e stack.  For co
1a310 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65  nstraints of the
1a320 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29   form X IN (...)
1a330 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1a340 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20   sets up a loop 
1a350 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74  that will iterat
1a360 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65  e over all value
1a370 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69  s of X..*/.stati
1a380 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c 69  c int codeEquali
1a390 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  tyTerm(.  Parse 
1a3a0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
1a3b0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1a3c0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
1a3d0 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a  erm *pTerm,   /*
1a3e0 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65   The term of the
1a3f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
1a400 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57   be coded */.  W
1a410 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1a420 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20  l, /* The level 
1a430 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1a440 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  se we are workin
1a450 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45  g on */.  int iE
1a460 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  q,            /*
1a470 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 65 71   Index of the eq
1a480 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69 74 68  uality term with
1a490 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f  in this level */
1a4a0 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20  .  int bRev,    
1a4b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
1a4c0 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72  or reverse-order
1a4d0 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a   IN operations *
1a4e0 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74 20  /.  int iTarget 
1a4f0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d          /* Attem
1a500 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75  pt to leave resu
1a510 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67 69  lts in this regi
1a520 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ster */.){.  Exp
1a530 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
1a540 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20  Expr;.  Vdbe *v 
1a550 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1a560 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20  .  int iReg;    
1a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a580 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
1a590 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20  g results */..  
1a5a0 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e  assert( iTarget>
1a5b0 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f  0 );.  if( pX->o
1a5c0 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20  p==TK_EQ ){.    
1a5d0 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  iReg = sqlite3Ex
1a5e0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1a5f0 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
1a600 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c   iTarget);.  }el
1a610 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54  se if( pX->op==T
1a620 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  K_ISNULL ){.    
1a630 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
1a640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a650 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1a660 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e  , 0, iReg);.#ifn
1a670 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a680 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65  SUBQUERY.  }else
1a690 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b  {.    int eType;
1a6a0 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  .    int iTab;. 
1a6b0 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
1a6c0 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65 72 65   *pIn;.    Where
1a6d0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c  Loop *pLoop = pL
1a6e0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20  evel->pWLoop;.. 
1a6f0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
1a700 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
1a710 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 0a  IRTUALTABLE)==0.
1a720 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e        && pLoop->
1a730 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d  u.btree.pIndex!=
1a740 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70  0.      && pLoop
1a750 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1a760 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 45 71  ->aSortOrder[iEq
1a770 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74  ].    ){.      t
1a780 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d 30 20  estcase( iEq==0 
1a790 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a7a0 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20  e( bRev );.     
1a7b0 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20   bRev = !bRev;. 
1a7c0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1a7d0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
1a7e0 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  ;.    iReg = iTa
1a7f0 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20  rget;.    eType 
1a800 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  = sqlite3FindInI
1a810 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c  ndex(pParse, pX,
1a820 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65 54 79   0);.    if( eTy
1a830 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe==IN_INDEX_IND
1a840 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20  EX_DESC ){.     
1a850 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76 20   testcase( bRev 
1a860 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20  );.      bRev = 
1a870 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  !bRev;.    }.   
1a880 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62   iTab = pX->iTab
1a890 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  le;.    sqlite3V
1a8a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
1a8b0 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
1a8c0 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
1a8d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
1a8e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1a8f0 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29   WHERE_MULTI_OR)
1a900 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  ==0 );.    pLoop
1a910 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
1a920 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20  RE_IN_ABLE;.    
1a930 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  if( pLevel->u.in
1a940 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .nIn==0 ){.     
1a950 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
1a960 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1a970 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1a980 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
1a990 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c  in.nIn++;.    pL
1a9a0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
1a9b0 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69  op =.       sqli
1a9c0 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
1a9d0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
1a9e0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
1a9f0 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oop,.           
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa10 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c     sizeof(pLevel
1aa20 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30  ->u.in.aInLoop[0
1aa30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  ])*pLevel->u.in.
1aa40 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20  nIn);.    pIn = 
1aa50 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
1aa60 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49  Loop;.    if( pI
1aa70 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b  n ){.      pIn +
1aa80 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  = pLevel->u.in.n
1aa90 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49  In - 1;.      pI
1aaa0 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a  n->iCur = iTab;.
1aab0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
1aac0 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
1aad0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  ){.        pIn->
1aae0 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
1aaf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ab00 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c   OP_Rowid, iTab,
1ab10 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65   iReg);.      }e
1ab20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  lse{.        pIn
1ab30 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
1ab40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1ab50 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
1ab60 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20  ab, 0, iReg);.  
1ab70 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d      }.      pIn-
1ab80 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52  >eEndLoopOp = bR
1ab90 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f  ev ? OP_Prev : O
1aba0 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  P_Next;.      sq
1abb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1abc0 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52  v, OP_IsNull, iR
1abd0 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eg);.    }else{.
1abe0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e        pLevel->u.
1abf0 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20  in.nIn = 0;.    
1ac00 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64  }.#endif.  }.  d
1ac10 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1ac20 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74  l, pTerm);.  ret
1ac30 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  urn iReg;.}../*.
1ac40 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1ac50 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
1ac60 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49  ate all == and I
1ac70 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  N constraints fo
1ac80 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a  r an.** index..*
1ac90 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1aca0 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65  , consider table
1acb0 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29   t1(a,b,c,d,e,f)
1acc0 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61   with index i1(a
1acd0 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73  ,b,c)..** Suppos
1ace0 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
1acf0 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d  se is this:  a==
1ad00 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c  5 AND b IN (1,2,
1ad10 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63  3) AND c>5 AND c
1ad20 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  <10.** The index
1ad30 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20   has as many as 
1ad40 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63  three equality c
1ad50 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20  onstraints, but 
1ad60 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70  in this.** examp
1ad70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63  le, the third "c
1ad80 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  " value is an in
1ad90 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e  equality.  So on
1ada0 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74  ly two .** const
1adb0 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64  raints are coded
1adc0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1add0 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f  will generate co
1ade0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a  de to evaluate.*
1adf0 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20  * a==5 and b IN 
1ae00 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75  (1,2,3).  The cu
1ae10 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72  rrent values for
1ae20 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65   a and b will be
1ae30 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f   stored.** in co
1ae40 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
1ae50 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ers and the inde
1ae60 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  x of the first r
1ae70 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72  egister is retur
1ae80 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ned..**.** In th
1ae90 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20  e example above 
1aea0 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69  nEq==2.  But thi
1aeb0 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72  s subroutine wor
1aec0 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65  ks for any value
1aed0 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75  .** of nEq inclu
1aee0 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d  ding 0.  If nEq=
1aef0 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  =0, this routine
1af00 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d   is nearly a no-
1af10 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  op..** The only 
1af20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73  thing it does is
1af30 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c   allocate the pL
1af40 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72  evel->iMem memor
1af50 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f  y cell and.** co
1af60 6d 70 75 74 65 20 74 68 65 20 61 66 66 69 6e 69  mpute the affini
1af70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ty string..**.**
1af80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
1af90 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61  ways allocates a
1afa0 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f  t least one memo
1afb0 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 74 75  ry cell and retu
1afc0 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rns.** the index
1afd0 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20   of that memory 
1afe0 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20 74  cell. The code t
1aff0 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69  hat.** calls thi
1b000 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75  s routine will u
1b010 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  se that memory c
1b020 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ell to store the
1b030 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20   termination.** 
1b040 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  key value of the
1b050 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f   loop.  If one o
1b060 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74  r more IN operat
1b070 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e  ors appear, then
1b080 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1b090 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64   allocates an ad
1b0a0 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d  ditional nEq mem
1b0b0 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e  ory cells for in
1b0c0 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a  ternal.** use..*
1b0d0 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
1b0e0 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73  rning, *pzAff is
1b0f0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1b100 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
1b110 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f  ning a.** copy o
1b120 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  f the column aff
1b130 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20  inity string of 
1b140 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61  the index alloca
1b150 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ted using.** sql
1b160 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20  ite3DbMalloc(). 
1b170 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20  Except, entries 
1b180 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  in the copy of t
1b190 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69  he string associ
1b1a0 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75  ated.** with equ
1b1b0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1b1c0 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e 45 20  s that use NONE 
1b1d0 61 66 66 69 6e 69 74 79 20 61 72 65 20 73 65 74  affinity are set
1b1e0 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46   to.** SQLITE_AF
1b1f0 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73 20  F_NONE. This is 
1b200 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c  to deal with SQL
1b210 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c   such as the fol
1b220 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
1b230 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1b240 61 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b  a TEXT PRIMARY K
1b250 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c  EY, b);.**   SEL
1b260 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
1b270 41 53 20 74 32 2c 20 74 31 20 57 48 45 52 45 20  AS t2, t1 WHERE 
1b280 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a  t1.a = t2.b;.**.
1b290 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
1b2a0 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64  e above, the ind
1b2b0 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20  ex on t1(a) has 
1b2c0 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42  TEXT affinity. B
1b2d0 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20  ut since.** the 
1b2e0 72 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20  right hand side 
1b2f0 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  of the equality 
1b300 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62  constraint (t2.b
1b310 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e  ) has NONE affin
1b320 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65  ity,.** no conve
1b330 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  rsion should be 
1b340 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65  attempted before
1b350 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61   using a t2.b va
1b360 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a  lue as part of.*
1b370 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63  * a key to searc
1b380 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e  h the index. Hen
1b390 63 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ce the first byt
1b3a0 65 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  e in the returne
1b3b0 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74  d affinity.** st
1b3c0 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61  ring in this exa
1b3d0 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65  mple would be se
1b3e0 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f  t to SQLITE_AFF_
1b3f0 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NONE..*/.static 
1b400 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  int codeAllEqual
1b410 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73  ityTerms(.  Pars
1b420 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1b430 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1b440 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
1b450 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20  evel *pLevel,   
1b460 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20  /* Which nested 
1b470 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d  loop of the FROM
1b480 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a   we are coding *
1b490 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20  /.  int bRev,   
1b4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76            /* Rev
1b4b0 65 72 73 65 20 74 68 65 20 6f 72 64 65 72 20 6f  erse the order o
1b4c0 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a  f IN operators *
1b4d0 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65  /.  int nExtraRe
1b4e0 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  g,        /* Num
1b4f0 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67  ber of extra reg
1b500 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
1b510 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  te */.  char **p
1b520 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a  zAff          /*
1b530 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69   OUT: Set to poi
1b540 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73  nt to affinity s
1b550 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
1b560 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  t nEq;          
1b570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b580 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  he number of == 
1b590 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
1b5a0 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56  s to code */.  V
1b5b0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1b5c0 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
1b5d0 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e  The vm under con
1b5e0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  struction */.  I
1b5f0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b610 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20  The index being 
1b620 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f  used for this lo
1b630 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  op */.  WhereTer
1b640 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
1b650 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
1b660 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  e constraint ter
1b670 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  m */.  WhereLoop
1b680 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
1b690 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
1b6a0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
1b6b0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
1b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6d0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1b6e0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
1b6f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b700 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73     /* Base regis
1b710 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ter */.  int nRe
1b720 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
1b730 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b740 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
1b750 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63   allocate */.  c
1b760 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20  har *zAff;      
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b780 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  Affinity string 
1b790 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20  to return */..  
1b7a0 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69  /* This module i
1b7b0 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e  s only called on
1b7c0 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61   query plans tha
1b7d0 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20  t use an index. 
1b7e0 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  */.  pLoop = pLe
1b7f0 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61  vel->pWLoop;.  a
1b800 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
1b810 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
1b820 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
1b830 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70  );.  nEq = pLoop
1b840 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
1b850 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
1b860 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
1b870 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
1b880 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   );..  /* Figure
1b890 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65   out how many me
1b8a0 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69  mory cells we wi
1b8b0 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c  ll need then all
1b8c0 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f  ocate them..  */
1b8d0 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61  .  regBase = pPa
1b8e0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
1b8f0 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75   nReg = pLoop->u
1b900 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78  .btree.nEq + nEx
1b910 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65  traReg;.  pParse
1b920 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
1b930 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65  .  zAff = sqlite
1b940 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65  3DbStrDup(pParse
1b950 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64  ->db, sqlite3Ind
1b960 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c  exAffinityStr(v,
1b970 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21   pIdx));.  if( !
1b980 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72  zAff ){.    pPar
1b990 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1b9a0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  iled = 1;.  }.. 
1b9b0 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
1b9c0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
1b9d0 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  aints.  */.  ass
1b9e0 65 72 74 28 20 7a 41 66 66 3d 3d 30 20 7c 7c 20  ert( zAff==0 || 
1b9f0 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 66 66  (int)strlen(zAff
1ba00 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28  )>=nEq );.  for(
1ba10 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29  j=0; j<nEq; j++)
1ba20 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20  {.    int r1;.  
1ba30 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
1ba40 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20  >aLTerm[j];.    
1ba50 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
1ba60 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   );.    /* The f
1ba70 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20 66 6f  ollowing true fo
1ba80 72 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 72  r indices with r
1ba90 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73  edundant columns
1baa0 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52  . .    ** Ex: CR
1bab0 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
1bac0 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45   t1(a,b,a); SELE
1bad0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
1bae0 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20  RE a=0 AND b=0; 
1baf0 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  */.    testcase(
1bb00 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
1bb10 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d   & TERM_CODED)!=
1bb20 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1bb30 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
1bb40 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
1bb50 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f 64   );.    r1 = cod
1bb60 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
1bb70 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
1bb80 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65  vel, j, bRev, re
1bb90 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66  gBase+j);.    if
1bba0 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20  ( r1!=regBase+j 
1bbb0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65  ){.      if( nRe
1bbc0 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  g==1 ){.        
1bbd0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1bbe0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1bbf0 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  gBase);.        
1bc00 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20  regBase = r1;.  
1bc10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bc20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bc30 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
1bc40 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29  , r1, regBase+j)
1bc50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1bc60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1bc70 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1bc80 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
1bc90 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1bca0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1bcb0 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  O_IN );.    if( 
1bcc0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
1bcd0 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  r & (WO_ISNULL|W
1bce0 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20  O_IN))==0 ){.   
1bcf0 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
1bd00 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
1bd10 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
1bd20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
1bd30 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
1bd40 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c  t, regBase+j, pL
1bd50 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
1bd60 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 29        if( zAff )
1bd70 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
1bd80 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
1bd90 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66  nity(pRight, zAf
1bda0 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  f[j])==SQLITE_AF
1bdb0 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  F_NONE ){.      
1bdc0 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
1bdd0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1bde0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bdf0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1be00 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
1be10 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41  hange(pRight, zA
1be20 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ff[j]) ){.      
1be30 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
1be40 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1be50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1be60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
1be70 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65  Aff = zAff;.  re
1be80 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a  turn regBase;.}.
1be90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bea0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
1beb0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1bec0 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20  is a helper for 
1bed0 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
1bee0 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20  e() below.**.** 
1bef0 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74  pStr holds the t
1bf00 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ext of an expres
1bf10 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65  sion that we are
1bf20 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65   building up one
1bf30 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69   term.** at a ti
1bf40 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  me.  This routin
1bf50 65 20 61 64 64 73 20 61 20 6e 65 77 20 74 65 72  e adds a new ter
1bf60 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  m to the end of 
1bf70 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
1bf80 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65 70  ** Terms are sep
1bf90 61 72 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f  arated by AND so
1bfa0 20 61 64 64 20 74 68 65 20 22 41 4e 44 22 20 74   add the "AND" t
1bfb0 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61  ext for second a
1bfc0 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  nd subsequent.**
1bfd0 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a   terms only..*/.
1bfe0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
1bff0 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20  ainAppendTerm(. 
1c000 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c   StrAccum *pStr,
1c010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c020 54 68 65 20 74 65 78 74 20 65 78 70 72 65 73 73  The text express
1c030 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20  ion being built 
1c040 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20  */.  int iTerm, 
1c050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c060 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69   /* Index of thi
1c070 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69  s term.  First i
1c080 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73  s zero */.  cons
1c090 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c  t char *zColumn,
1c0a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1c0b0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  of the column */
1c0c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1c0d0 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  Op             /
1c0e0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
1c0f0 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69  erator */.){.  i
1c100 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74  f( iTerm ) sqlit
1c110 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1c120 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20  (pStr, " AND ", 
1c130 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  5);.  sqlite3Str
1c140 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
1c150 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a  , zColumn, -1);.
1c160 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1c170 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f  mAppend(pStr, zO
1c180 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  p, 1);.  sqlite3
1c190 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
1c1a0 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a  Str, "?", 1);.}.
1c1b0 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
1c1c0 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65 73  pLevel describes
1c1d0 20 61 20 73 74 72 61 74 65 67 79 20 66 6f 72 20   a strategy for 
1c1e0 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70  scanning table p
1c1f0 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  Tab. This .** fu
1c200 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
1c210 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
1c220 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f 6e 74  ring buffer cont
1c230 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72 69 70  aining a descrip
1c240 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73  tion.** of the s
1c250 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65 20 72  ubset of table r
1c260 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74  ows scanned by t
1c270 68 65 20 73 74 72 61 74 65 67 79 20 69 6e 20 74  he strategy in t
1c280 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a  he form of an.**
1c290 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e   SQL expression.
1c2a0 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73   Or, if all rows
1c2b0 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55   are scanned, NU
1c2c0 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
1c2d0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1c2e0 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 3a  e, if the query:
1c2f0 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
1c300 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
1c310 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a  a=1 AND b>2;.**.
1c320 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68  ** is run and th
1c330 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ere is an index 
1c340 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20  on (a, b), then 
1c350 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1c360 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e  turns a.** strin
1c370 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  g similar to:.**
1c380 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62  .**   "a=? AND b
1c390 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  >?".**.** The re
1c3a0 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 70  turned pointer p
1c3b0 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20  oints to memory 
1c3c0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
1c3d0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e  lite3DbMalloc().
1c3e0 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
1c3f0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
1c400 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72  the caller to fr
1c410 65 65 20 74 68 65 20 62 75 66 66 65 72 20 77 68  ee the buffer wh
1c420 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c  en it is.** no l
1c430 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a  onger required..
1c440 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1c450 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
1c460 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
1c470 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c  hereLoop *pLoop,
1c480 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
1c490 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
1c4a0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1c4b0 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45  pIndex;.  int nE
1c4c0 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
1c4d0 65 65 2e 6e 45 71 3b 0a 20 20 69 6e 74 20 69 2c  ee.nEq;.  int i,
1c4e0 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43   j;.  Column *aC
1c4f0 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b  ol = pTab->aCol;
1c500 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d 6e  .  int *aiColumn
1c510 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c   = pIndex->aiCol
1c520 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  umn;.  StrAccum 
1c530 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d  txt;..  if( nEq=
1c540 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73  =0 && (pLoop->ws
1c550 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42  Flags & (WHERE_B
1c560 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
1c570 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b  OP_LIMIT))==0 ){
1c580 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1c590 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41   }.  sqlite3StrA
1c5a0 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c 20 30  ccumInit(&txt, 0
1c5b0 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  , 0, SQLITE_MAX_
1c5c0 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e 64  LENGTH);.  txt.d
1c5d0 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74 65  b = db;.  sqlite
1c5e0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
1c5f0 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a  &txt, " (", 2);.
1c600 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71    for(i=0; i<nEq
1c610 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
1c620 20 2a 7a 20 3d 20 28 69 3d 3d 70 49 6e 64 65 78   *z = (i==pIndex
1c630 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72  ->nColumn ) ? "r
1c640 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43  owid" : aCol[aiC
1c650 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b  olumn[i]].zName;
1c660 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65  .    explainAppe
1c670 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20  ndTerm(&txt, i, 
1c680 7a 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20  z, "=");.  }..  
1c690 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f  j = i;.  if( pLo
1c6a0 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  op->wsFlags&WHER
1c6b0 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
1c6c0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d     char *z = (j=
1c6d0 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  =pIndex->nColumn
1c6e0 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61   ) ? "rowid" : a
1c6f0 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  Col[aiColumn[j]]
1c700 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c  .zName;.    expl
1c710 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74  ainAppendTerm(&t
1c720 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29  xt, i++, z, ">")
1c730 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  ;.  }.  if( pLoo
1c740 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45  p->wsFlags&WHERE
1c750 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _TOP_LIMIT ){.  
1c760 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d    char *z = (j==
1c770 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
1c780 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43  ) ? "rowid" : aC
1c790 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  ol[aiColumn[j]].
1c7a0 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61  zName;.    expla
1c7b0 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78  inAppendTerm(&tx
1c7c0 74 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20  t, i, z, "<");. 
1c7d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41   }.  sqlite3StrA
1c7e0 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c  ccumAppend(&txt,
1c7f0 20 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75   ")", 1);.  retu
1c800 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  rn sqlite3StrAcc
1c810 75 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a  umFinish(&txt);.
1c820 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1c830 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1c840 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74  p unless current
1c850 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  ly processing an
1c860 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
1c870 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20  LAN.** command. 
1c880 49 66 20 74 68 65 20 71 75 65 72 79 20 62 65 69  If the query bei
1c890 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61  ng compiled is a
1c8a0 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
1c8b0 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a  PLAN, a single.*
1c8c0 2a 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65  * record is adde
1c8d0 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
1c8e0 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
1c8f0 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74  table scan strat
1c900 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65  egy in .** pLeve
1c910 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
1c920 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e  d explainOneScan
1c930 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1c940 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1c950 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
1c960 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
1c970 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
1c980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1c990 6c 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f  le list this loo
1c9a0 70 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20  p refers to */. 
1c9b0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1c9c0 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
1c9d0 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74   /* Scan to writ
1c9e0 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63  e OP_Explain opc
1c9f0 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ode for */.  int
1ca00 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ca20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c  Value for "level
1ca30 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70  " column of outp
1ca40 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  ut */.  int iFro
1ca50 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
1ca60 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1ca70 20 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75   for "from" colu
1ca80 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a  mn of output */.
1ca90 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cab0 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
1cac0 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
1cad0 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20  eBegin() */.){. 
1cae0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
1caf0 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 73  lain==2 ){.    s
1cb00 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1cb10 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
1cb20 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
1cb30 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62  >iFrom];.    Vdb
1cb40 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1cb50 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d  Vdbe;      /* VM
1cb60 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
1cb70 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
1cb80 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1cb90 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62  db;     /* Datab
1cba0 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
1cbb0 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20    char *zMsg;   
1cbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbd0 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 74  /* Text to add t
1cbe0 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a  o EQP output */.
1cbf0 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50      int iId = pP
1cc00 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b  arse->iSelectId;
1cc10 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28    /* Select id (
1cc20 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74  left-most output
1cc30 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20   column) */.    
1cc40 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20 20  int isSearch;   
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cc60 20 54 72 75 65 20 66 6f 72 20 61 20 53 45 41 52   True for a SEAR
1cc70 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43  CH. False for SC
1cc80 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  AN. */.    Where
1cc90 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
1cca0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ccb0 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72  controlling Wher
1ccc0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
1ccd0 20 20 20 20 75 33 32 20 66 6c 61 67 73 3b 20 20      u32 flags;  
1cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccf0 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20    /* Flags that 
1cd00 64 65 73 63 72 69 62 65 20 74 68 69 73 20 6c 6f  describe this lo
1cd10 6f 70 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70  op */..    pLoop
1cd20 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
1cd30 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70  p;.    flags = p
1cd40 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
1cd50 20 20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48     if( (flags&WH
1cd60 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c  ERE_MULTI_OR) ||
1cd70 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
1cd80 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
1cd90 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  ) ) return;..   
1cda0 20 69 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61   isSearch = (fla
1cdb0 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49  gs&(WHERE_BTM_LI
1cdc0 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  MIT|WHERE_TOP_LI
1cdd0 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20  MIT))!=0.       
1cde0 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26       || ((flags&
1cdf0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1ce00 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70  LE)==0 && (pLoop
1ce10 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29  ->u.btree.nEq>0)
1ce20 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ).            ||
1ce30 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48   (wctrlFlags&(WH
1ce40 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c  ERE_ORDERBY_MIN|
1ce50 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
1ce60 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d  X));..    zMsg =
1ce70 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1ce80 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72  db, "%s", isSear
1ce90 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41  ch?"SEARCH":"SCA
1cea0 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  N");.    if( pIt
1ceb0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
1cec0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1ced0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1cee0 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51 55 45  zMsg, "%s SUBQUE
1cef0 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74  RY %d", zMsg,pIt
1cf00 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a  em->iSelectId);.
1cf10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cf20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1cf30 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1cf40 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c  , "%s TABLE %s",
1cf50 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e   zMsg, pItem->zN
1cf60 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ame);.    }..   
1cf70 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
1cf80 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  as ){.      zMsg
1cf90 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1cfa0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1cfb0 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70   AS %s", zMsg, p
1cfc0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
1cfd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
1cfe0 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b  ags & (WHERE_IPK
1cff0 7c 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41  |WHERE_VIRTUALTA
1d000 42 4c 45 29 29 3d 3d 30 0a 20 20 20 20 20 26 26  BLE))==0.     &&
1d010 20 41 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 75   ALWAYS(pLoop->u
1d020 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30  .btree.pIndex!=0
1d030 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63  ).    ){.      c
1d040 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78  har *zWhere = ex
1d050 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28  plainIndexRange(
1d060 64 62 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d  db, pLoop, pItem
1d070 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a  ->pTab);.      z
1d080 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1d090 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 0a  pendf(db, zMsg,.
1d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1d0b0 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  (flags & WHERE_A
1d0c0 55 54 4f 5f 49 4e 44 45 58 29 20 3f 20 0a 20 20  UTO_INDEX) ? .  
1d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0e0 20 22 25 73 20 55 53 49 4e 47 20 41 55 54 4f 4d   "%s USING AUTOM
1d0f0 41 54 49 43 20 25 73 49 4e 44 45 58 25 2e 30 73  ATIC %sINDEX%.0s
1d100 25 73 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20  %s" :.          
1d110 20 20 20 20 20 20 20 20 20 22 25 73 20 55 53 49           "%s USI
1d120 4e 47 20 25 73 49 4e 44 45 58 20 25 73 25 73 22  NG %sINDEX %s%s"
1d130 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ), .            
1d140 20 20 20 7a 4d 73 67 2c 20 28 28 66 6c 61 67 73     zMsg, ((flags
1d150 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
1d160 59 29 20 3f 20 22 43 4f 56 45 52 49 4e 47 20 22  Y) ? "COVERING "
1d170 20 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 20 20   : ""),.        
1d180 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e         pLoop->u.
1d190 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
1d1a0 61 6d 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  ame, zWhere);.  
1d1b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1d1c0 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20  e(db, zWhere);. 
1d1d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
1d1e0 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29  ags & WHERE_IPK)
1d1f0 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26 20  !=0 && (flags & 
1d200 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54  WHERE_CONSTRAINT
1d210 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d  )!=0 ){.      zM
1d220 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1d230 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1d240 25 73 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52  %s USING INTEGER
1d250 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a   PRIMARY KEY", z
1d260 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  Msg);..      if(
1d270 20 66 6c 61 67 73 26 28 57 48 45 52 45 5f 43 4f   flags&(WHERE_CO
1d280 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f  LUMN_EQ|WHERE_CO
1d290 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20  LUMN_IN) ){.    
1d2a0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1d2b0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1d2c0 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d  Msg, "%s (rowid=
1d2d0 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
1d2e0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
1d2f0 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49  gs&WHERE_BOTH_LI
1d300 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48  MIT)==WHERE_BOTH
1d310 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
1d320 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1d330 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1d340 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20  g, "%s (rowid>? 
1d350 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a  AND rowid<?)", z
1d360 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
1d370 65 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52  e if( flags&WHER
1d380 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
1d390 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
1d3a0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1d3b0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
1d3c0 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id>?)", zMsg);. 
1d3d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
1d3e0 4c 57 41 59 53 28 66 6c 61 67 73 26 57 48 45 52  LWAYS(flags&WHER
1d3f0 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a  E_TOP_LIMIT) ){.
1d400 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
1d410 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1d420 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f  b, zMsg, "%s (ro
1d430 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid<?)", zMsg);.
1d440 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
1d450 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d460 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1d470 20 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61     else if( (fla
1d480 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
1d490 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
1d4a0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1d4b0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1d4c0 7a 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55 41  zMsg, "%s VIRTUA
1d4d0 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64  L TABLE INDEX %d
1d4e0 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20  :%s", zMsg,.    
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
1d500 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  oop->u.vtab.idxN
1d510 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  um, pLoop->u.vta
1d520 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d  b.idxStr);.    }
1d530 0a 23 65 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67  .#endif.    zMsg
1d540 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1d550 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1d560 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71  ", zMsg);.    sq
1d570 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1d580 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69  v, OP_Explain, i
1d590 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f  Id, iLevel, iFro
1d5a0 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  m, zMsg, P4_DYNA
1d5b0 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  MIC);.  }.}.#els
1d5c0 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  e.# define expla
1d5d0 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c  inOneScan(u,v,w,
1d5e0 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a  x,y,z).#endif /*
1d5f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
1d600 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  LAIN */.../*.** 
1d610 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1d620 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  r the start of t
1d630 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f  he iLevel-th loo
1d640 70 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  p in the WHERE c
1d650 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  lause.** impleme
1d660 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ntation describe
1d670 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a  d by pWInfo..*/.
1d680 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63  static Bitmask c
1d690 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
1d6a0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
1d6b0 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c  Info,   /* Compl
1d6c0 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ete information 
1d6d0 61 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20  about the WHERE 
1d6e0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
1d6f0 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
1d700 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20   /* Which level 
1d710 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73  of pWInfo->a[] s
1d720 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a  hould be coded *
1d730 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
1d740 65 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63  eady     /* Whic
1d750 68 20 74 61 62 6c 65 73 20 61 72 65 20 63 75 72  h tables are cur
1d760 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
1d770 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20   */.){.  int j, 
1d780 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
1d790 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
1d7a0 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  /.  int iCur;   
1d7b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d7c0 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
1d7d0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
1d7e0 6e 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20  nt addrNxt;     
1d7f0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
1d800 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65  jump to continue
1d810 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49   with the next I
1d820 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  N case */.  int 
1d830 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20  omitTable;      
1d840 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75   /* True if we u
1d850 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c  se the index onl
1d860 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b  y */.  int bRev;
1d870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d880 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  rue if we need t
1d890 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73  o scan in revers
1d8a0 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65  e order */.  Whe
1d8b0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
1d8c0 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c    /* The where l
1d8d0 65 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64  evel to be coded
1d8e0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
1d8f0 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68  *pLoop;    /* Th
1d900 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
1d910 63 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  ct being coded *
1d920 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
1d930 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f  *pWC;    /* Deco
1d940 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65  mposition of the
1d950 20 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c   entire WHERE cl
1d960 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  ause */.  WhereT
1d970 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
1d980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
1d990 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
1d9a0 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
1d9b0 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
1d9c0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1d9d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
1d9e0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1da00 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
1da10 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
1da20 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1da30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1da40 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75   prepared stmt u
1da50 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1da60 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ns */.  struct S
1da70 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
1da80 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20  bItem;  /* FROM 
1da90 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e  clause term bein
1daa0 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
1dab0 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20   addrBrk;       
1dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dad0 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
1dae0 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  ak out of the lo
1daf0 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
1db00 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  Cont;           
1db10 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
1db20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
1db30 20 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65   with next cycle
1db40 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64   */.  int iRowid
1db50 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
1db60 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72  /* Rowid is stor
1db70 65 64 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ed in this regis
1db80 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f  ter, if not zero
1db90 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61   */.  int iRelea
1dba0 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  seReg = 0;      
1dbb0 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72  /* Temp register
1dbc0 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20   to free before 
1dbd0 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20  returning */..  
1dbe0 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
1dbf0 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70  >pParse;.  v = p
1dc00 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1dc10 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
1dc20 57 43 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  WC;.  db = pPars
1dc30 65 2d 3e 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20  e->db;.  pLevel 
1dc40 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65  = &pWInfo->a[iLe
1dc50 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  vel];.  pLoop = 
1dc60 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1dc70 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57    pTabItem = &pW
1dc80 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1dc90 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
1dca0 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62 49  ;.  iCur = pTabI
1dcb0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
1dcc0 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
1dcd0 20 3d 20 6e 6f 74 52 65 61 64 79 20 26 20 7e 67   = notReady & ~g
1dce0 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
1dcf0 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  sMaskSet, iCur);
1dd00 0a 20 20 62 52 65 76 20 3d 20 28 70 57 49 6e 66  .  bRev = (pWInf
1dd10 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76  o->revMask>>iLev
1dd20 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62  el)&1;.  omitTab
1dd30 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  le = (pLoop->wsF
1dd40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
1dd50 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20  _ONLY)!=0 .     
1dd60 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
1dd70 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
1dd80 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
1dd90 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  )==0;.  VdbeNoop
1dda0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
1ddb0 69 6e 20 4a 6f 69 6e 20 4c 6f 6f 70 20 25 64 22  in Join Loop %d"
1ddc0 2c 20 69 4c 65 76 65 6c 29 29 3b 0a 0a 20 20 2f  , iLevel));..  /
1ddd0 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20  * Create labels 
1dde0 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20  for the "break" 
1ddf0 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69  and "continue" i
1de00 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a  nstructions.  **
1de10 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
1de20 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20   loop.  Jump to 
1de30 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b  addrBrk to break
1de40 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a   out of a loop..
1de50 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e    ** Jump to con
1de60 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74  t to go immediat
1de70 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ely to the next 
1de80 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
1de90 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  .  ** loop..  **
1dea0 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65  .  ** When there
1deb0 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
1dec0 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65  or, we also have
1ded0 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62   a "addrNxt" lab
1dee0 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61  el that.  ** mea
1def0 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  ns to continue w
1df00 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
1df10 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f  value combinatio
1df20 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68  n.  When.  ** th
1df30 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70  ere are no IN op
1df40 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63  erators in the c
1df50 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20  onstraints, the 
1df60 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a  "addrNxt" label.
1df70 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
1df80 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20   as "addrBrk".. 
1df90 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20   */.  addrBrk = 
1dfa0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20  pLevel->addrBrk 
1dfb0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1dfc0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
1dfd0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61  akeLabel(v);.  a
1dfe0 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c  ddrCont = pLevel
1dff0 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c  ->addrCont = sql
1e000 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1e010 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  l(v);..  /* If t
1e020 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74  his is the right
1e030 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
1e040 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c   OUTER JOIN, all
1e050 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69  ocate and.  ** i
1e060 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f  nitialize a memo
1e070 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63  ry cell that rec
1e080 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61 62  ords if this tab
1e090 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20  le matches any. 
1e0a0 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c   ** row of the l
1e0b0 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  eft table of the
1e0c0 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   join..  */.  if
1e0d0 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e  ( pLevel->iFrom>
1e0e0 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30  0 && (pTabItem[0
1e0f0 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
1e100 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  LEFT)!=0 ){.    
1e110 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
1e120 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
1e130 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
1e140 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e150 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76  Integer, 0, pLev
1e160 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
1e170 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1e180 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a  (v, "init LEFT J
1e190 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61  OIN no-match fla
1e1a0 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  g"));.  }..  /* 
1e1b0 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20  Special case of 
1e1c0 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 73 75  a FROM clause su
1e1d0 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74  bquery implement
1e1e0 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
1e1f0 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  ne */.  if( pTab
1e200 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
1e210 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  ne ){.    int re
1e220 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65  gYield = pTabIte
1e230 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20  m->regReturn;.  
1e240 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e250 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1e260 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64  r, pTabItem->add
1e270 72 46 69 6c 6c 53 75 62 2d 31 2c 20 72 65 67 59  rFillSub-1, regY
1e280 69 65 6c 64 29 3b 0a 20 20 20 20 70 4c 65 76 65  ield);.    pLeve
1e290 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33  l->p2 =  sqlite3
1e2a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
1e2b0 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64  _Yield, regYield
1e2c0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
1e2d0 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77  nt((v, "next row
1e2e0 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65 20 25   of co-routine %
1e2f0 73 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  s", pTabItem->pT
1e300 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
1e310 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e320 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
1e330 59 69 65 6c 64 2b 31 2c 20 61 64 64 72 42 72 6b  Yield+1, addrBrk
1e340 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
1e350 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d  p = OP_Goto;.  }
1e360 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
1e370 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1e380 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70  LTABLE.  if(  (p
1e390 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1e3a0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1e3b0 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  LE)!=0 ){.    /*
1e3c0 20 43 61 73 65 20 31 3a 20 20 54 68 65 20 74 61   Case 1:  The ta
1e3d0 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c  ble is a virtual
1e3e0 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65  -table.  Use the
1e3f0 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65   VFilter and VNe
1e400 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  xt.    **       
1e410 20 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65     to access the
1e420 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
1e430 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a    int iReg;   /*
1e440 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50   P3 Value for OP
1e450 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20  _VFilter */.    
1e460 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64  int addrNotFound
1e470 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  ;.    int nConst
1e480 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  raint = pLoop->n
1e490 4c 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69  LTerm;..    sqli
1e4a0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1e4b0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52  (pParse);.    iR
1e4c0 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
1e4d0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1e4e0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
1e4f0 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e  .    addrNotFoun
1e500 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  d = pLevel->addr
1e510 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  Brk;.    for(j=0
1e520 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; j<nConstraint;
1e530 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   j++){.      int
1e540 20 69 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b   iTarget = iReg+
1e550 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  j+2;.      pTerm
1e560 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1e570 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [j];.      if( p
1e580 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Term==0 ) contin
1e590 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ue;.      if( pT
1e5a0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1e5b0 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
1e5c0 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65    codeEqualityTe
1e5d0 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
1e5e0 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65  , pLevel, j, bRe
1e5f0 76 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20  v, iTarget);.   
1e600 20 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e       addrNotFoun
1e610 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  d = pLevel->addr
1e620 4e 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Nxt;.      }else
1e630 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e640 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1e650 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  , pTerm->pExpr->
1e660 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29  pRight, iTarget)
1e670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e680 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e690 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1e6a0 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74  ger, pLoop->u.vt
1e6b0 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29  ab.idxNum, iReg)
1e6c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1e6d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1e6e0 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69  teger, nConstrai
1e6f0 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20  nt, iReg+1);.   
1e700 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e710 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72  p4(v, OP_VFilter
1e720 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46  , iCur, addrNotF
1e730 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20  ound, iReg,.    
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e750 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
1e760 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20  idxStr,.        
1e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
1e780 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  oop->u.vtab.need
1e790 46 72 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54  Free ? P4_MPRINT
1e7a0 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  F : P4_STATIC);.
1e7b0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
1e7c0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
1e7d0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
1e7e0 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c  Constraint && j<
1e7f0 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  16; j++){.      
1e800 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74  if( (pLoop->u.vt
1e810 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26  ab.omitMask>>j)&
1e820 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  1 ){.        dis
1e830 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
1e840 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1e850 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
1e860 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  }.    pLevel->op
1e870 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20   = OP_VNext;.   
1e880 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
1e890 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
1e8a0 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
1e8b0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1e8c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1e8d0 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
1e8e0 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74  se, iReg, nConst
1e8f0 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71  raint+2);.    sq
1e900 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1e910 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
1e920 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
1e930 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1e940 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69  UALTABLE */..  i
1e950 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1e960 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
1e970 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d  =0.   && (pLoop-
1e980 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
1e990 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
1e9a0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30  E_COLUMN_EQ))!=0
1e9b0 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  .  ){.    /* Cas
1e9c0 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72  e 2:  We can dir
1e9d0 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20  ectly reference 
1e9e0 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69  a single row usi
1e9f0 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ng an.    **    
1ea00 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63        equality c
1ea10 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
1ea20 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
1ea30 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20  d.  Or.    **   
1ea40 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65         we refere
1ea50 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  nce multiple row
1ea60 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64  s using a "rowid
1ea70 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a   IN (...)".    *
1ea80 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  *          const
1ea90 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ruct..    */.   
1eaa0 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
1eab0 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29  u.btree.nEq==1 )
1eac0 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65  ;.    iReleaseRe
1ead0 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1eae0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1eaf0 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
1eb00 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20  ->aLTerm[0];.   
1eb10 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
1eb20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1eb30 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30   pTerm->pExpr!=0
1eb40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1eb50 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
1eb60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1eb70 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1eb80 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
1eb90 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63     iRowidReg = c
1eba0 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1ebb0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
1ebc0 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20  Level, 0, bRev, 
1ebd0 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20  iReleaseReg);.  
1ebe0 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76    addrNxt = pLev
1ebf0 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20  el->addrNxt;.   
1ec00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ec10 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
1ec20 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61  nt, iRowidReg, a
1ec30 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c  ddrNxt);.    sql
1ec40 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1ec50 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
1ec60 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69  iCur, addrNxt, i
1ec70 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 73  RowidReg);.    s
1ec80 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1ec90 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
1eca0 61 72 73 65 2c 20 69 52 6f 77 69 64 52 65 67 2c  arse, iRowidReg,
1ecb0 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
1ecc0 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
1ecd0 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
1ece0 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1ecf0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1ed00 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65   "pk"));.    pLe
1ed10 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
1ed20 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  p;.  }else if( (
1ed30 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1ed40 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20   WHERE_IPK)!=0. 
1ed50 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f          && (pLoo
1ed60 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1ed70 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29  RE_COLUMN_RANGE)
1ed80 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
1ed90 43 61 73 65 20 33 3a 20 20 57 65 20 68 61 76 65  Case 3:  We have
1eda0 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
1edb0 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
1edc0 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
1edd0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
1ede0 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f  t testOp = OP_No
1edf0 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  op;.    int star
1ee00 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e  t;.    int memEn
1ee10 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  dValue = 0;.    
1ee20 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72  WhereTerm *pStar
1ee30 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61  t, *pEnd;..    a
1ee40 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
1ee50 3d 3d 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30  ==0 );.    j = 0
1ee60 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  ;.    pStart = p
1ee70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  End = 0;.    if(
1ee80 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1ee90 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
1eea0 54 20 29 20 70 53 74 61 72 74 20 3d 20 70 4c 6f  T ) pStart = pLo
1eeb0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1eec0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1eed0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1eee0 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64  TOP_LIMIT ) pEnd
1eef0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1ef00 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72  [j++];.    asser
1ef10 74 28 20 70 53 74 61 72 74 21 3d 30 20 7c 7c 20  t( pStart!=0 || 
1ef20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 69  pEnd!=0 );.    i
1ef30 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
1ef40 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b   pTerm = pStart;
1ef50 0a 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20  .      pStart = 
1ef60 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64  pEnd;.      pEnd
1ef70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   = pTerm;.    }.
1ef80 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
1ef90 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
1efa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1efb0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1efc0 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
1efd0 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a   start bound */.
1efe0 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54        int r1, rT
1eff0 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  emp;        /* R
1f000 65 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c  egisters for hol
1f010 64 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62  ding the start b
1f020 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20  oundary */..    
1f030 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1f040 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73  ng constant maps
1f050 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74   TK_xx codes int
1f060 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  o corresponding 
1f070 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f  .      ** seek o
1f080 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65  pcodes.  It depe
1f090 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75  nds on a particu
1f0a0 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20  lar ordering of 
1f0b0 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20  TK_xx.      */. 
1f0c0 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d       const u8 aM
1f0d0 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  oveOp[] = {.    
1f0e0 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20         /* TK_GT 
1f0f0 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20  */  OP_SeekGt,. 
1f100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1f110 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65  LE */  OP_SeekLe
1f120 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
1f130 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_LT */  OP_See
1f140 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kLt,.           
1f150 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f  /* TK_GE */  OP_
1f160 53 65 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a  SeekGe.      };.
1f170 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f180 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20  _LE==TK_GT+1 ); 
1f190 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
1f1a0 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e  e the ordering..
1f1b0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1f1c0 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32  ( TK_LT==TK_GT+2
1f1d0 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
1f1e0 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61   of the TK_xx va
1f1f0 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  lues... */.     
1f200 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
1f210 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20  TK_GT+3 );      
1f220 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65  /*  ... is corre
1f230 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61  cct. */..      a
1f240 73 73 65 72 74 28 20 28 70 53 74 61 72 74 2d 3e  ssert( (pStart->
1f250 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1f260 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NULL)==0 );.    
1f270 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61    testcase( pSta
1f280 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
1f290 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1f2a0 20 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d      pX = pStart-
1f2b0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
1f2c0 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
1f2d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1f2e0 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f  Start->leftCurso
1f2f0 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 74 72  r!=iCur ); /* tr
1f300 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
1f310 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 72 31  ints */.      r1
1f320 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f330 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f340 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d  X->pRight, &rTem
1f350 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
1f360 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61  3VdbeAddOp3(v, a
1f370 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b  MoveOp[pX->op-TK
1f380 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  _GT], iCur, addr
1f390 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Brk, r1);.      
1f3a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1f3b0 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71  "pk"));.      sq
1f3c0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1f3d0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
1f3e0 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  rse, r1, 1);.   
1f3f0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1f400 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1f410 20 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64   rTemp);.      d
1f420 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1f430 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20  l, pStart);.    
1f440 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1f450 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f460 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
1f470 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43   : OP_Rewind, iC
1f480 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
1f490 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64    }.    if( pEnd
1f4a0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1f4b0 70 58 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70  pX;.      pX = p
1f4c0 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  End->pExpr;.    
1f4d0 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
1f4e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f4f0 20 28 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20   (pEnd->wtFlags 
1f500 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
1f510 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1f520 73 65 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75  se( pEnd->leftCu
1f530 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a  rsor!=iCur ); /*
1f540 20 54 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73   Transitive cons
1f550 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
1f560 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d   testcase( pEnd-
1f570 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1f580 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
1f590 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b   memEndValue = +
1f5a0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1f5b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f5c0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
1f5d0 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56  >pRight, memEndV
1f5e0 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28  alue);.      if(
1f5f0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c   pX->op==TK_LT |
1f600 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  | pX->op==TK_GT 
1f610 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  ){.        testO
1f620 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65  p = bRev ? OP_Le
1f630 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20   : OP_Ge;.      
1f640 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
1f650 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
1f660 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20  P_Lt : OP_Gt;.  
1f670 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61      }.      disa
1f680 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1f690 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pEnd);.    }.   
1f6a0 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
1f6b0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1f6c0 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v);.    pLevel->
1f6d0 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
1f6e0 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
1f6f0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1f700 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
1f710 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20  ->p2 = start;.  
1f720 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
1f730 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ->p5==0 );.    i
1f740 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f  f( testOp!=OP_No
1f750 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77  op ){.      iRow
1f760 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65  idReg = iRelease
1f770 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
1f780 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1f790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f7a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
1f7b0 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77  owid, iCur, iRow
1f7c0 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
1f7d0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1f7e0 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
1f7f0 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
1f800 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f810 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73  dbeAddOp3(v, tes
1f820 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65  tOp, memEndValue
1f830 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69  , addrBrk, iRowi
1f840 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
1f850 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1f860 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  (v, SQLITE_AFF_N
1f870 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f  UMERIC | SQLITE_
1f880 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1f890 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
1f8a0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1f8b0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b  WHERE_INDEXED ){
1f8c0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20  .    /* Case 4: 
1f8d0 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20  A scan using an 
1f8e0 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  index..    **.  
1f8f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
1f900 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61   WHERE clause ma
1f910 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f  y contain zero o
1f920 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20  r more equality 
1f930 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f940 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22  terms ("==" or "
1f950 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74  IN" operators) t
1f960 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
1f970 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   N.    **       
1f980 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75    left-most colu
1f990 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
1f9a0 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f  . It may also co
1f9b0 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ntain.    **    
1f9c0 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20       inequality 
1f9d0 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20  constraints (>, 
1f9e0 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20  <, >= or <=) on 
1f9f0 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20  the indexed.    
1fa00 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  **         colum
1fa10 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65  n that immediate
1fa20 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e  ly follows the N
1fa30 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c   equalities. Onl
1fa40 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
1fa50 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    the right-most
1fa60 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61   column can be a
1fa70 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74  n inequality - t
1fa80 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20  he rest must.   
1fa90 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20   **         use 
1faa0 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e  the "==" and "IN
1fab0 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72  " operators. For
1fac0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
1fad0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1fae0 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c   index is on (x,
1faf0 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66  y,z), then the f
1fb00 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73  ollowing clauses
1fb10 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a   are all .    **
1fb20 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a           optimiz
1fb30 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed:.    **.    *
1fb40 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1fb50 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1fb60 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a     x=5 AND y=10.
1fb70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1fb80 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20    x=5 AND y<10. 
1fb90 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1fba0 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44   x=5 AND y>5 AND
1fbb0 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20   y<10.    **    
1fbc0 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1fbd0 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20  y=5 AND z<=10.  
1fbe0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1fbf0 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72      The z<10 ter
1fc00 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  m of the followi
1fc10 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  ng cannot be use
1fc20 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20  d, only.    **  
1fc30 20 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74         the x=5 t
1fc40 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  erm:.    **.    
1fc50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1fc60 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a  5 AND z<10.    *
1fc70 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1fc80 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69   N may be zero i
1fc90 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71  f there are ineq
1fca0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1fcb0 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ts..    **      
1fcc0 20 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20     If there are 
1fcd0 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  no inequality co
1fce0 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20  nstraints, then 
1fcf0 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20  N is at.    **  
1fd00 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65         least one
1fd10 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1fd20 20 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73          This cas
1fd30 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77  e is also used w
1fd40 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
1fd50 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20   WHERE clause.  
1fd60 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e    **         con
1fd70 73 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20  straints but an 
1fd80 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65  index is selecte
1fd90 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64  d anyway, in ord
1fda0 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  er.    **       
1fdb0 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f    to force the o
1fdc0 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63  utput order to c
1fdd0 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44  onform to an ORD
1fde0 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a  ER BY..    */  .
1fdf0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1fe00 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d   u8 aStartOp[] =
1fe10 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20   {.      0,.    
1fe20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65    0,.      OP_Re
1fe30 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  wind,           
1fe40 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 2: (!start_co
1fe50 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
1fe60 72 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20  rtEq &&  !bRev) 
1fe70 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74  */.      OP_Last
1fe80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1fe90 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73   3: (!start_cons
1fea0 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74  traints && start
1feb0 45 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f  Eq &&   bRev) */
1fec0 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74  .      OP_SeekGt
1fed0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  ,           /* 4
1fee0 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1fef0 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
1ff00 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
1ff10 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20       OP_SeekLt, 
1ff20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20            /* 5: 
1ff30 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1ff40 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20  ts  && !startEq 
1ff50 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
1ff60 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20     OP_SeekGe,   
1ff70 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73          /* 6: (s
1ff80 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1ff90 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
1ffa0 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1ffb0 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20   OP_SeekLe      
1ffc0 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61        /* 7: (sta
1ffd0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1ffe0 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20  &&  startEq &&  
1fff0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
20000 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
20010 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b   u8 aEndOp[] = {
20020 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20  .      OP_Noop, 
20030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
20040 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69  : (!end_constrai
20050 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  nts) */.      OP
20060 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20  _IdxGE,         
20070 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f     /* 1: (end_co
20080 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52  nstraints && !bR
20090 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
200a0 49 64 78 4c 54 20 20 20 20 20 20 20 20 20 20 20  IdxLT           
200b0 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e    /* 2: (end_con
200c0 73 74 72 61 69 6e 74 73 20 26 26 20 62 52 65 76  straints && bRev
200d0 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ) */.    };.    
200e0 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  int nEq = pLoop-
200f0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20 2f  >u.btree.nEq;  /
20100 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  * Number of == o
20110 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r IN terms */.  
20120 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79    int isMinQuery
20130 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
20140 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
20150 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45  n optimized SELE
20160 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20  CT min(x).. */. 
20170 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20     int regBase; 
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20190 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72  /* Base register
201a0 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61   holding constra
201b0 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  int values */.  
201c0 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20    int r1;       
201d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
201e0 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20  * Temp register 
201f0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
20200 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20   *pRangeStart = 
20210 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74  0;  /* Inequalit
20220 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
20230 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20  range start */. 
20240 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
20250 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20  angeEnd = 0;    
20260 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
20270 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
20280 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  e end */.    int
20290 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20   startEq;       
202a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
202b0 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74  e if range start
202c0 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
202d0 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e  <= */.    int en
202e0 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  dEq;            
202f0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
20300 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73  f range end uses
20310 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
20320 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63  .    int start_c
20330 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20  onstraints;     
20340 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61    /* Start of ra
20350 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  nge is constrain
20360 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  ed */.    int nC
20370 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
20380 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20390 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74   of constraint t
203a0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65  erms */.    Inde
203b0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
203c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
203d0 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65  index we will be
203e0 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e   using */.    in
203f0 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
20400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20410 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
20420 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
20430 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67     int nExtraReg
20440 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
20450 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
20460 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65  ra registers nee
20470 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ded */.    int o
20480 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
20490 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72          /* Instr
204a0 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  uction opcode */
204b0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72  .    char *zStar
204c0 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  tAff;           
204d0 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
204e0 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65  r start of range
204f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
20500 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 41 66 66     char *zEndAff
20510 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20520 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
20530 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  end of range con
20540 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20  straint */..    
20550 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  pIdx = pLoop->u.
20560 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
20570 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76    iIdxCur = pLev
20580 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a 20 20  el->iIdxCur;..  
20590 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f    /* If this loo
205a0 70 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f  p satisfies a so
205b0 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72  rt order (pOrder
205c0 42 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74  By) request that
205d0 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73   .    ** was pas
205e0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
205f0 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  tion to implemen
20600 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28  t a "SELECT min(
20610 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20  x) ..." .    ** 
20620 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20  query, then the 
20630 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79  caller will only
20640 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20   allow the loop 
20650 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a  to run for.    *
20660 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61  * a single itera
20670 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73  tion. This means
20680 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
20690 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20  row returned.   
206a0 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68   ** should not h
206b0 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ave a NULL value
206c0 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20   stored in 'x'. 
206d0 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73  If column 'x' is
206e0 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73  .    ** the firs
206f0 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20  t one after the 
20700 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  nEq equality con
20710 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20  straints in the 
20720 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68  index,.    ** th
20730 69 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65  is requires some
20740 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e   special handlin
20750 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  g..    */.    if
20760 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
20770 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
20780 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20  RBY_MIN)!=0.    
20790 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 62 4f 42   && (pWInfo->bOB
207a0 53 61 74 21 3d 30 29 0a 20 20 20 20 20 26 26 20  Sat!=0).     && 
207b0 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e  (pIdx->nColumn>n
207c0 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
207d0 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64   /* assert( pOrd
207e0 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  erBy->nExpr==1 )
207f0 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73  ; */.      /* as
20800 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
20810 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[0].pExpr->iCol
20820 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
20830 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20  umn[nEq] ); */. 
20840 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20       isMinQuery 
20850 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  = 1;.      nExtr
20860 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
20870 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79  .    /* Find any
20880 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
20890 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72  traint terms for
208a0 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
208b0 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nd .    ** of th
208c0 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f  e range. .    */
208d0 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20  .    j = nEq;.  
208e0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
208f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
20900 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
20910 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c  pRangeStart = pL
20920 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
20930 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
20940 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 1;.    }.   
20950 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
20960 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
20970 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
20980 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70  RangeEnd = pLoop
20990 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
209a0 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
209b0 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
209c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
209d0 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
209e0 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
209f0 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a   using == or IN.
20a00 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65      ** and store
20a10 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
20a20 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  hose terms in an
20a30 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
20a40 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
20a50 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a  ing at regBase..
20a60 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61      */.    regBa
20a70 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61  se = codeAllEqua
20a80 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65  lityTerms(pParse
20a90 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78  ,pLevel,bRev,nEx
20aa0 74 72 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66  traReg,&zStartAf
20ab0 66 29 3b 0a 20 20 20 20 7a 45 6e 64 41 66 66 20  f);.    zEndAff 
20ac0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
20ad0 70 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29  p(db, zStartAff)
20ae0 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
20af0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
20b00 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  ..    /* If we a
20b10 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72  re doing a rever
20b20 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  se order scan on
20b30 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
20b40 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  dex, or.    ** a
20b50 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73   forward order s
20b60 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  can on a descend
20b70 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72  ing index, inter
20b80 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20  change the .    
20b90 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  ** start and end
20ba0 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74   terms (pRangeSt
20bb0 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e  art and pRangeEn
20bc0 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d)..    */.    i
20bd0 66 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 43  f( (nEq<pIdx->nC
20be0 6f 6c 75 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28  olumn && bRev==(
20bf0 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
20c00 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f  [nEq]==SQLITE_SO
20c10 5f 41 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28  _ASC)).     || (
20c20 62 52 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 43  bRev && pIdx->nC
20c30 6f 6c 75 6d 6e 3d 3d 6e 45 71 29 0a 20 20 20 20  olumn==nEq).    
20c40 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68  ){.      SWAP(Wh
20c50 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67  ereTerm *, pRang
20c60 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72  eEnd, pRangeStar
20c70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  t);.    }..    t
20c80 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
20c90 74 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53  tart && (pRangeS
20ca0 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
20cb0 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20  & WO_LE)!=0 );. 
20cc0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
20cd0 6e 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61  ngeStart && (pRa
20ce0 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
20cf0 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20  tor & WO_GE)!=0 
20d00 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
20d10 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70   pRangeEnd && (p
20d20 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
20d30 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20  tor & WO_LE)!=0 
20d40 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
20d50 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70   pRangeEnd && (p
20d60 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
20d70 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20  tor & WO_GE)!=0 
20d80 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d  );.    startEq =
20d90 20 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c   !pRangeStart ||
20da0 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
20db0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
20dc0 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64  |WO_GE);.    end
20dd0 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e  Eq =   !pRangeEn
20de0 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e  d || pRangeEnd->
20df0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
20e00 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73  LE|WO_GE);.    s
20e10 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
20e20 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c   = pRangeStart |
20e30 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a  | nEq>0;..    /*
20e40 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20   Seek the index 
20e50 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74  cursor to the st
20e60 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
20e70 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72  . */.    nConstr
20e80 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20  aint = nEq;.    
20e90 69 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  if( pRangeStart 
20ea0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
20eb0 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74  Right = pRangeSt
20ec0 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  art->pExpr->pRig
20ed0 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
20ee0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
20ef0 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
20f00 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66  e+nEq);.      if
20f10 28 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  ( (pRangeStart->
20f20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
20f30 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
20f40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20f50 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c  odeIsNullJump(v,
20f60 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
20f70 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
20f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
20f90 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20  ( zStartAff ){. 
20fa0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
20fb0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
20fc0 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74  y(pRight, zStart
20fd0 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54  Aff[nEq])==SQLIT
20fe0 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20  E_AFF_NONE){.   
20ff0 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20         /* Since 
21000 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
21010 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  s to be performe
21020 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72  d with no conver
21030 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20  sions.          
21040 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68  ** applied to th
21050 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20  e operands, set 
21060 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
21070 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20  apply to pRight 
21080 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  to .          **
21090 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
210a0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
210b0 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d  zStartAff[nEq] =
210c0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
210d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
210e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
210f0 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
21100 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
21110 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29   zStartAff[nEq])
21120 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53   ){.          zS
21130 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53  tartAff[nEq] = S
21140 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
21150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21160 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  }  .      nConst
21170 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
21180 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
21190 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
211a0 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
211b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
211c0 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20  MinQuery ){.    
211d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
211e0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
211f0 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  0, regBase+nEq);
21200 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
21210 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72  nt++;.      star
21220 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  tEq = 0;.      s
21230 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
21240 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
21250 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
21260 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
21270 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20  e, nConstraint, 
21280 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
21290 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73  op = aStartOp[(s
212a0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
212b0 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c  <<2) + (startEq<
212c0 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20  <1) + bRev];.   
212d0 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29   assert( op!=0 )
212e0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
212f0 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b  op==OP_Rewind );
21300 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
21310 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20  p==OP_Last );.  
21320 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
21330 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20  OP_SeekGt );.   
21340 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
21350 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20  P_SeekGe );.    
21360 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
21370 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74  _SeekLe );.    t
21380 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
21390 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71  SeekLt );.    sq
213a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
213b0 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  nt(v, op, iIdxCu
213c0 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
213d0 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
213e0 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  );..    /* Load 
213f0 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  the value for th
21400 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
21410 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20 65  straint at the e
21420 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
21430 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e   range (if any).
21440 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e  .    */.    nCon
21450 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20  straint = nEq;. 
21460 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64     if( pRangeEnd
21470 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
21480 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45  pRight = pRangeE
21490 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  nd->pExpr->pRigh
214a0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
214b0 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
214c0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b  pParse, regBase+
214d0 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  nEq, 1);.      s
214e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
214f0 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72  Parse, pRight, r
21500 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
21510 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e     if( (pRangeEn
21520 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
21530 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  M_VNULL)==0 ){. 
21540 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
21550 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70  prCodeIsNullJump
21560 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  (v, pRight, regB
21570 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74  ase+nEq, addrNxt
21580 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21590 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a   if( zEndAff ){.
215a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
215b0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
215c0 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41  ty(pRight, zEndA
215d0 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45  ff[nEq])==SQLITE
215e0 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20  _AFF_NONE){.    
215f0 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74        /* Since t
21600 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
21610 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64   to be performed
21620 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73   with no convers
21630 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ions.          *
21640 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65  * applied to the
21650 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74   operands, set t
21660 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61  he affinity to a
21670 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74  pply to pRight t
21680 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  o .          ** 
21690 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
216a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a    */.          z
216b0 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  EndAff[nEq] = SQ
216c0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
216d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
216e0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
216f0 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
21700 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 45  hange(pRight, zE
21710 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20  ndAff[nEq]) ){. 
21720 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66           zEndAff
21730 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
21740 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
21750 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20   }.      }  .   
21760 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
21770 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
21780 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e  Base, nEq+1, zEn
21790 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f  dAff);.      nCo
217a0 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
217b0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
217c0 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
217d0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
217e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
217f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
21800 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73 71 6c  artAff);.    sql
21810 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
21820 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a  EndAff);..    /*
21830 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   Top of the loop
21840 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65   body */.    pLe
21850 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
21860 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
21870 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (v);..    /* Che
21880 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ck if the index 
21890 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74  cursor is past t
218a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61  he end of the ra
218b0 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d  nge. */.    op =
218c0 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45   aEndOp[(pRangeE
218d0 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20  nd || nEq) * (1 
218e0 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65  + bRev)];.    te
218f0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e  stcase( op==OP_N
21900 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63  oop );.    testc
21910 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  ase( op==OP_IdxG
21920 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
21930 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  e( op==OP_IdxLT 
21940 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f  );.    if( op!=O
21950 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
21960 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21970 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
21980 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
21990 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
219a0 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
219b0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
219c0 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31  , endEq!=bRev ?1
219d0 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  :0);.    }..    
219e0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
219f0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
21a00 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68  raints, check th
21a10 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  at the value.   
21a20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
21a30 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
21a40 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74   inequality cont
21a50 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c  rains is not NUL
21a60 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20  L..    ** If it 
21a70 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  is, jump to the 
21a80 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
21a90 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20  f the loop..    
21aa0 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69  */.    r1 = sqli
21ab0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
21ac0 61 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63  arse);.    testc
21ad0 61 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  ase( pLoop->wsFl
21ae0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
21af0 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73  LIMIT );.    tes
21b00 74 63 61 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73  tcase( pLoop->ws
21b10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
21b20 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69  P_LIMIT );.    i
21b30 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
21b40 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f  gs & (WHERE_BTM_
21b50 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
21b60 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b 0a 20 20  LIMIT))!=0 ){.  
21b70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21b80 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
21b90 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71  mn, iIdxCur, nEq
21ba0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
21bb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21bc0 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c  , OP_IsNull, r1,
21bd0 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20   addrCont);.    
21be0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  }.    sqlite3Rel
21bf0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
21c00 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a  se, r1);..    /*
21c10 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20   Seek the table 
21c20 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69  cursor, if requi
21c30 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62  red */.    disab
21c40 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
21c50 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
21c60 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
21c70 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b  vel, pRangeEnd);
21c80 0a 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61  .    if( !omitTa
21c90 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 52 6f  ble ){.      iRo
21ca0 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73  widReg = iReleas
21cb0 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  eReg = sqlite3Ge
21cc0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
21cd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21ce0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21cf0 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75  IdxRowid, iIdxCu
21d00 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  r, iRowidReg);. 
21d10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21d20 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
21d30 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
21d40 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
21d50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21d60 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75  (v, OP_Seek, iCu
21d70 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20 20  r, iRowidReg);  
21d80 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65 65 6b  /* Deferred seek
21d90 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   */.    }..    /
21da0 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73  * Record the ins
21db0 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f  truction used to
21dc0 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
21dd0 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20  oop. Disable .  
21de0 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73    ** WHERE claus
21df0 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64  e terms made red
21e00 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e  undant by the in
21e10 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a  dex range scan..
21e20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
21e30 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
21e40 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a  WHERE_ONEROW ){.
21e50 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
21e60 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
21e70 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29  }else if( bRev )
21e80 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
21e90 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20  op = OP_Prev;.  
21ea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
21eb0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
21ec0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ext;.    }.    p
21ed0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78  Level->p1 = iIdx
21ee0 43 75 72 3b 0a 20 20 20 20 69 66 28 20 28 70 4c  Cur;.    if( (pL
21ef0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
21f00 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29  HERE_CONSTRAINT)
21f10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ==0 ){.      pLe
21f20 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45  vel->p5 = SQLITE
21f30 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
21f40 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d  SCAN_STEP;.    }
21f50 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
21f60 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d  rt( pLevel->p5==
21f70 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  0 );.    }.  }el
21f80 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
21f90 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
21fa0 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c  IZATION.  if( pL
21fb0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
21fc0 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b  HERE_MULTI_OR ){
21fd0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20  .    /* Case 5: 
21fe0 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   Two or more sep
21ff0 61 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20  arately indexed 
22000 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
22010 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20  by OR.    **.   
22020 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
22030 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45   **.    **   CRE
22040 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62  ATE TABLE t1(a,b
22050 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20  ,c,d);.    **   
22060 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
22070 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a  ON t1(a);.    **
22080 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
22090 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20  i2 ON t1(b);.   
220a0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
220b0 45 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a  EX i3 ON t1(c);.
220c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
220d0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
220e0 20 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d   WHERE a=5 OR b=
220f0 37 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64  7 OR (c=11 AND d
22100 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  =13).    **.    
22110 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
22120 65 2c 20 74 68 65 72 65 20 61 72 65 20 74 68 72  e, there are thr
22130 65 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73  ee indexed terms
22140 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
22150 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70  ..    ** The top
22160 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f   of the loop loo
22170 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ks like this:.  
22180 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
22190 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20       Null       
221a0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
221b0 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73   # Zero the rows
221c0 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20  et in reg 1.    
221d0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20  **.    ** Then, 
221e0 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65 64  for each indexed
221f0 20 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f   term, the follo
22200 77 69 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65  wing. The argume
22210 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f  nts to.    ** Ro
22220 77 53 65 74 54 65 73 74 20 61 72 65 20 73 75 63  wSetTest are suc
22230 68 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64  h that the rowid
22240 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
22250 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a  row is inserted.
22260 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
22270 52 6f 77 53 65 74 2e 20 49 66 20 69 74 20 69 73  RowSet. If it is
22280 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
22290 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20  , control skips 
222a0 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62  the.    ** Gosub
222b0 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70   opcode and jump
222c0 73 20 73 74 72 61 69 67 68 74 20 74 6f 20 74 68  s straight to th
222d0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
222e0 20 62 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a   by WhereEnd()..
222f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
22300 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
22310 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20  eBegin(<term>). 
22320 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
22330 6f 77 53 65 74 54 65 73 74 20 20 20 20 20 20 20  owSetTest       
22340 20 20 20 20 20 20 20 20 20 20 20 23 20 49 6e 73             # Ins
22350 65 72 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72  ert rowid into r
22360 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20  owset.    **    
22370 20 20 20 20 20 20 47 6f 73 75 62 20 20 20 20 20        Gosub     
22380 20 32 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20   2 A.    **     
22390 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
223a0 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nd().    **.    
223b0 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** Following the
223c0 20 61 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20   above, code to 
223d0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
223e0 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65  op. Label A, the
223f0 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f   target.    ** o
22400 66 20 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76  f the Gosub abov
22410 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20  e, jumps to the 
22420 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68  instruction righ
22430 74 20 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f  t after the Goto
22440 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
22450 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20           Null   
22460 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
22470 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20       # Zero the 
22480 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a  rowset in reg 1.
22490 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
224a0 47 6f 74 6f 20 20 20 20 20 20 20 42 20 20 20 20  Goto       B    
224b0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 54 68              # Th
224c0 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68  e loop is finish
224d0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
224e0 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70  *       A: <loop
224f0 20 62 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20   body>          
22500 20 20 20 20 20 20 20 23 20 52 65 74 75 72 6e 20         # Return 
22510 64 61 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a  data, whatever..
22520 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
22530 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 20 20         Return   
22540 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
22550 20 20 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74     # Jump back t
22560 6f 20 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20  o the Gosub.    
22570 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
22580 42 3a 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f  B: <after the lo
22590 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  op>.    **.    *
225a0 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73  /.    WhereClaus
225b0 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20  e *pOrWc;    /* 
225c0 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72  The OR-clause br
225d0 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75  oken out into su
225e0 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72  bterms */.    Sr
225f0 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20  cList *pOrTab;  
22600 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65       /* Shortene
22610 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20  d table list or 
22620 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61  OR-clause genera
22630 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65  tion */.    Inde
22640 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20  x *pCov = 0;    
22650 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65           /* Pote
22660 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69  ntial covering i
22670 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  ndex (or NULL) *
22680 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75  /.    int iCovCu
22690 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
226a0 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75  ++;  /* Cursor u
226b0 73 65 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63  sed for index sc
226c0 61 6e 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ans (if any) */.
226d0 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75  .    int regRetu
226e0 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
226f0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Mem;           /
22700 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20  * Register used 
22710 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f  with OP_Gosub */
22720 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73  .    int regRows
22730 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
22740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22750 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52  * Register for R
22760 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  owSet object */.
22770 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
22780 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
227a0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
227b0 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  g rowid */.    i
227c0 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73  nt iLoopBody = s
227d0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
227e0 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72  bel(v);  /* Star
227f0 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a  t of loop body *
22800 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e  /.    int iRetIn
22810 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
22820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22830 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65  /* Address of re
22840 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a  gReturn init */.
22850 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64      int untested
22860 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20  Terms = 0;      
22870 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74         /* Some t
22880 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  erms not complet
22890 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ely tested */.  
228a0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228c0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
228d0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  nter */.    Expr
228e0 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20   *pAndExpr = 0; 
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22900 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e  * An ".. AND (..
22910 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  .)" expression *
22920 2f 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20  /.   .    pTerm 
22930 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
22940 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0];.    assert( 
22950 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
22960 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
22970 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
22980 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
22990 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
229a0 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d  & TERM_ORINFO)!=
229b0 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d  0 );.    pOrWc =
229c0 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
229d0 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76  fo->wc;.    pLev
229e0 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75  el->op = OP_Retu
229f0 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  rn;.    pLevel->
22a00 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a  p1 = regReturn;.
22a10 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61  .    /* Set up a
22a20 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20   new SrcList in 
22a30 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e  pOrTab containin
22a40 67 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  g the table bein
22a50 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a  g scanned.    **
22a60 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e   by this loop in
22a70 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61   the a[0] slot a
22a80 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20  nd all notReady 
22a90 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d  tables in a[1..]
22aa0 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54   slots..    ** T
22ab0 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  his becomes the 
22ac0 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72  SrcList in the r
22ad0 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f  ecursive call to
22ae0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
22af0 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  in()..    */.   
22b00 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
22b10 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  vel>1 ){.      i
22b20 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20  nt nNotReady;   
22b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22b40 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   The number of n
22b50 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a  otReady tables *
22b60 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  /.      struct S
22b70 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69  rcList_item *ori
22b80 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69  gSrc;     /* Ori
22b90 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61  ginal list of ta
22ba0 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e  bles */.      nN
22bb0 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f  otReady = pWInfo
22bc0 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65  ->nLevel - iLeve
22bd0 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72  l - 1;.      pOr
22be0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61  Tab = sqlite3Sta
22bf0 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20  ckAllocRaw(db,. 
22c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c10 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
22c20 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74  f(*pOrTab)+ nNot
22c30 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72  Ready*sizeof(pOr
22c40 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  Tab->a[0]));.   
22c50 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30     if( pOrTab==0
22c60 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61   ) return notRea
22c70 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  dy;.      pOrTab
22c80 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28  ->nAlloc = (u8)(
22c90 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a  nNotReady + 1);.
22ca0 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53        pOrTab->nS
22cb0 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c  rc = pOrTab->nAl
22cc0 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  loc;.      memcp
22cd0 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61  y(pOrTab->a, pTa
22ce0 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70  bItem, sizeof(*p
22cf0 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20  TabItem));.     
22d00 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66   origSrc = pWInf
22d10 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a  o->pTabList->a;.
22d20 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b        for(k=1; k
22d30 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b  <=nNotReady; k++
22d40 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
22d50 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c  y(&pOrTab->a[k],
22d60 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c   &origSrc[pLevel
22d70 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65  [k].iFrom], size
22d80 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29  of(pOrTab->a[k])
22d90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
22da0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54  else{.      pOrT
22db0 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ab = pWInfo->pTa
22dc0 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  bList;.    }..  
22dd0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
22de0 74 68 65 20 72 6f 77 73 65 74 20 72 65 67 69 73  the rowset regis
22df0 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e  ter to contain N
22e00 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c  ULL. An SQL NULL
22e10 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69   is .    ** equi
22e20 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70  valent to an emp
22e30 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a  ty rowset..    *
22e40 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e  *.    ** Also in
22e50 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75  itialize regRetu
22e60 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  rn to contain th
22e70 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
22e80 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20   instruction .  
22e90 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
22ea0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f   following the O
22eb0 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65 20  P_Return at the 
22ec0 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
22ed0 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  op. This.    ** 
22ee0 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 61  is required in a
22ef0 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46   few obscure LEF
22f00 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65  T JOIN cases whe
22f10 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  re control jumps
22f20 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65  .    ** over the
22f30 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
22f40 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
22f50 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61  f it. In this ca
22f60 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  se the .    ** c
22f70 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20  orrect response 
22f80 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c  for the end-of-l
22f90 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50  oop code (the OP
22fa0 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a  _Return) is to .
22fb0 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f      ** fall thro
22fc0 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
22fd0 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73  instruction, jus
22fe0 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20  t as an OP_Next 
22ff0 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63  does if.    ** c
23000 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e  alled on an unin
23010 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72  itialized cursor
23020 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
23030 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
23040 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50  lags & WHERE_DUP
23050 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29  LICATES_OK)==0 )
23060 7b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 73 65  {.      regRowse
23070 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
23080 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77  em;.      regRow
23090 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  id = ++pParse->n
230a0 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
230b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
230c0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52  OP_Null, 0, regR
230d0 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20  owset);.    }.  
230e0 20 20 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c    iRetInit = sql
230f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23100 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
23110 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20   regReturn);..  
23120 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67    /* If the orig
23130 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  inal WHERE claus
23140 65 20 69 73 20 7a 20 6f 66 20 74 68 65 20 66 6f  e is z of the fo
23150 72 6d 3a 20 20 28 78 31 20 4f 52 20 78 32 20 4f  rm:  (x1 OR x2 O
23160 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20  R ...) AND y.   
23170 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65 76 65   ** Then for eve
23180 72 79 20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c  ry term xN, eval
23190 75 61 74 65 20 61 73 20 74 68 65 20 73 75 62 65  uate as the sube
231a0 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e  xpression: xN AN
231b0 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  D z.    ** That 
231c0 77 61 79 2c 20 74 65 72 6d 73 20 69 6e 20 79 20  way, terms in y 
231d0 74 68 61 74 20 61 72 65 20 66 61 63 74 6f 72 65  that are factore
231e0 64 20 69 6e 74 6f 20 74 68 65 20 64 69 73 6a 75  d into the disju
231f0 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  nction will.    
23200 2a 2a 20 62 65 20 70 69 63 6b 65 64 20 75 70 20  ** be picked up 
23210 62 79 20 74 68 65 20 72 65 63 75 72 73 69 76 65  by the recursive
23220 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
23230 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 62 65  3WhereBegin() be
23240 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  low..    **.    
23250 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65 61 63  ** Actually, eac
23260 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  h subexpression 
23270 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  is converted to 
23280 22 78 4e 20 41 4e 44 20 77 22 20 77 68 65 72 65  "xN AND w" where
23290 20 77 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65   w is.    ** the
232a0 20 22 69 6e 74 65 72 65 73 74 69 6e 67 22 20 74   "interesting" t
232b0 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d  erms of z - term
232c0 73 20 74 68 61 74 20 64 69 64 20 6e 6f 74 20 6f  s that did not o
232d0 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 0a  riginate in the.
232e0 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49      ** ON or USI
232f0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c  NG clause of a L
23300 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65  EFT JOIN, and te
23310 72 6d 73 20 74 68 61 74 20 61 72 65 20 75 73 61  rms that are usa
23320 62 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 69  ble as .    ** i
23330 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20  ndices..    **. 
23340 20 20 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d     ** This optim
23350 69 7a 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c  ization also onl
23360 79 20 61 70 70 6c 69 65 73 20 69 66 20 74 68 65  y applies if the
23370 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e   (x1 OR x2 OR ..
23380 2e 29 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69  .) term.    ** i
23390 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
233a0 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
233b0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
233c0 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 69 63 6b  .    ** See tick
233d0 65 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71  et http://www.sq
233e0 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66  lite.org/src/inf
233f0 6f 2f 66 32 33 36 39 33 30 34 65 34 0a 20 20 20  o/f2369304e4.   
23400 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d   */.    if( pWC-
23410 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20  >nTerm>1 ){.    
23420 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20    int iTerm;.   
23430 20 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20     for(iTerm=0; 
23440 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d  iTerm<pWC->nTerm
23450 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; iTerm++){.    
23460 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
23470 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  = pWC->a[iTerm].
23480 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
23490 66 28 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d  f( &pWC->a[iTerm
234a0 5d 20 3d 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e  ] == pTerm ) con
234b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
234c0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
234d0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
234e0 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75  mJoin) ) continu
234f0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
23500 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46  WC->a[iTerm].wtF
23510 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 4f 52 49  lags & (TERM_ORI
23520 4e 46 4f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NFO) ) continue;
23530 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
23540 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65  C->a[iTerm].eOpe
23550 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d  rator & WO_ALL)=
23560 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
23570 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
23580 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
23590 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
235a0 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20       pAndExpr = 
235b0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
235c0 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78  b, pAndExpr, pEx
235d0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
235e0 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
235f0 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45  ){.        pAndE
23600 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
23610 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e  pr(pParse, TK_AN
23620 44 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20  D, 0, pAndExpr, 
23630 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
23640 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  }..    for(ii=0;
23650 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d   ii<pOrWc->nTerm
23660 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57  ; ii++){.      W
23670 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
23680 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69  m = &pOrWc->a[ii
23690 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  ];.      if( pOr
236a0 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
236b0 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65  ==iCur || (pOrTe
236c0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
236d0 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20  WO_AND)!=0 ){.  
236e0 20 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20        WhereInfo 
236f0 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20  *pSubWInfo;     
23700 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72       /* Info for
23710 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20   single OR-term 
23720 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  scan */.        
23730 45 78 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20  Expr *pOrExpr = 
23740 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  pOrTerm->pExpr;.
23750 20 20 20 20 20 20 20 20 69 66 28 20 70 41 6e 64          if( pAnd
23760 45 78 70 72 20 26 26 20 21 45 78 70 72 48 61 73  Expr && !ExprHas
23770 50 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72  Property(pOrExpr
23780 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
23790 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e 64  {.          pAnd
237a0 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f  Expr->pLeft = pO
237b0 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  rExpr;.         
237c0 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45   pOrExpr = pAndE
237d0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
237e0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
237f0 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74  hrough table ent
23800 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20  ries that match 
23810 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f  term pOrTerm. */
23820 0a 20 20 20 20 20 20 20 20 70 53 75 62 57 49 6e  .        pSubWIn
23830 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
23840 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
23850 4f 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20  OrTab, pOrExpr, 
23860 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
23870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
23880 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
23890 4f 53 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f  OSE | WHERE_AND_
238a0 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20  ONLY |.         
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
238c0 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
238d0 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   | WHERE_ONETABL
238e0 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29  E_ONLY, iCovCur)
238f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
23900 28 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70  ( pSubWInfo || p
23910 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
23920 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
23930 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
23940 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  SubWInfo ){.    
23950 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20        WhereLoop 
23960 2a 70 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20  *pSubLoop;.     
23970 20 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53       explainOneS
23980 63 61 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20  can(.           
23990 20 20 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61     pParse, pOrTa
239a0 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61  b, &pSubWInfo->a
239b0 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65  [0], iLevel, pLe
239c0 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20  vel->iFrom, 0.  
239d0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
239e0 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f       if( (pWInfo
239f0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
23a00 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
23a10 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
23a20 20 20 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d        int iSet =
23a30 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54   ((ii==pOrWc->nT
23a40 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20  erm-1)?-1:ii);. 
23a50 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
23a60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 20  ;.            r 
23a70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
23a80 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
23a90 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  e, pTabItem->pTa
23aa0 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20  b, -1, iCur, .  
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ad0 20 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 2c         regRowid,
23ae0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
23af0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23b00 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53  p4Int(v, OP_RowS
23b10 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65  etTest, regRowse
23b20 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
23b50 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c  urrentAddr(v)+2,
23b60 20 72 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20   r, iSet);.     
23b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23b80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23b90 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
23ba0 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70  regReturn, iLoop
23bb0 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20  Body);..        
23bc0 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e    /* The pSubWIn
23bd0 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
23be0 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61  s flag means tha
23bf0 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20  t this OR term. 
23c00 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74           ** cont
23c10 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  ained one or mor
23c20 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20  e AND term from 
23c30 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  a notReady table
23c40 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 20  .  The.         
23c50 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74   ** terms from t
23c60 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  he notReady tabl
23c70 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74  e could not be t
23c80 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20  ested and will. 
23c90 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
23ca0 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61   to be tested la
23cb0 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ter..          *
23cc0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
23cd0 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
23ce0 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73  tedTerms ) untes
23cf0 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20  tedTerms = 1;.. 
23d00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
23d10 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e  ll of the OR-con
23d20 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61 72 65  nected terms are
23d30 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
23d40 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
23d50 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e      ** index, an
23d60 64 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f  d the index is o
23d70 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20  pened using the 
23d80 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  same cursor numb
23d90 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
23da0 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20  by each call to 
23db0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
23dc0 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68 69 73  n() made by this
23dd0 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20   loop, it may.  
23de0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 70 6f          ** be po
23df0 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68  ssible to use th
23e00 61 74 20 69 6e 64 65 78 20 61 73 20 61 20 63 6f  at index as a co
23e10 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20  vering index..  
23e20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
23e30 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63       ** If the c
23e40 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
23e50 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f 76 65  ereBegin() above
23e60 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61 20 73   resulted in a s
23e70 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20  can that.       
23e80 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e     ** uses an in
23e90 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20 69 73  dex, and this is
23ea0 20 65 69 74 68 65 72 20 74 68 65 20 66 69 72 73   either the firs
23eb0 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74  t OR-connected t
23ec0 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  erm.          **
23ed0 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20 74 68   processed or th
23ee0 65 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 73  e index is the s
23ef0 61 6d 65 20 61 73 20 74 68 61 74 20 75 73 65 64  ame as that used
23f00 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f 75 73   by all previous
23f10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
23f20 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20 74 6f  rms, set pCov to
23f30 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 63   the candidate c
23f40 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f  overing index. O
23f50 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 0a 20  therwise, set . 
23f60 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43 6f 76           ** pCov
23f70 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69   to NULL to indi
23f80 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63 61 6e  cate that no can
23f90 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20  didate covering 
23fa0 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20 20 20  index will .    
23fb0 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76 61 69        ** be avai
23fc0 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20  lable..         
23fd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 53   */.          pS
23fe0 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e  ubLoop = pSubWIn
23ff0 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b  fo->a[0].pWLoop;
24000 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
24010 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73  t( (pSubLoop->ws
24020 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
24030 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a  TO_INDEX)==0 );.
24040 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
24050 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  SubLoop->wsFlags
24060 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
24070 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
24080 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75  && (ii==0 || pSu
24090 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  bLoop->u.btree.p
240a0 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20  Index==pCov).   
240b0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
240c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
240d0 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49  ubWInfo->a[0].iI
240e0 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29  dxCur==iCovCur )
240f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
24100 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75  ov = pSubLoop->u
24110 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
24120 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
24130 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76              pCov
24140 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
24150 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
24160 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20  Finish the loop 
24170 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e  through table en
24180 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68  tries that match
24190 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a   term pOrTerm. *
241a0 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
241b0 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62  te3WhereEnd(pSub
241c0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
241d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
241e0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43      pLevel->u.pC
241f0 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20  ovidx = pCov;.  
24200 20 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65    if( pCov ) pLe
24210 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69  vel->iIdxCur = i
24220 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20  CovCur;.    if( 
24230 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20  pAndExpr ){.    
24240 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66    pAndExpr->pLef
24250 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  t = 0;.      sql
24260 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
24270 62 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20  b, pAndExpr);.  
24280 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
24290 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69  dbeChangeP1(v, i
242a0 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33  RetInit, sqlite3
242b0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
242c0 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v));.    sqlite3
242d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
242e0 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c  _Goto, 0, pLevel
242f0 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
24300 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
24310 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70  veLabel(v, iLoop
24320 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20  Body);..    if( 
24330 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31  pWInfo->nLevel>1
24340 20 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46   ) sqlite3StackF
24350 72 65 65 28 64 62 2c 20 70 4f 72 54 61 62 29 3b  ree(db, pOrTab);
24360 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74  .    if( !untest
24370 65 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c  edTerms ) disabl
24380 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
24390 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  erm);.  }else.#e
243a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
243b0 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
243c0 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20  ION */..  {.    
243d0 2f 2a 20 43 61 73 65 20 36 3a 20 20 54 68 65 72  /* Case 6:  Ther
243e0 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69  e is no usable i
243f0 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64  ndex.  We must d
24400 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20  o a complete.   
24410 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61   **          sca
24420 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
24430 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
24440 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
24450 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50  8 aStep[] = { OP
24460 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d  _Next, OP_Prev }
24470 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
24480 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d  st u8 aStart[] =
24490 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50   { OP_Rewind, OP
244a0 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73  _Last };.    ass
244b0 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20  ert( bRev==0 || 
244c0 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 70  bRev==1 );.    p
244d0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65  Level->op = aSte
244e0 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65  p[bRev];.    pLe
244f0 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
24500 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
24510 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
24520 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74  AddOp2(v, aStart
24530 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64  [bRev], iCur, ad
24540 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76  drBrk);.    pLev
24550 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f  el->p5 = SQLITE_
24560 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
24570 43 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 0a 20  CAN_STEP;.  }.. 
24580 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20   /* Insert code 
24590 74 6f 20 74 65 73 74 20 65 76 65 72 79 20 73 75  to test every su
245a0 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74  bexpression that
245b0 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65   can be complete
245c0 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  ly.  ** computed
245d0 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65   using the curre
245e0 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  nt set of tables
245f0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65  ..  */.  for(pTe
24600 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43  rm=pWC->a, j=pWC
24610 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  ->nTerm; j>0; j-
24620 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
24630 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74   Expr *pE;.    t
24640 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
24650 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
24660 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65  IRTUAL );.    te
24670 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
24680 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
24690 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  DED );.    if( p
246a0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
246b0 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
246c0 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
246d0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
246e0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
246f0 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61  & pLevel->notRea
24700 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)!=0 ){.      
24710 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f  testcase( pWInfo
24720 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d  ->untestedTerms=
24730 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
24740 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
24750 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
24760 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21  _ONETABLE_ONLY)!
24770 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  =0 );.      pWIn
24780 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
24790 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e  s = 1;.      con
247a0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
247b0 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
247c0 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
247d0 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pE!=0 );.    if(
247e0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
247f0 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72  in && !ExprHasPr
24800 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
24810 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
24820 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
24830 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
24840 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
24850 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pE, addrCont, SQ
24860 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
24870 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  ;.    pTerm->wtF
24880 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
24890 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  ED;.  }..  /* In
248a0 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73  sert code to tes
248b0 74 20 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f  t for implied co
248c0 6e 73 74 72 61 69 6e 74 73 20 62 61 73 65 64 20  nstraints based 
248d0 6f 6e 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a  on transitivity.
248e0 20 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22    ** of the "=="
248f0 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a   operator..  **.
24900 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66    ** Example: If
24910 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
24920 65 20 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61  e contains "t1.a
24930 3d 74 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62  =t2.b" and "t2.b
24940 3d 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77  =123".  ** and w
24950 65 20 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65  e are coding the
24960 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65   t1 loop and the
24970 20 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74   t2 loop has not
24980 20 79 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a   yet coded,.  **
24990 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20   then we cannot 
249a0 75 73 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32  use the "t1.a=t2
249b0 2e 62 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  .b" constraint, 
249c0 62 75 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a  but we can code.
249d0 20 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64    ** the implied
249e0 20 22 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73   "t1.a=123" cons
249f0 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66  traint..  */.  f
24a00 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
24a10 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j=pWC->nTerm; j
24a20 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b  >0; j--, pTerm++
24a30 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 2c  ){.    Expr *pE,
24a40 20 2a 70 45 41 6c 74 3b 0a 20 20 20 20 57 68 65   *pEAlt;.    Whe
24a50 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20  reTerm *pAlt;.  
24a60 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
24a70 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
24a80 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
24a90 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
24aa0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
24ab0 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56  rator!=(WO_EQUIV
24ac0 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e  |WO_EQ) ) contin
24ad0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
24ae0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
24af0 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
24b00 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
24b10 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74  iLeftJoin ) cont
24b20 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70  inue;.    pE = p
24b30 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
24b40 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
24b50 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
24b60 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20  _FromJoin) );.  
24b70 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
24b80 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
24b90 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
24ba0 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74  )!=0 );.    pAlt
24bb0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
24bc0 20 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e   iCur, pTerm->u.
24bd0 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52  leftColumn, notR
24be0 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
24bf0 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  N, 0);.    if( p
24c00 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Alt==0 ) continu
24c10 65 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d  e;.    if( pAlt-
24c20 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
24c30 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
24c40 75 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ue;.    testcase
24c50 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
24c60 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
24c70 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d   testcase( pAlt-
24c80 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
24c90 49 4e 20 29 3b 0a 20 20 20 20 56 64 62 65 4e 6f  IN );.    VdbeNo
24ca0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
24cb0 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76 65 20  egin transitive 
24cc0 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a 20  constraint"));. 
24cd0 20 20 20 70 45 41 6c 74 20 3d 20 73 71 6c 69 74     pEAlt = sqlit
24ce0 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28  e3StackAllocRaw(
24cf0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c  db, sizeof(*pEAl
24d00 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70 45 41  t));.    if( pEA
24d10 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 41  lt ){.      *pEA
24d20 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70  lt = *pAlt->pExp
24d30 72 3b 0a 20 20 20 20 20 20 70 45 41 6c 74 2d 3e  r;.      pEAlt->
24d40 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66  pLeft = pE->pLef
24d50 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
24d60 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
24d70 73 65 2c 20 70 45 41 6c 74 2c 20 61 64 64 72 43  se, pEAlt, addrC
24d80 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
24d90 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
24da0 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28  qlite3StackFree(
24db0 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20 20  db, pEAlt);.    
24dc0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  }.  }..  /* For 
24dd0 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
24de0 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  N, generate code
24df0 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72   that will recor
24e00 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a  d the fact that.
24e10 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
24e20 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67  e row of the rig
24e30 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74  ht table has mat
24e40 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61  ched the left ta
24e50 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  ble.  .  */.  if
24e60 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
24e70 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65  oin ){.    pLeve
24e80 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73  l->addrFirst = s
24e90 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
24ea0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
24eb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24ec0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
24ed0 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
24ee0 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
24ef0 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72  mment((v, "recor
24f00 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22  d LEFT JOIN hit"
24f10 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ));.    sqlite3E
24f20 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
24f30 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70  arse);.    for(p
24f40 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30  Term=pWC->a, j=0
24f50 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; j<pWC->nTerm; 
24f60 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
24f70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
24f80 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
24f90 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
24fa0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24fb0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
24fc0 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
24fd0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
24fe0 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
24ff0 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
25000 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
25010 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
25020 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c  ->prereqAll & pL
25030 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21  evel->notReady)!
25040 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
25050 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e  sert( pWInfo->un
25060 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20  testedTerms );. 
25070 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
25080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
25090 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
250a0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  xpr );.      sql
250b0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
250c0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
250d0 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Expr, addrCont, 
250e0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
250f0 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  L);.      pTerm-
25100 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
25110 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
25120 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
25130 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
25140 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
25150 0a 20 20 72 65 74 75 72 6e 20 70 4c 65 76 65 6c  .  return pLevel
25160 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23  ->notReady;.}..#
25170 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
25180 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50  _ENABLED./*.** P
25190 72 69 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f 70  rint a WhereLoop
251a0 20 6f 62 6a 65 63 74 20 66 6f 72 20 64 65 62 75   object for debu
251b0 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a  gging purposes.*
251c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
251d0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65  ereLoopPrint(Whe
251e0 72 65 4c 6f 6f 70 20 2a 70 2c 20 53 72 63 4c 69  reLoop *p, SrcLi
251f0 73 74 20 2a 70 54 61 62 4c 69 73 74 29 7b 0a 20  st *pTabList){. 
25200 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 54 61   int nb = 1+(pTa
25210 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38  bList->nSrc+7)/8
25220 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
25230 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
25240 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70   pTabList->a + p
25250 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20  ->iTab;.  Table 
25260 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
25270 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  Tab;.  sqlite3De
25280 62 75 67 50 72 69 6e 74 66 28 22 25 63 25 32 64  bugPrintf("%c%2d
25290 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c  .%0*llx.%0*llx",
252a0 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20   p->cId,.       
252b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
252c0 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61  >iTab, nb, p->ma
252d0 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70  skSelf, nb, p->p
252e0 72 65 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65  rereq);.  sqlite
252f0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
25300 31 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  12s",.          
25310 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
25320 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d  ->zAlias ? pItem
25330 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d  ->zAlias : pTab-
25340 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28  >zName);.  if( (
25350 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
25360 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
25370 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
25380 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
25390 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
253a0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d  char *zName = p-
253b0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
253c0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66  >zName;.      if
253d0 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 7a 4e 61  ( zName==0 ) zNa
253e0 6d 65 20 3d 20 22 69 70 6b 22 3b 0a 20 20 20 20  me = "ipk";.    
253f0 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e    if( strncmp(zN
25400 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  ame, "sqlite_aut
25410 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30  oindex_", 17)==0
25420 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
25430 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
25440 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a  n30(zName) - 1;.
25450 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
25460 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69  Name[i]!='_' ) i
25470 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  --;.        zNam
25480 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  e += i;.      }.
25490 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
254a0 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73  ugPrintf(".%-16s
254b0 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d   %2d", zName, p-
254c0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20  >u.btree.nEq);. 
254d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
254e0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
254f0 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20  tf("%20s","");. 
25500 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
25510 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
25520 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  f( p->u.vtab.idx
25530 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  Str ){.      z =
25540 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
25550 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29  ("(%d,\"%s\",%x)
25560 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
25570 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
25580 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  Num, p->u.vtab.i
25590 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62  dxStr, p->u.vtab
255a0 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
255b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d  }else{.      z =
255c0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
255d0 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75  ("(%d,%x)", p->u
255e0 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
255f0 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
25600 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
25610 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25620 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20  " %-19s", z);.  
25630 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25640 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
25650 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20  DebugPrintf(" f 
25660 25 30 34 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77  %04x N %d", p->w
25670 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72  sFlags, p->nLTer
25680 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
25690 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73 74 20  ugPrintf(" cost 
256a0 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e  %d,%d,%d\n", p->
256b0 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c  rSetup, p->rRun,
256c0 20 70 2d 3e 6e 4f 75 74 29 3b 0a 7d 0a 23 65 6e   p->nOut);.}.#en
256d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
256e0 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69  rt bulk memory i
256f0 6e 74 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72  nto a valid Wher
25700 65 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62  eLoop that can b
25710 65 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77  e passed.** to w
25720 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61  hereLoopClear ha
25730 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61  rmlessly..*/.sta
25740 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
25750 6f 70 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70  opInit(WhereLoop
25760 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72   *p){.  p->aLTer
25770 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61  m = p->aLTermSpa
25780 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20  ce;.  p->nLTerm 
25790 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74  = 0;.  p->nLSlot
257a0 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   = ArraySize(p->
257b0 61 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20  aLTermSpace);.  
257c0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a  p->wsFlags = 0;.
257d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
257e0 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75  he WhereLoop.u u
257f0 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65  nion.  Leave Whe
25800 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e  reLoop.pLTerm in
25810 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tact..*/.static 
25820 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c  void whereLoopCl
25830 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33  earUnion(sqlite3
25840 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
25850 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73  *p){.  if( p->ws
25860 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 56  Flags & (WHERE_V
25870 49 52 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52  IRTUALTABLE|WHER
25880 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b  E_AUTO_INDEX) ){
25890 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46  .    if( (p->wsF
258a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
258b0 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26  TUALTABLE)!=0 &&
258c0 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46   p->u.vtab.needF
258d0 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ree ){.      sql
258e0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76  ite3_free(p->u.v
258f0 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
25900 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65     p->u.vtab.nee
25910 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
25920 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
25930 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  r = 0;.    }else
25940 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
25950 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
25960 44 45 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e  DEX)!=0 && p->u.
25970 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20  btree.pIndex!=0 
25980 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25990 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
259a0 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43  btree.pIndex->zC
259b0 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71  olAff);.      sq
259c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
259d0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
259e0 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62  x);.      p->u.b
259f0 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
25a00 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
25a10 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69  .** Deallocate i
25a20 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75  nternal memory u
25a30 73 65 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f  sed by a WhereLo
25a40 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  op object.*/.sta
25a50 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
25a60 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20  opClear(sqlite3 
25a70 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
25a80 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  p){.  if( p->aLT
25a90 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
25aa0 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
25ab0 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  ree(db, p->aLTer
25ac0 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  m);.  whereLoopC
25ad0 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29  learUnion(db, p)
25ae0 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
25af0 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  t(p);.}../*.** I
25b00 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f  ncrease the memo
25b10 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  ry allocation fo
25b20 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  r pLoop->aLTerm[
25b30 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  ] to be at least
25b40 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   n..*/.static in
25b50 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  t whereLoopResiz
25b60 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
25b70 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74  hereLoop *p, int
25b80 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d   n){.  WhereTerm
25b90 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20   **paNew;.  if( 
25ba0 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72  p->nLSlot>=n ) r
25bb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25bc0 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b  .  n = (n+7)&~7;
25bd0 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74  .  paNew = sqlit
25be0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
25bf0 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65  , sizeof(p->aLTe
25c00 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28  rm[0])*n);.  if(
25c10 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75   paNew==0 ) retu
25c20 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
25c30 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c  .  memcpy(paNew,
25c40 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65   p->aLTerm, size
25c50 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  of(p->aLTerm[0])
25c60 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69  *p->nLSlot);.  i
25c70 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d  f( p->aLTerm!=p-
25c80 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73  >aLTermSpace ) s
25c90 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
25ca0 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70   p->aLTerm);.  p
25cb0 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77  ->aLTerm = paNew
25cc0 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20  ;.  p->nLSlot = 
25cd0 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  n;.  return SQLI
25ce0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
25cf0 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74  Transfer content
25d00 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
25d10 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20   pLoop into the 
25d20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  first..*/.static
25d30 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58 66   int whereLoopXf
25d40 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  er(sqlite3 *db, 
25d50 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20  WhereLoop *pTo, 
25d60 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d  WhereLoop *pFrom
25d70 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  ){.  whereLoopCl
25d80 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f  earUnion(db, pTo
25d90 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f  );.  if( whereLo
25da0 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 54 6f  opResize(db, pTo
25db0 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29  , pFrom->nLTerm)
25dc0 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
25dd0 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f  pTo->u, 0, sizeo
25de0 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20  f(pTo->u));.    
25df0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
25e00 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70  MEM;.  }.  memcp
25e10 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48  y(pTo, pFrom, WH
25e20 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a  ERE_LOOP_XFER_SZ
25e30 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d  );.  memcpy(pTo-
25e40 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e  >aLTerm, pFrom->
25e50 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54  aLTerm, pTo->nLT
25e60 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e  erm*sizeof(pTo->
25e70 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69  aLTerm[0]));.  i
25e80 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67  f( pFrom->wsFlag
25e90 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
25ea0 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46  LTABLE ){.    pF
25eb0 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  rom->u.vtab.need
25ec0 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Free = 0;.  }els
25ed0 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73  e if( (pFrom->ws
25ee0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
25ef0 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a  TO_INDEX)!=0 ){.
25f00 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72      pFrom->u.btr
25f10 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
25f20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
25f30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
25f40 44 65 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f  Delete a WhereLo
25f50 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  op object.*/.sta
25f60 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
25f70 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  opDelete(sqlite3
25f80 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
25f90 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  *p){.  whereLoop
25fa0 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20  Clear(db, p);.  
25fb0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
25fc0 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
25fd0 72 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20  ree a WhereInfo 
25fe0 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61  structure.*/.sta
25ff0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e  tic void whereIn
26000 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a  foFree(sqlite3 *
26010 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  db, WhereInfo *p
26020 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c  WInfo){.  if( AL
26030 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a  WAYS(pWInfo) ){.
26040 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 43      whereClauseC
26050 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57  lear(&pWInfo->sW
26060 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  C);.    while( p
26070 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b  WInfo->pLoops ){
26080 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  .      WhereLoop
26090 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c   *p = pWInfo->pL
260a0 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e  oops;.      pWIn
260b0 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e  fo->pLoops = p->
260c0 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20  pNextLoop;.     
260d0 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65   whereLoopDelete
260e0 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  (db, p);.    }. 
260f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
26100 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
26110 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  }.}../*.** Inser
26120 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57  t or replace a W
26130 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75  hereLoop entry u
26140 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74  sing the templat
26150 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a  e supplied..**.*
26160 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68  * An existing Wh
26170 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69  ereLoop entry mi
26180 67 68 74 20 62 65 20 6f 76 65 72 77 72 69 74 74  ght be overwritt
26190 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20 74 65  en if the new te
261a0 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74  mplate.** is bet
261b0 74 65 72 20 61 6e 64 20 68 61 73 20 66 65 77 65  ter and has fewe
261c0 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20  r dependencies. 
261d0 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65   Or the template
261e0 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
261f0 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72  .** and no inser
26200 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20  t will occur if 
26210 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
26220 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20  eLoop is faster 
26230 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72  and has.** fewer
26240 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
26250 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  an the template.
26260 20 20 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65    Otherwise a ne
26270 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a  w WhereLoop is.*
26280 2a 20 61 64 64 65 64 20 62 61 73 65 64 20 6f 6e  * added based on
26290 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a   the template..*
262a0 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72  *.** If pBuilder
262b0 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f 74 20  ->pOrSet is not 
262c0 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 6f 6e 6c  NULL then we onl
262d0 79 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c  y care about onl
262e0 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75  y the.** prerequ
262f0 69 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20  isites and rRun 
26300 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f  and nOut costs o
26310 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f  f the N best loo
26320 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66  ps.  That.** inf
26330 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68  ormation is gath
26340 65 72 65 64 20 69 6e 20 74 68 65 20 70 42 75 69  ered in the pBui
26350 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a  lder->pOrSet obj
26360 65 63 74 2e 20 20 54 68 69 73 20 73 70 65 63 69  ect.  This speci
26370 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  al.** processing
26380 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e   mode is used on
26390 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65  ly for OR clause
263a0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
263b0 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61  ** When accumula
263c0 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f  ting multiple lo
263d0 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64  ops (when pBuild
263e0 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55  er->pOrSet is NU
263f0 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20  LL) we.** still 
26400 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20  might overwrite 
26410 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69  similar loops wi
26420 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c  th the new templ
26430 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 74 65  ate if the.** te
26440 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72  mplate is better
26450 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20  .  Loops may be 
26460 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74  overwritten if t
26470 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  he following .**
26480 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20   conditions are 
26490 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  met:.**.**    (1
264a0 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65  )  They have the
264b0 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20   same iTab..**  
264c0 20 20 28 32 29 20 20 54 68 65 79 20 68 61 76 65    (2)  They have
264d0 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49   the same iSortI
264e0 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54  dx..**    (3)  T
264f0 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20  he template has 
26500 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65  same or fewer de
26510 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20  pendencies than 
26520 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
26530 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65 20  .**    (4)  The 
26540 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65  template has the
26550 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63   same or lower c
26560 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63 75 72  ost than the cur
26570 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20  rent loop.**    
26580 28 35 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (5)  The templat
26590 65 20 75 73 65 73 20 6d 6f 72 65 20 74 65 72 6d  e uses more term
265a0 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 69 6e  s of the same in
265b0 64 65 78 20 62 75 74 20 68 61 73 20 6e 6f 20 61  dex but has no a
265c0 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 20 20 20  dditional.**    
265d0 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65       dependencie
265e0 73 20 20 20 20 20 20 20 20 20 20 0a 2a 2f 0a 73  s          .*/.s
265f0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
26600 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c  oopInsert(WhereL
26610 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
26620 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20  lder, WhereLoop 
26630 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57  *pTemplate){.  W
26640 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65  hereLoop **ppPre
26650 76 2c 20 2a 70 2c 20 2a 70 4e 65 78 74 20 3d 20  v, *p, *pNext = 
26660 30 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  0;.  WhereInfo *
26670 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
26680 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c  r->pWInfo;.  sql
26690 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
266a0 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a  o->pParse->db;..
266b0 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72    /* If pBuilder
266c0 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65 66 69  ->pOrSet is defi
266d0 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b  ned, then only k
266e0 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
266f0 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20   costs.  ** and 
26700 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20  prereqs..  */.  
26710 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  if( pBuilder->pO
26720 72 53 65 74 21 3d 30 20 29 7b 0a 23 69 66 20 57  rSet!=0 ){.#if W
26730 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
26740 44 0a 20 20 20 20 75 31 36 20 6e 20 3d 20 70 42  D.    u16 n = pB
26750 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e  uilder->pOrSet->
26760 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 0a 23  n;.    int x =.#
26770 65 6e 64 69 66 0a 20 20 20 20 77 68 65 72 65 4f  endif.    whereO
26780 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  rInsert(pBuilder
26790 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c  ->pOrSet, pTempl
267a0 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70 54 65  ate->prereq, pTe
267b0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20  mplate->rRun,.  
267c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267e0 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
267f0 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41  t);.#if WHERETRA
26800 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
26810 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
26820 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
26830 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
26840 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d  Printf(x?"   or-
26850 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a  %d:  ":"   or-X:
26860 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20 77    ", n);.      w
26870 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
26880 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d  emplate, pWInfo-
26890 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20  >pTabList);.    
268a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  }.#endif.    ret
268b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
268c0 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
268d0 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
268e0 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 6f 76 65  WhereLoop to ove
268f0 72 77 72 69 74 65 2c 20 6f 72 20 77 68 69 63 68  rwrite, or which
26900 20 74 61 6b 65 73 0a 20 20 2a 2a 20 70 72 69 6f   takes.  ** prio
26910 72 69 74 79 20 6f 76 65 72 20 70 54 65 6d 70 6c  rity over pTempl
26920 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ate..  */.  for(
26930 70 70 50 72 65 76 3d 26 70 57 49 6e 66 6f 2d 3e  ppPrev=&pWInfo->
26940 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70 50 72 65  pLoops, p=*ppPre
26950 76 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d  v; p; ppPrev=&p-
26960 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70  >pNextLoop, p=*p
26970 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20  pPrev){.    if( 
26980 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61  p->iTab!=pTempla
26990 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69  te->iTab || p->i
269a0 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61  SortIdx!=pTempla
269b0 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a  te->iSortIdx ){.
269c0 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68        /* If eith
269d0 65 72 20 74 68 65 20 69 54 61 62 20 6f 72 20 69  er the iTab or i
269e0 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20 66  SortIdx values f
269f0 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70  or two WhereLoop
26a00 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20   are different. 
26a10 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f       ** then tho
26a20 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65  se WhereLoops ne
26a30 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65  ed to be conside
26a40 72 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20  red separately. 
26a50 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20 20   Neither is.    
26a60 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65    ** a candidate
26a70 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20   to replace the 
26a80 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  other. */.      
26a90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
26aa0 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75      /* In the cu
26ab0 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
26ac0 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70  tion, the rSetup
26ad0 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
26ae0 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20   zero.    ** or 
26af0 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c  the cost of buil
26b00 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69  ding an automati
26b10 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20  c index (NlogN) 
26b20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20  and the NlogN.  
26b30 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
26b40 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20   for compatible 
26b50 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20  WhereLoops. */. 
26b60 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
26b70 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70  etup==0 || pTemp
26b80 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20  late->rSetup==0 
26b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26ba0 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d    || p->rSetup==
26bb0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
26bc0 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65  p );..    /* whe
26bd0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29  reLoopAddBtree()
26be0 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65   always generate
26bf0 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68  s and inserts th
26c00 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
26c10 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69  x.    ** case fi
26c20 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70  rst.  Hence comp
26c30 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65  atible candidate
26c40 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65   WhereLoops neve
26c50 72 20 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a  r have a larger.
26c60 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43      ** rSetup. C
26c70 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49  all this SETUP-I
26c80 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20  NVARIANT */.    
26c90 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
26ca0 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p>=pTemplate->rS
26cb0 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 69 66 28  etup );..    if(
26cc0 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
26cd0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
26ce0 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20 20 20 20  ==p->prereq.    
26cf0 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70   && p->rSetup<=p
26d00 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
26d10 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
26d20 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  <=pTemplate->rRu
26d30 6e 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75  n.     && p->nOu
26d40 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  t<=pTemplate->nO
26d50 75 74 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ut.    ){.      
26d60 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 74  /* This branch t
26d70 61 6b 65 6e 20 77 68 65 6e 20 70 20 69 73 20 65  aken when p is e
26d80 71 75 61 6c 20 6f 72 20 62 65 74 74 65 72 20 74  qual or better t
26d90 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 20 69 6e  han pTemplate in
26da0 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f   .      ** all o
26db0 66 20 28 31 29 20 64 65 70 65 6e 64 65 6e 63 69  f (1) dependenci
26dc0 65 73 20 28 32 29 20 73 65 74 75 70 2d 63 6f 73  es (2) setup-cos
26dd0 74 2c 20 28 33 29 20 72 75 6e 2d 63 6f 73 74 2c  t, (3) run-cost,
26de0 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 34   and.      ** (4
26df0 29 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  ) number of outp
26e00 75 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20  ut rows. */.    
26e10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65    assert( p->rSe
26e20 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup==pTemplate->
26e30 72 53 65 74 75 70 20 29 3b 0a 20 20 20 20 20 20  rSetup );.      
26e40 69 66 28 20 70 2d 3e 70 72 65 72 65 71 3d 3d 70  if( p->prereq==p
26e50 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
26e60 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e 6e 4c  .       && p->nL
26e70 54 65 72 6d 3c 70 54 65 6d 70 6c 61 74 65 2d 3e  Term<pTemplate->
26e80 6e 4c 54 65 72 6d 0a 20 20 20 20 20 20 20 26 26  nLTerm.       &&
26e90 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 70   (p->wsFlags & p
26ea0 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67  Template->wsFlag
26eb0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
26ec0 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20  D)!=0.       && 
26ed0 28 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  (p->u.btree.pInd
26ee0 65 78 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 75  ex==pTemplate->u
26ef0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 0a 20 20  .btree.pIndex.  
26f00 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 75           || p->u
26f10 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 6e  .btree.pIndex->n
26f20 43 6f 6c 75 6d 6e 3e 3d 70 54 65 6d 70 6c 61 74  Column>=pTemplat
26f30 65 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  e->u.btree.pInde
26f40 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20  x->nColumn).    
26f50 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
26f60 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78 69  Overwrite an exi
26f70 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
26f80 77 69 74 68 20 61 6e 20 73 69 6d 69 6c 61 72 20  with an similar 
26f90 6f 6e 65 20 74 68 61 74 20 75 73 65 73 0a 20 20  one that uses.  
26fa0 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 65        ** more te
26fb0 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
26fc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 78   */.        pNex
26fd0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  t = p->pNextLoop
26fe0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
26ff0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27000 20 20 20 20 20 20 2f 2a 20 70 54 65 6d 70 6c 61        /* pTempla
27010 74 65 20 69 73 20 6e 6f 74 20 68 65 6c 70 66 75  te is not helpfu
27020 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65  l..        ** Re
27030 74 75 72 6e 20 77 69 74 68 6f 75 74 20 63 68 61  turn without cha
27040 6e 67 69 6e 67 20 6f 72 20 61 64 64 69 6e 67 20  nging or adding 
27050 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20  anything */.    
27060 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f      goto whereLo
27070 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20  opInsert_noop;. 
27080 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
27090 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
270a0 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
270b0 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  req)==pTemplate-
270c0 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26 26 20  >prereq.     && 
270d0 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61  p->rRun>=pTempla
270e0 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 20 26 26  te->rRun.     &&
270f0 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c   p->nOut>=pTempl
27100 61 74 65 2d 3e 6e 4f 75 74 0a 20 20 20 20 29 7b  ate->nOut.    ){
27110 0a 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  .      /* Overwr
27120 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ite an existing 
27130 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61  WhereLoop with a
27140 20 62 65 74 74 65 72 20 6f 6e 65 3a 20 6f 6e 65   better one: one
27150 20 74 68 61 74 20 69 73 0a 20 20 20 20 20 20 2a   that is.      *
27160 2a 20 62 65 74 74 65 72 20 61 74 20 6f 6e 65 20  * better at one 
27170 6f 66 20 28 31 29 20 64 65 70 65 6e 64 65 6e 63  of (1) dependenc
27180 69 65 73 2c 20 28 32 29 20 73 65 74 75 70 2d 63  ies, (2) setup-c
27190 6f 73 74 2c 20 28 33 29 20 72 75 6e 2d 63 6f 73  ost, (3) run-cos
271a0 74 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 28 34  t.      ** or (4
271b0 29 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  ) number of outp
271c0 75 74 20 72 6f 77 73 2c 20 61 6e 64 20 69 73 20  ut rows, and is 
271d0 6e 6f 20 77 6f 72 73 65 20 69 6e 20 61 6e 79 20  no worse in any 
271e0 6f 66 20 74 68 6f 73 65 0a 20 20 20 20 20 20 2a  of those.      *
271f0 2a 20 63 61 74 65 67 6f 72 69 65 73 2e 20 2a 2f  * categories. */
27200 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27210 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c  ->rSetup>=pTempl
27220 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f  ate->rSetup ); /
27230 2a 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e  * SETUP-INVARIAN
27240 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20  T above */.     
27250 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
27260 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 62 72 65  tLoop;.      bre
27270 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
27280 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
27290 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65  this point it me
272a0 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
272b0 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76  p[] should be ov
272c0 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77  erwritten.  ** w
272d0 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20  ith pTemplate[] 
272e0 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f  if p[] exists, o
272f0 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65  r if p==NULL the
27300 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  n allocate a new
27310 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20  .  ** WhereLoop 
27320 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20  and insert it.. 
27330 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41   */.#if WHERETRA
27340 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
27350 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
27360 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
27370 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20  if( p!=0 ){.    
27380 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
27390 69 6e 74 66 28 22 69 6e 73 2d 64 65 6c 3a 20 20  intf("ins-del:  
273a0 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  ");.      whereL
273b0 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 57 49 6e  oopPrint(p, pWIn
273c0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20  fo->pTabList);. 
273d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
273e0 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73  DebugPrintf("ins
273f0 2d 6e 65 77 3a 20 20 22 29 3b 0a 20 20 20 20 77  -new:  ");.    w
27400 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
27410 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d  emplate, pWInfo-
27420 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 7d 0a  >pTabList);.  }.
27430 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d  #endif.  if( p==
27440 30 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  0 ){.    p = sql
27450 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
27460 64 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  db, sizeof(Where
27470 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20  Loop));.    if( 
27480 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
27490 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
274a0 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29  whereLoopInit(p)
274b0 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f  ;.  }.  whereLoo
274c0 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65  pXfer(db, p, pTe
274d0 6d 70 6c 61 74 65 29 3b 0a 20 20 70 2d 3e 70 4e  mplate);.  p->pN
274e0 65 78 74 4c 6f 6f 70 20 3d 20 70 4e 65 78 74 3b  extLoop = pNext;
274f0 0a 20 20 2a 70 70 50 72 65 76 20 3d 20 70 3b 0a  .  *ppPrev = p;.
27500 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
27510 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
27520 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  LTABLE)==0 ){.  
27530 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
27540 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
27550 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  dex;.    if( pIn
27560 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74  dex && pIndex->t
27570 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  num==0 ){.      
27580 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
27590 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
275a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
275b0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
275c0 68 65 72 65 20 69 66 20 74 68 65 20 69 6e 73 65  here if the inse
275d0 72 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f  rt is a no-op */
275e0 0a 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74  .whereLoopInsert
275f0 5f 6e 6f 6f 70 3a 0a 23 69 66 20 57 48 45 52 45  _noop:.#if WHERE
27600 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
27610 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
27620 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
27630 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
27640 72 69 6e 74 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a  rintf("ins-noop:
27650 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f   ");.    whereLo
27660 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
27670 65 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  e, pWInfo->pTabL
27680 69 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ist);.  }.#endif
27690 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
276a0 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
276b0 41 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65  Adjust the Where
276c0 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20  Loop.nOut value 
276d0 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f  downward to acco
276e0 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66  unt for terms of
276f0 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
27700 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65  ause that refere
27710 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74  nce the loop but
27720 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75   which are not u
27730 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64  sed by an.** ind
27740 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ex..**.** In the
27750 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
27760 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 66 69 72  ntation, the fir
27770 73 74 20 65 78 74 72 61 20 57 48 45 52 45 20 63  st extra WHERE c
27780 6c 61 75 73 65 20 74 65 72 6d 20 72 65 64 75 63  lause term reduc
27790 65 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  es.** the number
277a0 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
277b0 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 31  by a factor of 1
277c0 30 20 61 6e 64 20 65 61 63 68 20 61 64 64 69 74  0 and each addit
277d0 69 6f 6e 61 6c 20 74 65 72 6d 0a 2a 2a 20 72 65  ional term.** re
277e0 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
277f0 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
27800 62 79 20 73 71 72 74 28 32 29 2e 0a 2a 2f 0a 73  by sqrt(2)..*/.s
27810 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
27820 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
27830 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
27840 43 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  C, WhereLoop *pL
27850 6f 6f 70 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a  oop, int iCur){.
27860 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
27870 72 6d 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f  rm;.  Bitmask no
27880 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f  tAllowed = ~(pLo
27890 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70  op->prereq|pLoop
278a0 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69  ->maskSelf);.  i
278b0 6e 74 20 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt x = 0;.  int 
278c0 69 3b 0a 0a 20 20 69 66 28 20 21 4f 70 74 69 6d  i;..  if( !Optim
278d0 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
278e0 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
278f0 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 41  se->db, SQLITE_A
27900 64 6a 75 73 74 4f 75 74 45 73 74 29 20 29 7b 0a  djustOutEst) ){.
27910 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
27920 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
27930 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  rm, pTerm=pWC->a
27940 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72  ; i>0; i--, pTer
27950 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  m++){.    if( (p
27960 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
27970 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30  TERM_VIRTUAL)!=0
27980 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
27990 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
279a0 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e  reqAll & pLoop->
279b0 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63  maskSelf)==0 ) c
279c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
279d0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
279e0 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29  ll & notAllowed)
279f0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
27a00 20 20 20 20 78 20 2b 3d 20 70 54 65 72 6d 2d 3e      x += pTerm->
27a10 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 7d 0a 20  truthProb;.  }. 
27a20 20 66 6f 72 28 69 3d 70 4c 6f 6f 70 2d 3e 6e 4c   for(i=pLoop->nL
27a30 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
27a40 2d 29 7b 0a 20 20 20 20 78 20 2d 3d 20 70 4c 6f  -){.    x -= pLo
27a50 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 74  op->aLTerm[i]->t
27a60 72 75 74 68 50 72 6f 62 3b 0a 20 20 7d 0a 20 20  ruthProb;.  }.  
27a70 69 66 28 20 78 3c 30 20 29 20 70 4c 6f 6f 70 2d  if( x<0 ) pLoop-
27a80 3e 6e 4f 75 74 20 2b 3d 20 78 3b 0a 7d 0a 0a 2f  >nOut += x;.}../
27a90 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20  *.** We have so 
27aa0 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75 69  far matched pBui
27ab0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
27ac0 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66  ree.nEq terms of
27ad0 20 74 68 65 20 69 6e 64 65 78 20 70 49 6e 64 65   the index pInde
27ae0 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 61 74  x..** Try to mat
27af0 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a  ch one more..**.
27b00 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e  ** If pProbe->tn
27b10 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e  um==0, that mean
27b20 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66 61  s pIndex is a fa
27b30 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66 6f  ke index used fo
27b40 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  r the.** INTEGER
27b50 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f   PRIMARY KEY..*/
27b60 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
27b70 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
27b80 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ex(.  WhereLoopB
27b90 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
27ba0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ,     /* The Whe
27bb0 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a  reLoop factory *
27bc0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
27bd0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
27be0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
27bf0 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e  se term being an
27c00 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65  alyzed */.  Inde
27c10 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20 20  x *pProbe,      
27c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
27c30 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63 20  n index on pSrc 
27c40 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e  */.  WhereCost n
27c50 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20  InMul           
27c60 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62       /* log(Numb
27c70 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
27c80 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29   due to IN) */.)
27c90 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
27ca0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
27cb0 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48  ->pWInfo;  /* WH
27cc0 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74  ERE analyse cont
27cd0 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
27ce0 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
27cf0 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  >pParse;        
27d00 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
27d10 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
27d20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
27d30 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
27d40 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  ase connection m
27d50 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f  alloc context */
27d60 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
27d70 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
27d80 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57     /* Template W
27d90 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63  hereLoop under c
27da0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
27db0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
27dc0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
27dd0 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20   /* A WhereTerm 
27de0 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74  under considerat
27df0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d  ion */.  int opM
27e00 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
27e10 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69           /* Vali
27e20 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20  d operators for 
27e30 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
27e40 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b   WhereScan scan;
27e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e60 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
27e70 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a   WHERE terms */.
27e80 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64 5f    Bitmask saved_
27e90 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20 20  prereq;         
27ea0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
27eb0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65  lue of pNew->pre
27ec0 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  req */.  u16 sav
27ed0 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20  ed_nLTerm;      
27ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
27ef0 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
27f00 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20  ew->nLTerm */.  
27f10 69 6e 74 20 73 61 76 65 64 5f 6e 45 71 3b 20 20  int saved_nEq;  
27f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f30 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
27f40 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72  e of pNew->u.btr
27f50 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 33 32 20  ee.nEq */.  u32 
27f60 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20  saved_wsFlags;  
27f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
27f80 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
27f90 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a   pNew->wsFlags *
27fa0 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 73 61  /.  WhereCost sa
27fb0 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20  ved_nOut;       
27fc0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
27fd0 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
27fe0 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  Out */.  int iCo
27ff0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
28000 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
28010 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
28020 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
28030 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28040 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
28050 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
28060 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
28070 6e 52 6f 77 45 73 74 3b 20 20 20 20 20 20 20 20  nRowEst;        
28080 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74        /* Estimat
28090 65 64 20 69 6e 64 65 78 20 73 65 6c 65 63 74 69  ed index selecti
280a0 76 69 74 79 20 2a 2f 0a 20 20 57 68 65 72 65 43  vity */.  WhereC
280b0 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  ost rLogSize;   
280c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
280d0 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20  arithm of table 
280e0 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  size */.  WhereT
280f0 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a  erm *pTop = 0, *
28100 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70  pBtm = 0; /* Top
28110 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67   and bottom rang
28120 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
28130 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ..  pNew = pBuil
28140 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28  der->pNew;.  if(
28150 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
28160 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
28170 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65  E_NOMEM;..  asse
28180 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
28190 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
281a0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20  ALTABLE)==0 );. 
281b0 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
281c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
281d0 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b  TOP_LIMIT)==0 );
281e0 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46  .  if( pNew->wsF
281f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
28200 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70  _LIMIT ){.    op
28210 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f  Mask = WO_LT|WO_
28220 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
28230 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
28240 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79  || (pSrc->jointy
28250 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
28260 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   ){.    opMask =
28270 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
28280 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
28290 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  O_LE;.  }else{. 
282a0 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
282b0 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c  Q|WO_IN|WO_ISNUL
282c0 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  L|WO_GT|WO_GE|WO
282d0 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20  _LT|WO_LE;.  }. 
282e0 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e   if( pProbe->bUn
282f0 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b  ordered ) opMask
28300 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47   &= ~(WO_GT|WO_G
28310 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a  E|WO_LT|WO_LE);.
28320 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
28330 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50  >u.btree.nEq<=pP
28340 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  robe->nColumn );
28350 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 62  .  if( pNew->u.b
28360 74 72 65 65 2e 6e 45 71 20 3c 20 70 50 72 6f 62  tree.nEq < pProb
28370 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  e->nColumn ){.  
28380 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d    iCol = pProbe-
28390 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e  >aiColumn[pNew->
283a0 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 20 20  u.btree.nEq];.  
283b0 20 20 6e 52 6f 77 45 73 74 20 3d 20 77 68 65 72    nRowEst = wher
283c0 65 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e 61 69  eCost(pProbe->ai
283d0 52 6f 77 45 73 74 5b 70 4e 65 77 2d 3e 75 2e 62  RowEst[pNew->u.b
283e0 74 72 65 65 2e 6e 45 71 2b 31 5d 29 3b 0a 20 20  tree.nEq+1]);.  
283f0 20 20 69 66 28 20 6e 52 6f 77 45 73 74 3d 3d 30    if( nRowEst==0
28400 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72   && pProbe->onEr
28410 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 6e  ror==OE_None ) n
28420 52 6f 77 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65  RowEst = 1;.  }e
28430 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  lse{.    iCol = 
28440 2d 31 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  -1;.    nRowEst 
28450 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 0;.  }.  pTerm
28460 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74   = whereScanInit
28470 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72  (&scan, pBuilder
28480 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75  ->pWC, pSrc->iCu
28490 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20  rsor, iCol,.    
284a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284b0 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f      opMask, pPro
284c0 62 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45 71  be);.  saved_nEq
284d0 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   = pNew->u.btree
284e0 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4c  .nEq;.  saved_nL
284f0 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54  Term = pNew->nLT
28500 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46  erm;.  saved_wsF
28510 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46  lags = pNew->wsF
28520 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72  lags;.  saved_pr
28530 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65  ereq = pNew->pre
28540 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75  req;.  saved_nOu
28550 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a  t = pNew->nOut;.
28560 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
28570 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d   0;.  rLogSize =
28580 20 65 73 74 4c 6f 67 28 77 68 65 72 65 43 6f 73   estLog(whereCos
28590 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45  t(pProbe->aiRowE
285a0 73 74 5b 30 5d 29 29 3b 0a 20 20 66 6f 72 28 3b  st[0]));.  for(;
285b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
285c0 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72  & pTerm!=0; pTer
285d0 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  m = whereScanNex
285e0 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 69  t(&scan)){.    i
285f0 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64  nt nIn = 0;.#ifd
28600 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
28610 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
28620 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69      int nRecVali
28630 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
28640 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a  ecValid;.#endif.
28650 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
28660 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53  eOperator==WO_IS
28670 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e  NULL || (pTerm->
28680 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55  wtFlags&TERM_VNU
28690 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  LL)!=0).     && 
286a0 28 69 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63 2d  (iCol<0 || pSrc-
286b0 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  >pTab->aCol[iCol
286c0 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20 29  ].notNull).    )
286d0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
286e0 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b  ; /* ignore IS [
286f0 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  NOT] NULL constr
28700 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c  aints on NOT NUL
28710 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  L columns */.   
28720 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d   }.    if( pTerm
28730 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
28740 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
28750 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
28760 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
28770 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
28780 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  ;..    pNew->wsF
28790 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
287a0 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lags;.    pNew->
287b0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
287c0 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65  ved_nEq;.    pNe
287d0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
287e0 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66  d_nLTerm;.    if
287f0 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
28800 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
28810 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72  ->nLTerm+1) ) br
28820 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20  eak; /* OOM */. 
28830 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
28840 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
28850 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65  = pTerm;.    pNe
28860 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76  w->prereq = (sav
28870 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72  ed_prereq | pTer
28880 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20  m->prereqRight) 
28890 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  & ~pNew->maskSel
288a0 66 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  f;.    pNew->rRu
288b0 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 3b 20 2f 2a  n = rLogSize; /*
288c0 20 42 61 73 65 6c 69 6e 65 20 63 6f 73 74 20 69   Baseline cost i
288d0 73 20 6c 6f 67 32 28 4e 29 2e 20 20 41 64 6a 75  s log2(N).  Adju
288e0 73 74 6d 65 6e 74 73 20 62 65 6c 6f 77 20 2a 2f  stments below */
288f0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
28900 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
28910 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N ){.      Expr 
28920 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
28930 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
28940 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
28950 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
28960 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
28970 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
28980 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
28990 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
289a0 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a  N (SELECT ...)":
289b0 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45    TUNING: the SE
289c0 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20  LECT returns 25 
289d0 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rows */.        
289e0 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72  nIn = 46;  asser
289f0 74 28 20 34 36 3d 3d 77 68 65 72 65 43 6f 73 74  t( 46==whereCost
28a00 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d 65  (25) );.      }e
28a10 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
28a20 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26  Expr->x.pList &&
28a30 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
28a40 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
28a50 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c     /* "x IN (val
28a60 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22  ue, value, ...)"
28a70 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
28a80 3d 20 77 68 65 72 65 43 6f 73 74 28 70 45 78 70  = whereCost(pExp
28a90 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
28aa0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
28ab0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20    pNew->rRun += 
28ac0 6e 49 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  nIn;.      pNew-
28ad0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
28ae0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
28af0 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e   = nRowEst + nIn
28b00 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d  Mul + nIn;.    }
28b10 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
28b20 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
28b30 45 51 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  EQ) ){.      ass
28b40 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c  ert( (pNew->wsFl
28b50 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
28b60 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43  UMN_NULL|WHERE_C
28b70 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 30 0a 20 20  OLUMN_IN))!=0.  
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b90 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30 20 29 3b 0a  || nInMul==0 );.
28ba0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
28bb0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
28bc0 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66  UMN_EQ;.      if
28bd0 28 20 69 43 6f 6c 3c 30 20 20 0a 20 20 20 20 20  ( iCol<0  .     
28be0 20 20 7c 7c 20 28 70 50 72 6f 62 65 2d 3e 6f 6e    || (pProbe->on
28bf0 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26  Error!=OE_None &
28c00 26 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20  & nInMul==0.    
28c10 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e         && pNew->
28c20 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50 72  u.btree.nEq==pPr
28c30 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 29 0a  obe->nColumn-1).
28c40 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
28c50 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
28c60 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28c70 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 7c 7c  COLUMN_IN)==0 ||
28c80 20 69 43 6f 6c 3c 30 20 29 3b 0a 20 20 20 20 20   iCol<0 );.     
28c90 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
28ca0 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57   |= WHERE_ONEROW
28cb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28cc0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28cd0 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  q++;.      pNew-
28ce0 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20  >nOut = nRowEst 
28cf0 2b 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20 7d 65  + nInMul;.    }e
28d00 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  lse if( pTerm->e
28d10 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
28d20 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  SNULL) ){.      
28d30 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
28d40 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
28d50 4c 4c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  LL;.      pNew->
28d60 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20  u.btree.nEq++;. 
28d70 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
28d80 49 53 20 4e 55 4c 4c 20 73 65 6c 65 63 74 73 20  IS NULL selects 
28d90 32 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  2 rows */.      
28da0 6e 49 6e 20 3d 20 31 30 3b 20 20 61 73 73 65 72  nIn = 10;  asser
28db0 74 28 20 31 30 3d 3d 77 68 65 72 65 43 6f 73 74  t( 10==whereCost
28dc0 28 32 29 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  (2) );.      pNe
28dd0 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73  w->nOut = nRowEs
28de0 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e  t + nInMul + nIn
28df0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
28e00 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
28e10 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
28e20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
28e30 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
28e40 61 74 6f 72 20 26 20 57 4f 5f 47 54 20 29 3b 0a  ator & WO_GT );.
28e50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28e60 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
28e70 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
28e80 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
28e90 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
28ea0 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f  RANGE|WHERE_BTM_
28eb0 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 42 74  LIMIT;.      pBt
28ec0 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  m = pTerm;.     
28ed0 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d   pTop = 0;.    }
28ee0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
28ef0 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
28f00 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ator & (WO_LT|WO
28f10 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65  _LE) );.      te
28f20 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
28f30 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 54  Operator & WO_LT
28f40 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28f50 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
28f60 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a  ator & WO_LE );.
28f70 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
28f80 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
28f90 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
28fa0 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
28fb0 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20   pTop = pTerm;. 
28fc0 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65       pBtm = (pNe
28fd0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
28fe0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30  RE_BTM_LIMIT)!=0
28ff0 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
29000 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c          pNew->aL
29010 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
29020 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a  m-2] : 0;.    }.
29030 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
29040 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
29050 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
29060 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f      /* Adjust nO
29070 75 74 20 61 6e 64 20 72 52 75 6e 20 66 6f 72 20  ut and rRun for 
29080 53 54 41 54 33 20 72 61 6e 67 65 20 76 61 6c 75  STAT3 range valu
29090 65 73 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  es */.      asse
290a0 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
290b0 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20  saved_nOut );.  
290c0 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63      whereRangeSc
290d0 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
290e0 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54  uilder, pBtm, pT
290f0 6f 70 2c 20 26 70 4e 65 77 2d 3e 6e 4f 75 74 29  op, &pNew->nOut)
29100 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
29110 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
29120 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
29130 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20  if( nInMul==0 . 
29140 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e      && pProbe->n
29150 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 26 26 20  Sample .     && 
29160 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
29170 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70  q<=pProbe->nSamp
29180 6c 65 43 6f 6c 0a 20 20 20 20 20 26 26 20 4f 70  leCol.     && Op
29190 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
291a0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61  d(db, SQLITE_Sta
291b0 74 33 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  t3) .    ){.    
291c0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
291d0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
291e0 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74      tRowcnt nOut
291f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
29200 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
29210 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
29220 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20  NULL))!=0 ){.   
29230 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
29240 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
29250 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
29260 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
29270 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
29280 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
29290 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45       rc = whereE
292a0 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
292b0 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45  se, pBuilder, pE
292c0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f  xpr->pRight, &nO
292d0 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ut);.      }else
292e0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
292f0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 0a  erator & WO_IN).
29300 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
29310 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
29320 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
29330 65 6c 65 63 74 29 20 20 29 7b 0a 20 20 20 20 20  elect)  ){.     
29340 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53     rc = whereInS
29350 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
29360 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e  Builder, pExpr->
29370 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b  x.pList, &nOut);
29380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
29390 73 73 65 72 74 28 20 6e 4f 75 74 3d 3d 30 20 7c  ssert( nOut==0 |
293a0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
293b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 75  );.      if( nOu
293c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 75  t ){.        nOu
293d0 74 20 3d 20 77 68 65 72 65 43 6f 73 74 28 6e 4f  t = whereCost(nO
293e0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ut);.        pNe
293f0 77 2d 3e 6e 4f 75 74 20 3d 20 4d 49 4e 28 6e 4f  w->nOut = MIN(nO
29400 75 74 2c 20 73 61 76 65 64 5f 6e 4f 75 74 29 3b  ut, saved_nOut);
29410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
29420 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70  endif.    if( (p
29430 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
29440 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
29450 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b  HERE_IPK))==0 ){
29460 0a 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 72  .      /* Each r
29470 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61 20 73 74  ow involves a st
29480 65 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ep of the index,
29490 20 74 68 65 6e 20 61 20 62 69 6e 61 72 79 20 73   then a binary s
294a0 65 61 72 63 68 20 6f 66 0a 20 20 20 20 20 20 2a  earch of.      *
294b0 2a 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  * the main table
294c0 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
294d0 72 52 75 6e 20 3d 20 20 77 68 65 72 65 43 6f 73  rRun =  whereCos
294e0 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
294f0 20 72 4c 6f 67 53 69 7a 65 3e 32 37 20 3f 20 72   rLogSize>27 ? r
29500 4c 6f 67 53 69 7a 65 2d 31 37 20 3a 20 31 30 29  LogSize-17 : 10)
29510 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 53  ;.    }.    /* S
29520 74 65 70 20 63 6f 73 74 20 66 6f 72 20 65 61 63  tep cost for eac
29530 68 20 6f 75 74 70 75 74 20 72 6f 77 20 2a 2f 0a  h output row */.
29540 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
29550 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 70 4e   whereCostAdd(pN
29560 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e  ew->rRun, pNew->
29570 6e 4f 75 74 29 3b 0a 20 20 20 20 77 68 65 72 65  nOut);.    where
29580 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
29590 28 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20  (pBuilder->pWC, 
295a0 70 4e 65 77 2c 20 70 53 72 63 2d 3e 69 43 75 72  pNew, pSrc->iCur
295b0 73 6f 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  sor);.    rc = w
295c0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
295d0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
295e0 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77      if( (pNew->w
295f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
29600 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20  OP_LIMIT)==0.   
29610 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
29620 65 65 2e 6e 45 71 3c 28 70 50 72 6f 62 65 2d 3e  ee.nEq<(pProbe->
29630 6e 43 6f 6c 75 6d 6e 20 2b 20 28 70 50 72 6f 62  nColumn + (pProb
29640 65 2d 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a 20 20  e->zName!=0)).  
29650 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65    ){.      where
29660 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
29670 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
29680 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c  , pProbe, nInMul
29690 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  +nIn);.    }.   
296a0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
296b0 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66  ved_nOut;.#ifdef
296c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
296d0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
296e0 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
296f0 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69  Valid = nRecVali
29700 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  d;.#endif.  }.  
29710 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
29720 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70  aved_prereq;.  p
29730 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
29740 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
29750 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
29760 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
29770 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
29780 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ved_nOut;.  pNew
29790 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
297a0 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75 72  _nLTerm;.  retur
297b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
297c0 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74  eturn True if it
297d0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
297e0 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62  t pIndex might b
297f0 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69  e useful in.** i
29800 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  mplementing the 
29810 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
29820 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a  in pBuilder..**.
29830 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20  ** Return False 
29840 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73  if pBuilder does
29850 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20   not contain an 
29860 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
29870 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  or.** if there i
29880 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e  s no way for pIn
29890 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c  dex to be useful
298a0 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   in implementing
298b0 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42   that.** ORDER B
298c0 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61  Y clause..*/.sta
298d0 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67  tic int indexMig
298e0 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42  htHelpWithOrderB
298f0 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  y(.  WhereLoopBu
29900 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
29910 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
29920 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a  ,.  int iCursor.
29930 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
29940 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a  OB;.  int ii, jj
29950 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d  ;..  if( pIndex-
29960 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65  >bUnordered ) re
29970 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
29980 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  OB = pBuilder->p
29990 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29  WInfo->pOrderBy)
299a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
299b0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
299c0 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  OB->nExpr; ii++)
299d0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
299e0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
299f0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e  kipCollate(pOB->
29a00 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  a[ii].pExpr);.  
29a10 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
29a20 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
29a30 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
29a40 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43  Expr->iTable==iC
29a50 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 66  ursor ){.      f
29a60 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
29a70 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 6a 2b  ex->nColumn; jj+
29a80 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
29a90 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
29aa0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
29ab0 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b  [jj] ) return 1;
29ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29ad0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
29ae0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
29af0 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31   bitmask where 1
29b00 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
29b10 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
29b20 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  g column of.** t
29b30 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64  he table is used
29b40 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f   by an index.  O
29b50 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33  nly the first 63
29b60 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e   columns are con
29b70 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  sidered..*/.stat
29b80 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d  ic Bitmask colum
29b90 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20  nsInIndex(Index 
29ba0 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73  *pIdx){.  Bitmas
29bb0 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  k m = 0;.  int j
29bc0 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e  ;.  for(j=pIdx->
29bd0 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b  nColumn-1; j>=0;
29be0 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78   j--){.    int x
29bf0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
29c00 6e 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  n[j];.    assert
29c10 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 74 65  ( x>=0 );.    te
29c20 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31  stcase( x==BMS-1
29c30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
29c40 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  ( x==BMS-2 );.  
29c50 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20    if( x<BMS-1 ) 
29c60 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b  m |= MASKBIT(x);
29c70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
29c80 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
29c90 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
29ca0 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
29cb0 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
29cc0 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
29cd0 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
29ce0 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
29cf0 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
29d00 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
29d10 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
29d20 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
29d30 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
29d40 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
29d50 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
29d60 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
29d70 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f 72  rm *pTerm;.  for
29d80 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  (i=0, pTerm=pWC-
29d90 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
29da0 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
29db0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
29dc0 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
29dd0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70 57  pTerm->pExpr, pW
29de0 68 65 72 65 2c 20 69 54 61 62 29 20 29 20 72 65  here, iTab) ) re
29df0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
29e00 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
29e10 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
29e20 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
29e30 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66   single table of
29e40 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20   the join where 
29e50 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  the table.** is 
29e60 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69  idenfied by pBui
29e70 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
29e80 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
29e90 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
29ea0 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61  e.** a b-tree ta
29eb0 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75  ble, not a virtu
29ec0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
29ed0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
29ee0 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65  pAddBtree(.  Whe
29ef0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
29f00 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52  Builder, /* WHER
29f10 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
29f20 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
29f30 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20  k mExtra        
29f40 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
29f50 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72  rerequesites for
29f60 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c   using this tabl
29f70 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
29f80 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
29f90 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
29fa0 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
29fb0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
29fc0 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
29fd0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
29fe0 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
29ff0 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20  /.  Index sPk;  
2a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a010 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20  /* A fake index 
2a020 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70  object for the p
2a030 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
2a040 74 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73 74  tRowcnt aiRowEst
2a050 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54  Pk[2];      /* T
2a060 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61  he aiRowEst[] va
2a070 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
2a080 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61  index */.  int a
2a090 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20  iColumnPk = -1; 
2a0a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43         /* The aC
2a0b0 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f  olumn[] value fo
2a0c0 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
2a0d0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
2a0e0 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
2a0f0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
2a100 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
2a110 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
2a120 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc;  /* The FROM
2a130 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65   clause btree te
2a140 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57  rm to add */.  W
2a150 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
2a160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
2a170 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
2a180 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
2a190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a1a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2a1b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2a1c0 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20   iSortIdx = 1;  
2a1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2a1e0 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  x number */.  in
2a1f0 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  t b;            
2a200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62            /* A b
2a210 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a  oolean value */.
2a220 20 20 57 68 65 72 65 43 6f 73 74 20 72 53 69 7a    WhereCost rSiz
2a230 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2a240 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
2a250 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
2a260 20 20 57 68 65 72 65 43 6f 73 74 20 72 4c 6f 67    WhereCost rLog
2a270 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Size;         /*
2a280 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   Logarithm of th
2a290 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
2a2a0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
2a2b0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2a2c0 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pWC;           /
2a2d0 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45  * The parsed WHE
2a2e0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 0a  RE clause */.  .
2a2f0 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
2a300 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66  r->pNew;.  pWInf
2a310 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
2a320 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74  Info;.  pTabList
2a330 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2a340 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70 54  ist;.  pSrc = pT
2a350 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77  abList->a + pNew
2a360 2d 3e 69 54 61 62 3b 0a 20 20 70 57 43 20 3d 20  ->iTab;.  pWC = 
2a370 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
2a380 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74   assert( !IsVirt
2a390 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20  ual(pSrc->pTab) 
2a3a0 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  );..  if( pSrc->
2a3b0 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  pIndex ){.    /*
2a3c0 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
2a3d0 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
2a3e0 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
2a3f0 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
2a400 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
2a410 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b  pIndex;.  }else{
2a420 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73  .    /* There is
2a430 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63   no INDEXED BY c
2a440 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61  lause.  Create a
2a450 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65   fake Index obje
2a460 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20  ct in local.    
2a470 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20  ** variable sPk 
2a480 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  to represent the
2a490 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b   rowid primary k
2a4a0 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  ey index.  Make 
2a4b0 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65  this.    ** fake
2a4c0 20 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74   index the first
2a4d0 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49   in a chain of I
2a4e0 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74  ndex objects wit
2a4f0 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61  h all of the rea
2a500 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73  l.    ** indices
2a510 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20   to follow */.  
2a520 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b    Index *pFirst;
2a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a540 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65    /* First of re
2a550 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  al indices on th
2a560 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d  e table */.    m
2a570 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73  emset(&sPk, 0, s
2a580 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20  izeof(Index));. 
2a590 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d     sPk.nColumn =
2a5a0 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f   1;.    sPk.aiCo
2a5b0 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e  lumn = &aiColumn
2a5c0 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f  Pk;.    sPk.aiRo
2a5d0 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50  wEst = aiRowEstP
2a5e0 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72  k;.    sPk.onErr
2a5f0 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  or = OE_Replace;
2a600 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20  .    sPk.pTable 
2a610 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
2a620 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20    aiRowEstPk[0] 
2a630 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52  = pSrc->pTab->nR
2a640 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77  owEst;.    aiRow
2a650 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20  EstPk[1] = 1;.  
2a660 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d    pFirst = pSrc-
2a670 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
2a680 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74     if( pSrc->not
2a690 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20  Indexed==0 ){.  
2a6a0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20      /* The real 
2a6b0 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74  indices of the t
2a6c0 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f  able are only co
2a6d0 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a  nsidered if the.
2a6e0 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44        ** NOT IND
2a6f0 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69  EXED qualifier i
2a700 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  s omitted from t
2a710 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
2a720 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78  /.      sPk.pNex
2a730 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20  t = pFirst;.    
2a740 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26  }.    pProbe = &
2a750 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65  sPk;.  }.  rSize
2a760 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70 53 72   = whereCost(pSr
2a770 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  c->pTab->nRowEst
2a780 29 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  );.  rLogSize = 
2a790 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a  estLog(rSize);..
2a7a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a7b0 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
2a7c0 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74  DEX.  /* Automat
2a7d0 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  ic indexes */.  
2a7e0 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70  if( !pBuilder->p
2a7f0 4f 72 53 65 74 0a 20 20 20 26 26 20 28 70 57 49  OrSet.   && (pWI
2a800 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  nfo->pParse->db-
2a810 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2a820 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20  AutoIndex)!=0.  
2a830 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65 78   && pSrc->pIndex
2a840 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63 2d  ==0.   && !pSrc-
2a850 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20  >viaCoroutine.  
2a860 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e   && !pSrc->notIn
2a870 64 65 78 65 64 0a 20 20 20 26 26 20 21 70 53 72  dexed.   && !pSr
2a880 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 0a  c->isCorrelated.
2a890 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65    ){.    /* Gene
2a8a0 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20  rate auto-index 
2a8b0 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20  WhereLoops */.  
2a8c0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2a8d0 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  rm;.    WhereTer
2a8e0 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d  m *pWCEnd = pWC-
2a8f0 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b  >a + pWC->nTerm;
2a900 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
2a910 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54  WC->a; rc==SQLIT
2a920 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57  E_OK && pTerm<pW
2a930 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
2a940 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
2a950 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
2a960 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
2a970 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2a980 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
2a990 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
2a9a0 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 0) ){.       
2a9b0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
2a9c0 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  Eq = 1;.        
2a9d0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
2a9e0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
2a9f0 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2aa00 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
2aa10 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
2aa20 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  erm;.        /* 
2aa30 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65  TUNING: One-time
2aa40 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74   cost for comput
2aa50 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ing the automati
2aa60 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20  c index is.     
2aa70 20 20 20 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74     ** approximat
2aa80 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32 28 4e 29 20  ely 7*N*log2(N) 
2aa90 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
2aaa0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
2aab0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2aac0 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
2aad0 78 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  xed. */.        
2aae0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72  pNew->rSetup = r
2aaf0 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20  LogSize + rSize 
2ab00 2b 20 32 38 3b 20 20 61 73 73 65 72 74 28 20 32  + 28;  assert( 2
2ab10 38 3d 3d 77 68 65 72 65 43 6f 73 74 28 37 29 20  8==whereCost(7) 
2ab20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  );.        /* TU
2ab30 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78  NING: Each index
2ab40 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32   lookup yields 2
2ab50 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  0 rows in the ta
2ab60 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20  ble.  This.     
2ab70 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68     ** is more th
2ab80 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65  an the usual gue
2ab90 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73  ss of 10 rows, s
2aba0 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20  ince we have no 
2abb0 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  way.        ** o
2abc0 66 20 6b 6e 6f 77 6e 69 6e 67 20 68 6f 77 20 73  f knowning how s
2abd0 65 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64  elective the ind
2abe0 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65  ex will ultimate
2abf0 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64  ly be.  It would
2ac00 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
2ac10 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  be unreasonable 
2ac20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c  to make this val
2ac30 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20  ue much larger. 
2ac40 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
2ac50 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73  >nOut = 43;  ass
2ac60 65 72 74 28 20 34 33 3d 3d 77 68 65 72 65 43 6f  ert( 43==whereCo
2ac70 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20  st(20) );.      
2ac80 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77    pNew->rRun = w
2ac90 68 65 72 65 43 6f 73 74 41 64 64 28 72 4c 6f 67  hereCostAdd(rLog
2aca0 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29  Size,pNew->nOut)
2acb0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2acc0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
2acd0 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20  AUTO_INDEX;.    
2ace0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2acf0 20 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72   = mExtra | pTer
2ad00 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
2ad10 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
2ad20 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2ad30 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2ad40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2ad50 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2ad60 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
2ad70 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c  INDEX */..  /* L
2ad80 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
2ad90 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ices.  */.  for(
2ada0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
2adb0 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62  && pProbe; pProb
2adc0 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c  e=pProbe->pNext,
2add0 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20   iSortIdx++){.  
2ade0 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50    if( pProbe->pP
2adf0 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20  artIdxWhere!=0. 
2ae00 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61      && !whereUsa
2ae10 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
2ae20 70 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c  pNew->iTab, pWC,
2ae30 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
2ae40 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20  xWhere) ){.     
2ae50 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50   continue;  /* P
2ae60 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61  artial index ina
2ae70 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
2ae80 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  his query */.   
2ae90 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62   }.    pNew->u.b
2aea0 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20  tree.nEq = 0;.  
2aeb0 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2aec0 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53   0;.    pNew->iS
2aed0 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
2aee0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
2aef0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
2af00 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20  eq = mExtra;.   
2af10 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
2af20 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ize;.    pNew->u
2af30 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
2af40 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20  pProbe;.    b = 
2af50 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
2af60 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64  thOrderBy(pBuild
2af70 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63  er, pProbe, pSrc
2af80 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2af90 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44  /* The ONEPASS_D
2afa0 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76  ESIRED flags nev
2afb0 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68  er occurs togeth
2afc0 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59  er with ORDER BY
2afd0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2afe0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2aff0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2b000 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
2b010 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69  || b==0 );.    i
2b020 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c  f( pProbe->tnum<
2b030 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
2b040 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
2b050 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ey index */.    
2b060 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2b070 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20  = WHERE_IPK;..  
2b080 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c      /* Full tabl
2b090 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  e scan */.      
2b0a0 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
2b0b0 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
2b0c0 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  0;.      /* TUNI
2b0d0 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c  NG: Cost of full
2b0e0 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 33   table scan is 3
2b0f0 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a  *(N + log2(N))..
2b100 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65        **  +  The
2b110 20 65 78 74 72 61 20 33 20 66 61 63 74 6f 72 20   extra 3 factor 
2b120 69 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20  is to encourage 
2b130 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78  the use of index
2b140 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20  ed lookups.     
2b150 20 2a 2a 20 20 20 20 20 6f 76 65 72 20 66 75 6c   **     over ful
2b160 6c 20 73 63 61 6e 73 2e 20 20 41 20 73 6d 61 6c  l scans.  A smal
2b170 6c 65 72 20 63 6f 6e 73 74 61 6e 74 20 32 20 69  ler constant 2 i
2b180 73 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72  s used for cover
2b190 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ing.      **    
2b1a0 20 69 6e 64 65 78 20 73 63 61 6e 73 20 73 6f 20   index scans so 
2b1b0 74 68 61 74 20 61 20 63 6f 76 65 72 69 6e 67 20  that a covering 
2b1c0 69 6e 64 65 78 20 73 63 61 6e 20 77 69 6c 6c 20  index scan will 
2b1d0 62 65 20 66 61 76 6f 72 65 64 20 6f 76 65 72 0a  be favored over.
2b1e0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 61 20 74        **     a t
2b1f0 61 62 6c 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  able scan. */.  
2b200 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2b210 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 53   whereCostAdd(rS
2b220 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b 20  ize,rLogSize) + 
2b230 31 36 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  16;.      whereL
2b240 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
2b250 70 57 43 2c 20 70 4e 65 77 2c 20 70 53 72 63 2d  pWC, pNew, pSrc-
2b260 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2b270 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
2b280 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
2b290 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65  pNew);.      pNe
2b2a0 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
2b2b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2b2c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
2b2d0 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
2b2e0 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
2b2f0 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
2b300 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20  dex(pProbe);.   
2b310 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2b320 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45   = (m==0) ? (WHE
2b330 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52  RE_IDX_ONLY|WHER
2b340 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45  E_INDEXED) : WHE
2b350 52 45 5f 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20  RE_INDEXED;..   
2b360 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20     /* Full scan 
2b370 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  via index */.   
2b380 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20     if( b.       
2b390 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20  || ( m==0.      
2b3a0 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55     && pProbe->bU
2b3b0 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20  nordered==0.    
2b3c0 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
2b3d0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2b3e0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
2b3f0 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  RED)==0.        
2b400 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
2b410 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a  lConfig.bUseCis.
2b420 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
2b430 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
2b440 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
2b450 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72  db, SQLITE_Cover
2b460 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20  IdxScan).       
2b470 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20     ).      ){.  
2b480 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
2b490 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
2b4a0 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  Idx : 0;.       
2b4b0 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20   if( m==0 ){.   
2b4c0 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
2b4d0 3a 20 43 6f 73 74 20 6f 66 20 61 20 63 6f 76 65  : Cost of a cove
2b4e0 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20  ring index scan 
2b4f0 69 73 20 32 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e  is 2*(N + log2(N
2b500 29 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ))..          **
2b510 20 20 2b 20 20 54 68 65 20 65 78 74 72 61 20 32    +  The extra 2
2b520 20 66 61 63 74 6f 72 20 69 73 20 74 6f 20 65 6e   factor is to en
2b530 63 6f 75 72 61 67 65 20 74 68 65 20 75 73 65 20  courage the use 
2b540 6f 66 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75  of indexed looku
2b550 70 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ps.          ** 
2b560 20 20 20 20 6f 76 65 72 20 69 6e 64 65 78 20 73      over index s
2b570 63 61 6e 73 2e 20 20 41 20 74 61 62 6c 65 20 73  cans.  A table s
2b580 63 61 6e 20 75 73 65 73 20 61 20 66 61 63 74 6f  can uses a facto
2b590 72 20 6f 66 20 33 20 73 6f 20 74 68 61 74 0a 20  r of 3 so that. 
2b5a0 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20           **     
2b5b0 69 6e 64 65 78 20 73 63 61 6e 73 20 61 72 65 20  index scans are 
2b5c0 66 61 76 6f 72 65 64 20 6f 76 65 72 20 74 61 62  favored over tab
2b5d0 6c 65 20 73 63 61 6e 73 2e 0a 20 20 20 20 20 20  le scans..      
2b5e0 20 20 20 20 2a 2a 20 20 2b 20 20 49 66 20 74 68      **  +  If th
2b5f0 69 73 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  is covering inde
2b600 78 20 6d 69 67 68 74 20 61 6c 73 6f 20 68 65 6c  x might also hel
2b610 70 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  p satisfy the OR
2b620 44 45 52 20 42 59 0a 20 20 20 20 20 20 20 20 20  DER BY.         
2b630 20 2a 2a 20 20 20 20 20 63 6c 61 75 73 65 2c 20   **     clause, 
2b640 74 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73  then the cost is
2b650 20 66 75 64 67 65 64 20 64 6f 77 6e 20 73 6c 69   fudged down sli
2b660 67 68 74 6c 79 20 73 6f 20 74 68 61 74 20 74 68  ghtly so that th
2b670 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
2b680 20 20 20 20 69 6e 64 65 78 20 69 73 20 66 61 76      index is fav
2b690 6f 72 65 64 20 61 62 6f 76 65 20 6f 74 68 65 72  ored above other
2b6a0 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 68 61   indices that ha
2b6b0 76 65 20 6e 6f 20 68 6f 70 65 20 6f 66 0a 20 20  ve no hope of.  
2b6c0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 68          **     h
2b6d0 65 6c 70 69 6e 67 20 77 69 74 68 20 74 68 65 20  elping with the 
2b6e0 4f 52 44 45 52 20 42 59 2e 20 2a 2f 0a 20 20 20  ORDER BY. */.   
2b6f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
2b700 6e 20 3d 20 31 30 20 2b 20 77 68 65 72 65 43 6f  n = 10 + whereCo
2b710 73 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67  stAdd(rSize,rLog
2b720 53 69 7a 65 29 20 2d 20 62 3b 0a 20 20 20 20 20  Size) - b;.     
2b730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b740 20 20 20 20 61 73 73 65 72 74 28 20 62 21 3d 30      assert( b!=0
2b750 20 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20 2f   ); .          /
2b760 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
2b770 66 20 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f 6e  f scanning a non
2b780 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20  -covering index 
2b790 69 73 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e 29  is (N+1)*log2(N)
2b7a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68  .          ** wh
2b7b0 69 63 68 20 77 65 20 77 69 6c 6c 20 73 69 6d 70  ich we will simp
2b7c0 6c 69 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a 6c  lify to just N*l
2b7d0 6f 67 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20 20  og2(N) */.      
2b7e0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2b7f0 20 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a   rSize + rLogSiz
2b800 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2b810 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
2b820 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
2b830 70 4e 65 77 2c 20 70 53 72 63 2d 3e 69 43 75 72  pNew, pSrc->iCur
2b840 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63  sor);.        rc
2b850 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
2b860 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
2b870 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  w);.        pNew
2b880 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
2b890 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2b8a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2b8b0 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
2b8c0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
2b8d0 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c  eIndex(pBuilder,
2b8e0 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 30   pSrc, pProbe, 0
2b8f0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
2b900 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
2b910 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74  _STAT4.    sqlit
2b920 65 33 53 74 61 74 34 50 72 6f 62 65 46 72 65 65  e3Stat4ProbeFree
2b930 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29  (pBuilder->pRec)
2b940 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ;.    pBuilder->
2b950 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20  nRecValid = 0;. 
2b960 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65     pBuilder->pRe
2b970 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  c = 0;.#endif.. 
2b980 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
2b990 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  as an INDEXED BY
2b9a0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e   clause, then on
2b9b0 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65  ly that one inde
2b9c0 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  x is.    ** cons
2b9d0 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  idered. */.    i
2b9e0 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  f( pSrc->pIndex 
2b9f0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
2ba00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
2ba10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ba20 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
2ba30 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
2ba40 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
2ba50 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  r a table of the
2ba60 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64   join identified
2ba70 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d   by.** pBuilder-
2ba80 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
2ba90 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
2baa0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76  anteed to be a v
2bab0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
2bac0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2bad0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
2bae0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
2baf0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 20 20 20  der *pBuilder   
2bb00 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
2bb10 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 29  information */.)
2bb20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
2bb30 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
2bb40 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
2bb50 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
2bb60 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
2bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bb80 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
2bb90 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
2bba0 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
2bbb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
2bbc0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
2bbd0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2bbe0 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54  em *pSrc;   /* T
2bbf0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
2bc00 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
2bc10 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
2bc20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2bc30 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
2bc40 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20  nfo *pIdxInfo;. 
2bc50 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
2bc60 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
2bc70 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
2bc80 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2bc90 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
2bca0 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
2bcb0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
2bcc0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
2bcd0 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d  nt iTerm, mxTerm
2bce0 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  ;.  int nConstra
2bcf0 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49  int;.  int seenI
2bd00 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
2bd10 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2bd20 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  n IN operator is
2bd30 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73   seen */.  int s
2bd40 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20  eenVar = 0;     
2bd50 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2bd60 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  if a non-constan
2bd70 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  t constraint is 
2bd80 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50  seen */.  int iP
2bd90 68 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  hase;           
2bda0 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e         /* 0: con
2bdb0 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f  st w/o IN, 1: co
2bdc0 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20  nst, 2: no IN,  
2bdd0 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65  2: IN */.  Where
2bde0 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Loop *pNew;.  in
2bdf0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2be00 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  ;..  pWInfo = pB
2be10 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
2be20 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
2be30 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  o->pParse;.  db 
2be40 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2be50 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
2be60 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  pWC;.  pNew = pB
2be70 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
2be80 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  pSrc = &pWInfo->
2be90 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77  pTabList->a[pNew
2bea0 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20  ->iTab];.  pTab 
2beb0 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
2bec0 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61  assert( IsVirtua
2bed0 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64  l(pTab) );.  pId
2bee0 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65  xInfo = allocate
2bef0 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65  IndexInfo(pParse
2bf00 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75  , pWC, pSrc, pBu
2bf10 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29  ilder->pOrderBy)
2bf20 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
2bf30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2bf40 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65  ITE_NOMEM;.  pNe
2bf50 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20  w->prereq = 0;. 
2bf60 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2bf70 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  0;.  pNew->wsFla
2bf80 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55  gs = WHERE_VIRTU
2bf90 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d  ALTABLE;.  pNew-
2bfa0 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
2bfb0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2bfc0 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61  Free = 0;.  pUsa
2bfd0 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  ge = pIdxInfo->a
2bfe0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
2bff0 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  .  nConstraint =
2c000 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73   pIdxInfo->nCons
2c010 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68  traint;.  if( wh
2c020 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
2c030 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61  , pNew, nConstra
2c040 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  int) ){.    sqli
2c050 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
2c060 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74  dxInfo);.    ret
2c070 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2c080 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68  ;.  }..  for(iPh
2c090 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33  ase=0; iPhase<=3
2c0a0 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20  ; iPhase++){.   
2c0b0 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20   if( !seenIn && 
2c0c0 28 69 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b  (iPhase&1)!=0 ){
2c0d0 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b  .      iPhase++;
2c0e0 0a 20 20 20 20 20 20 69 66 28 20 69 50 68 61 73  .      if( iPhas
2c0f0 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e>3 ) break;.   
2c100 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e   }.    if( !seen
2c110 56 61 72 20 26 26 20 69 50 68 61 73 65 3e 31 20  Var && iPhase>1 
2c120 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64  ) break;.    pId
2c130 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
2c140 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
2c150 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
2c160 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
2c170 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  nt;.    for(i=0;
2c180 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
2c190 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
2c1a0 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
2c1b0 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
2c1c0 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
2c1d0 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
2c1e0 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69  >a[j];.      swi
2c1f0 74 63 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20  tch( iPhase ){. 
2c200 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20         case 0:  
2c210 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77    /* Constants w
2c220 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74  ithout IN operat
2c230 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
2c240 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
2c250 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2c260 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2c270 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
2c280 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c290 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20   seenIn = 1;.   
2c2a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c2b0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
2c2c0 65 72 65 71 52 69 67 68 74 21 3d 30 20 29 7b 0a  ereqRight!=0 ){.
2c2d0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e              seen
2c2e0 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Var = 1;.       
2c2f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54     }else if( (pT
2c300 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2c310 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20   WO_IN)==0 ){.  
2c320 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2c330 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a  ns->usable = 1;.
2c340 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c350 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c360 20 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 20       case 1:    
2c370 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74  /* Constants wit
2c380 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a  h IN operators *
2c390 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
2c3a0 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20  rt( seenIn );.  
2c3b0 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2c3c0 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
2c3d0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d  m->prereqRight==
2c3e0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
2c3f0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
2c400 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61  e 2:    /* Varia
2c410 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20  bles without IN 
2c420 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
2c430 65 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a  ert( seenVar );.
2c440 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2c450 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54  ns->usable = (pT
2c460 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2c470 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20   WO_IN)==0;.    
2c480 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c490 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20       default:   
2c4a0 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74  /* Variables wit
2c4b0 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  h IN */.        
2c4c0 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61    assert( seenVa
2c4d0 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20  r && seenIn );. 
2c4e0 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
2c4f0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20  s->usable = 1;. 
2c500 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2c510 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c520 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c    memset(pUsage,
2c530 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67   0, sizeof(pUsag
2c540 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e  e[0])*pIdxInfo->
2c550 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
2c560 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
2c570 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2c580 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
2c590 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
2c5a0 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  );.    pIdxInfo-
2c5b0 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  >idxStr = 0;.   
2c5c0 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
2c5d0 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  m = 0;.    pIdxI
2c5e0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2c5f0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
2c600 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2c610 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
2c620 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
2c630 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49  matedCost = SQLI
2c640 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f  TE_BIG_DBL / (do
2c650 75 62 6c 65 29 32 3b 0a 20 20 20 20 72 63 20 3d  uble)2;.    rc =
2c660 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70   vtabBestIndex(p
2c670 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64  Parse, pTab, pId
2c680 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20  xInfo);.    if( 
2c690 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c  rc ) goto whereL
2c6a0 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
2c6b0 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
2c6c0 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
2c6d0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
2c6e0 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
2c6f0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
2c700 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30  pNew->prereq = 0
2c710 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d  ;.    mxTerm = -
2c720 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
2c730 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f  New->nLSlot>=nCo
2c740 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20  nstraint );.    
2c750 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
2c760 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65  traint; i++) pNe
2c770 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30  w->aLTerm[i] = 0
2c780 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74  ;.    pNew->u.vt
2c790 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b  ab.omitMask = 0;
2c7a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2c7b0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
2c7c0 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
2c7d0 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20       if( (iTerm 
2c7e0 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  = pUsage[i].argv
2c7f0 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b  Index - 1)>=0 ){
2c800 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64  .        j = pId
2c810 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
2c820 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
2c830 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69  iTerm>=nConstrai
2c840 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  nt.         || j
2c850 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  <0.         || j
2c860 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20  >=pWC->nTerm.   
2c870 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61        || pNew->a
2c880 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a  LTerm[iTerm]!=0.
2c890 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2c8a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c8b0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
2c8c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2c8d0 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42  g(pParse, "%s.xB
2c8e0 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75  estIndex() malfu
2c8f0 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a  nction", pTab->z
2c900 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2c910 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
2c920 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
2c930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
2c940 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
2c950 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
2c960 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2c970 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( j==0 );.     
2c980 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
2c990 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a  pWC->nTerm-1 );.
2c9a0 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
2c9b0 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
2c9c0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2c9d0 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65   |= pTerm->prere
2c9e0 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
2c9f0 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e  assert( iTerm<pN
2ca00 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
2ca10 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
2ca20 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72  rm[iTerm] = pTer
2ca30 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  m;.        if( i
2ca40 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78  Term>mxTerm ) mx
2ca50 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20  Term = iTerm;.  
2ca60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ca70 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
2ca80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2ca90 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20  Term==16 );.    
2caa0 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36      if( iTerm<16
2cab0 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d   && pUsage[i].om
2cac0 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61  it ) pNew->u.vta
2cad0 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c  b.omitMask |= 1<
2cae0 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  <iTerm;.        
2caf0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2cb00 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
2cb10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
2cb20 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  f( pUsage[i].omi
2cb30 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
2cb40 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74      /* Do not at
2cb50 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20  tempt to use an 
2cb60 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66  IN constraint if
2cb70 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
2cb80 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
2cb90 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20  * says that the 
2cba0 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f  equivalent EQ co
2cbb0 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
2cbc0 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65  be safely omitte
2cbd0 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  d..            *
2cbe0 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d  * If we do attem
2cbf0 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20 61  pt to use such a
2cc00 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d   constraint, som
2cc10 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a  e rows might be.
2cc20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
2cc30 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f  epeated in the o
2cc40 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20  utput. */.      
2cc50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2cc60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cc70 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20     /* A virtual 
2cc80 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f  table that is co
2cc90 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20  nstrained by an 
2cca0 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f  IN clause may no
2ccb0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
2ccc0 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52  onsume the ORDER
2ccd0 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61 75   BY clause becau
2cce0 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65 72  se (1) the order
2ccf0 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20   of IN terms.   
2cd00 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
2cd10 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
2cd20 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
2cd30 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
2cd40 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  s and.          
2cd50 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20  ** (2) Multiple 
2cd60 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73  outputs from a s
2cd70 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77  ingle IN value w
2cd80 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20  ill not merge.  
2cd90 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74          ** toget
2cda0 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  her.  */.       
2cdb0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
2cdc0 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
2cdd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2cde0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2cdf0 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ( i>=nConstraint
2ce00 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
2ce10 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b  nLTerm = mxTerm+
2ce20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
2ce30 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70   pNew->nLTerm<=p
2ce40 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
2ce50 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
2ce60 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49  b.idxNum = pIdxI
2ce70 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20  nfo->idxNum;.   
2ce80 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2ce90 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49  needFree = pIdxI
2cea0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2ceb0 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64  dxStr;.      pId
2cec0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2ced0 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
2cee0 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2cef0 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66  idxStr = pIdxInf
2cf00 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20  o->idxStr;.     
2cf10 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73   pNew->u.vtab.is
2cf20 4f 72 64 65 72 65 64 20 3d 20 28 75 38 29 28 28  Ordered = (u8)((
2cf30 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
2cf40 42 79 21 3d 30 29 0a 20 20 20 20 20 20 20 20 20  By!=0).         
2cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf60 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
2cf70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2cf80 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20 20  Consumed);.     
2cf90 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2cfa0 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  0;.      pNew->r
2cfb0 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 46  Run = whereCostF
2cfc0 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e  romDouble(pIdxIn
2cfd0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
2cfe0 74 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e  t);.      /* TUN
2cff0 49 4e 47 3a 20 45 76 65 72 79 20 76 69 72 74 75  ING: Every virtu
2d000 61 6c 20 74 61 62 6c 65 20 71 75 65 72 79 20 72  al table query r
2d010 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a  eturns 25 rows *
2d020 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  /.      pNew->nO
2d030 75 74 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74  ut = 46;  assert
2d040 28 20 34 36 3d 3d 77 68 65 72 65 43 6f 73 74 28  ( 46==whereCost(
2d050 32 35 29 20 29 3b 0a 20 20 20 20 20 20 77 68 65  25) );.      whe
2d060 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2d070 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2d080 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
2d090 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
2d0a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d0b0 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74  _free(pNew->u.vt
2d0c0 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
2d0d0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2d0e0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
2d0f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2d100 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64    ..whereLoopAdd
2d110 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28  Vtab_exit:.  if(
2d120 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
2d130 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
2d140 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
2d150 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
2d160 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2d170 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72  , pIdxInfo);.  r
2d180 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
2d190 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2d1a0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
2d1b0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65  /../*.** Add Whe
2d1c0 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74  reLoop entries t
2d1d0 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d  o handle OR term
2d1e0 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66  s.  This works f
2d1f0 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72  or either.** btr
2d200 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ees or virtual t
2d210 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
2d220 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2d230 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  dOr(WhereLoopBui
2d240 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
2d250 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b  Bitmask mExtra){
2d260 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2d270 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2d280 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65  >pWInfo;.  Where
2d290 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
2d2a0 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
2d2b0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2d2c0 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69  rm, *pWCEnd;.  i
2d2d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d2e0 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  K;.  int iCur;. 
2d2f0 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d   WhereClause tem
2d300 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
2d310 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c  Builder sSubBuil
2d320 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20  d;.  WhereOrSet 
2d330 73 53 75 6d 2c 20 73 43 75 72 2c 20 73 50 72 65  sSum, sCur, sPre
2d340 76 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  v;.  struct SrcL
2d350 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2d360 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69  .  .  pWC = pBui
2d370 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28  lder->pWC;.  if(
2d380 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2d390 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f  ags & WHERE_AND_
2d3a0 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53 51  ONLY ) return SQ
2d3b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e  LITE_OK;.  pWCEn
2d3c0 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
2d3d0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
2d3e0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2d3f0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d  ;.  memset(&sSum
2d400 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d  , 0, sizeof(sSum
2d410 29 29 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d  ));..  for(pTerm
2d420 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
2d430 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c  WCEnd && rc==SQL
2d440 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29  ITE_OK; pTerm++)
2d450 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
2d460 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2d470 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20  _OR)!=0.     && 
2d480 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  (pTerm->u.pOrInf
2d490 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70  o->indexable & p
2d4a0 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  New->maskSelf)!=
2d4b0 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
2d4c0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f  WhereClause * co
2d4d0 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65  nst pOrWC = &pTe
2d4e0 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
2d4f0 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  c;.      WhereTe
2d500 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  rm * const pOrWC
2d510 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b  End = &pOrWC->a[
2d520 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  pOrWC->nTerm];. 
2d530 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
2d540 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  pOrTerm;.      i
2d550 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20  nt once = 1;.   
2d560 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
2d570 20 0a 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20   .      pItem = 
2d580 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2d590 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62  ->a + pNew->iTab
2d5a0 3b 0a 20 20 20 20 20 20 69 43 75 72 20 3d 20 70  ;.      iCur = p
2d5b0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
2d5c0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d       sSubBuild =
2d5d0 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20   *pBuilder;.    
2d5e0 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64    sSubBuild.pOrd
2d5f0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
2d600 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74  sSubBuild.pOrSet
2d610 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20   = &sCur;..     
2d620 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72   for(pOrTerm=pOr
2d630 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70  WC->a; pOrTerm<p
2d640 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d  OrWCEnd; pOrTerm
2d650 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
2d660 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
2d670 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d  ator & WO_AND)!=
2d680 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
2d690 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
2d6a0 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49  pOrTerm->u.pAndI
2d6b0 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20  nfo->wc;.       
2d6c0 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
2d6d0 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
2d6e0 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
2d6f0 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20    tempWC.pWInfo 
2d700 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20  = pWC->pWInfo;. 
2d710 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2d720 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20  pOuter = pWC;.  
2d730 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f          tempWC.o
2d740 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20  p = TK_AND;.    
2d750 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65        tempWC.nTe
2d760 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
2d770 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72    tempWC.a = pOr
2d780 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
2d790 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
2d7a0 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20  &tempWC;.       
2d7b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d7c0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2d7d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43      }.        sC
2d7e0 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 6e 64 65  ur.n = 0;.#ifnde
2d7f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2d800 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
2d810 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
2d820 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  (pItem->pTab) ){
2d830 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2d840 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
2d850 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64 29 3b  ual(&sSubBuild);
2d860 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
2d870 3d 30 3b 20 69 3c 73 43 75 72 2e 6e 3b 20 69 2b  =0; i<sCur.n; i+
2d880 2b 29 20 73 43 75 72 2e 61 5b 69 5d 2e 70 72 65  +) sCur.a[i].pre
2d890 72 65 71 20 7c 3d 20 6d 45 78 74 72 61 3b 0a 20  req |= mExtra;. 
2d8a0 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
2d8b0 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
2d8c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
2d8d0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26  reLoopAddBtree(&
2d8e0 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72  sSubBuild, mExtr
2d8f0 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  a);.        }.  
2d900 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2d910 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  ==SQLITE_OK || s
2d920 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  Cur.n==0 );.    
2d930 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d      if( sCur.n==
2d940 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
2d950 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  Sum.n = 0;.     
2d960 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2d970 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
2d980 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
2d990 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75  whereOrMove(&sSu
2d9a0 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20  m, &sCur);.     
2d9b0 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
2d9c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2d9d0 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
2d9e0 6f 76 65 28 26 73 50 72 65 76 2c 20 26 73 53 75  ove(&sPrev, &sSu
2d9f0 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53  m);.          sS
2da00 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
2da10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
2da20 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Prev.n; i++){.  
2da30 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
2da40 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b  0; j<sCur.n; j++
2da50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2da60 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26   whereOrInsert(&
2da70 73 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d  sSum, sPrev.a[i]
2da80 2e 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61  .prereq | sCur.a
2da90 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20  [j].prereq,.    
2daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dab0 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6f 73          whereCos
2dac0 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
2dad0 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  rRun, sCur.a[j].
2dae0 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  rRun),.         
2daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db00 20 20 20 77 68 65 72 65 43 6f 73 74 41 64 64 28     whereCostAdd(
2db10 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c  sPrev.a[i].nOut,
2db20 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29   sCur.a[j].nOut)
2db30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2db40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2db50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2db60 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
2db70 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65  m = 1;.      pNe
2db80 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
2db90 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77  Term;.      pNew
2dba0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
2dbb0 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20  E_MULTI_OR;.    
2dbc0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
2dbd0 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
2dbe0 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20  iSortIdx = 0;.  
2dbf0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77      memset(&pNew
2dc00 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ->u, 0, sizeof(p
2dc10 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20  New->u));.      
2dc20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
2dc30 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d  ITE_OK && i<sSum
2dc40 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
2dc50 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 75 6c    /* TUNING: Mul
2dc60 74 69 70 6c 65 20 62 79 20 33 2e 35 20 66 6f 72  tiple by 3.5 for
2dc70 20 74 68 65 20 73 65 63 6f 6e 64 61 72 79 20 74   the secondary t
2dc80 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20  able lookup */. 
2dc90 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
2dca0 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  n = sSum.a[i].rR
2dcb0 75 6e 20 2b 20 31 38 3b 0a 20 20 20 20 20 20 20  un + 18;.       
2dcc0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53   pNew->nOut = sS
2dcd0 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20  um.a[i].nOut;.  
2dce0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
2dcf0 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70  eq = sSum.a[i].p
2dd00 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72  rereq;.        r
2dd10 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2dd20 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2dd30 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
2dd40 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2dd50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
2dd60 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
2dd70 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74  bjects for all t
2dd80 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63  ables .*/.static
2dd90 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2dda0 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75  dAll(WhereLoopBu
2ddb0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
2ddc0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
2ddd0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
2dde0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d  ->pWInfo;.  Bitm
2ddf0 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a  ask mExtra = 0;.
2de00 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72    Bitmask mPrior
2de10 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62   = 0;.  int iTab
2de20 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
2de30 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
2de40 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
2de50 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2de60 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
2de70 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
2de80 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
2de90 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49  t nTabList = pWI
2dea0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69  nfo->nLevel;.  i
2deb0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2dec0 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  K;.  u8 priorJoi
2ded0 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65  nType = 0;.  Whe
2dee0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20  reLoop *pNew;.. 
2def0 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68   /* Loop over th
2df00 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
2df10 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20  join, from left 
2df20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e  to right */.  pN
2df30 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
2df40 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  New;.  whereLoop
2df50 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f  Init(pNew);.  fo
2df60 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d  r(iTab=0, pItem=
2df70 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61  pTabList->a; iTa
2df80 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61 62  b<nTabList; iTab
2df90 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2dfa0 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69    pNew->iTab = i
2dfb0 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d  Tab;.    pNew->m
2dfc0 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73  askSelf = getMas
2dfd0 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
2dfe0 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Set, pItem->iCur
2dff0 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28  sor);.    if( ((
2e000 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c  pItem->jointype|
2e010 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26  priorJoinType) &
2e020 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
2e030 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  SS))!=0 ){.     
2e040 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72   mExtra = mPrior
2e050 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f  ;.    }.    prio
2e060 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74 65  rJoinType = pIte
2e070 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
2e080 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2e090 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
2e0a0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2e0b0 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42  oopAddVirtual(pB
2e0c0 75 69 6c 64 65 72 29 3b 0a 20 20 20 20 7d 65 6c  uilder);.    }el
2e0d0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  se{.      rc = w
2e0e0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
2e0f0 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
2e100 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  a);.    }.    if
2e110 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e120 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
2e130 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75  ereLoopAddOr(pBu
2e140 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
2e150 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72      }.    mPrior
2e160 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   |= pNew->maskSe
2e170 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c  lf;.    if( rc |
2e180 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2e190 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ed ) break;.  }.
2e1a0 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
2e1b0 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  (db, pNew);.  re
2e1c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2e1d0 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72  * Examine a Wher
2e1e0 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20  ePath (with the 
2e1f0 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  addition of the 
2e200 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20  extra WhereLoop 
2e210 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61  of the 5th.** pa
2e220 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65  rameters) to see
2e230 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72   if it outputs r
2e240 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65  ows in the reque
2e250 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a  sted ORDER BY.**
2e260 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77   (or GROUP BY) w
2e270 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67  ithout requiring
2e280 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74   a separate sort
2e290 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74   operation.  Ret
2e2a0 75 72 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30  urn:.** .**    0
2e2b0 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73 20 6e  :  ORDER BY is n
2e2c0 6f 74 20 73 61 74 69 73 66 69 65 64 2e 20 20 53  ot satisfied.  S
2e2d0 6f 72 74 69 6e 67 20 72 65 71 75 69 72 65 64 0a  orting required.
2e2e0 2a 2a 20 20 20 20 31 3a 20 20 4f 52 44 45 52 20  **    1:  ORDER 
2e2f0 42 59 20 69 73 20 73 61 74 69 73 66 69 65 64 2e  BY is satisfied.
2e300 20 20 20 20 20 20 4f 6d 69 74 20 73 6f 72 74 69        Omit sorti
2e310 6e 67 0a 2a 2a 20 20 20 2d 31 3a 20 20 55 6e 6b  ng.**   -1:  Unk
2e320 6e 6f 77 6e 20 61 74 20 74 68 69 73 20 74 69 6d  nown at this tim
2e330 65 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  e.**.** Note tha
2e340 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  t processing for
2e350 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61   WHERE_GROUPBY a
2e360 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  nd WHERE_DISTINC
2e370 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a  TBY is not as.**
2e380 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47   strict.  With G
2e390 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
2e3a0 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65  INCT the only re
2e3b0 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61  quirement is tha
2e3c0 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  t.** equivalent 
2e3d0 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65  rows appear imme
2e3e0 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74  diately adjacent
2e3f0 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e   to one another.
2e400 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e    GROUP BY.** an
2e410 64 20 44 49 53 54 49 4e 54 20 64 6f 20 6e 6f 74  d DISTINT do not
2e420 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f   require rows to
2e430 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70   appear in any p
2e440 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20  articular order 
2e450 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71  as long.** as eq
2e460 75 69 76 65 6c 65 6e 74 20 72 6f 77 73 20 61 72  uivelent rows ar
2e470 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
2e480 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52  er.  Thus for GR
2e490 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49  OUP BY and DISTI
2e4a0 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65  NCT.** the pOrde
2e4b0 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65  rBy terms can be
2e4c0 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20   matched in any 
2e4d0 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44  order.  With ORD
2e4e0 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70  ER BY, the .** p
2e4f0 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75  OrderBy terms mu
2e500 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e  st be matched in
2e510 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d   strict left-to-
2e520 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a  right order..*/.
2e530 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
2e540 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
2e550 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66  erBy(.  WhereInf
2e560 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a  o *pWInfo,    /*
2e570 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
2e580 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
2e590 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
2e5a0 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
2e5b0 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54  P BY or DISTINCT
2e5c0 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b   clause to check
2e5d0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2e5e0 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54  *pPath,     /* T
2e5f0 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20  he WherePath to 
2e600 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77  check */.  u16 w
2e610 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
2e620 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69   /* Might contai
2e630 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  n WHERE_GROUPBY 
2e640 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  or WHERE_DISTINC
2e650 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f  TBY */.  u16 nLo
2e660 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  op,            /
2e670 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
2e680 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c  ies in pPath->aL
2e690 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  oop[] */.  Where
2e6a0 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20  Loop *pLast,    
2e6b0 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65   /* Add this Whe
2e6c0 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e  reLoop to the en
2e6d0 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  d of pPath->aLoo
2e6e0 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  p[] */.  Bitmask
2e6f0 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f   *pRevMask     /
2e700 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57  * OUT: Mask of W
2e710 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e  hereLoops to run
2e720 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
2e730 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76  r */.){.  u8 rev
2e740 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Set;            
2e750 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69  /* True if rev i
2e760 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20  s known */.  u8 
2e770 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
2e780 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20     /* Composite 
2e790 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
2e7a0 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20  u8 revIdx;      
2e7b0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
2e7c0 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
2e7d0 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  8 isOrderDistinc
2e7e0 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f  t;   /* All prio
2e7f0 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65  r WhereLoops are
2e800 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
2e810 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74  */.  u8 distinct
2e820 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72  Columns;   /* Tr
2e830 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68  ue if the loop h
2e840 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55  as UNIQUE NOT NU
2e850 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
2e860 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20  u8 isMatch;     
2e870 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e        /* iColumn
2e880 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20   matches a term 
2e890 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
2e8a0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
2e8b0 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  nColumn;        
2e8c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2e8d0 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78  olumns in pIndex
2e8e0 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72   */.  u16 nOrder
2e8f0 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
2e900 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74  umber terms in t
2e910 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2e920 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  se */.  int iLoo
2e930 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
2e940 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c   Index of WhereL
2e950 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69  oop in pPath bei
2e960 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ng processed */.
2e970 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2e980 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2e990 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
2e9a0 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
2e9b0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
2e9c0 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74  mber for current
2e9d0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20   WhereLoop */.  
2e9e0 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
2e9f0 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d        /* A colum
2ea00 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20  n number within 
2ea10 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20  table iCur */.  
2ea20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
2ea30 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74   = 0; /* Current
2ea40 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67   WhereLoop being
2ea50 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20   processed. */. 
2ea60 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2ea70 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67  m;     /* A sing
2ea80 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
2ea90 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2eaa0 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20   Expr *pOBExpr; 
2eab0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
2eac0 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
2ead0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2eae0 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
2eaf0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43  Coll;       /* C
2eb00 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20  OLLATE function 
2eb10 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59  from an ORDER BY
2eb20 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
2eb30 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
2eb40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
2eb50 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
2eb60 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  with pLoop */.  
2eb70 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
2eb80 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
2eb90 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
2eba0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42  onnection */.  B
2ebb0 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30  itmask obSat = 0
2ebc0 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
2ebd0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73  ORDER BY terms s
2ebe0 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20  atisfied so far 
2ebf0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44  */.  Bitmask obD
2ec00 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  one;       /* Ma
2ec10 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20  sk of all ORDER 
2ec20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  BY terms */.  Bi
2ec30 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69  tmask orderDisti
2ec40 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73  nctMask;  /* Mas
2ec50 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72  k of all well-or
2ec60 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20  dered loops */. 
2ec70 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20   Bitmask ready; 
2ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ec90 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f  Mask of inner lo
2eca0 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ops */..  /*.  *
2ecb0 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65  * We say the Whe
2ecc0 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72  reLoop is "one-r
2ecd0 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61  ow" if it genera
2ece0 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  tes no more than
2ecf0 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   one.  ** row of
2ed00 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72   output.  A Wher
2ed10 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77  eLoop is one-row
2ed20 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
2ed30 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
2ed40 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c  e:.  **  (a) All
2ed50 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d   index columns m
2ed60 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f  atch with WHERE_
2ed70 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20  COLUMN_EQ..  ** 
2ed80 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69   (b) The index i
2ed90 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e  s unique.  ** An
2eda0 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  y WhereLoop with
2edb0 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   an WHERE_COLUMN
2edc0 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  _EQ constraint o
2edd0 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f  n the rowid is o
2ede0 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65  ne-row..  ** Eve
2edf0 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
2ee00 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74  Loop will have t
2ee10 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
2ee20 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61  bit set in wsFla
2ee30 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  gs..  **.  ** We
2ee40 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
2ee50 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73  op is "order-dis
2ee60 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65  tinct" if the se
2ee70 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  t of columns fro
2ee80 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72  m.  ** that Wher
2ee90 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69  eLoop that are i
2eea0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
2eeb0 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72  lause are differ
2eec0 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20  ent for every.  
2eed0 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68  ** row of the Wh
2eee0 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20  ereLoop.  Every 
2eef0 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
2ef00 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  p is automatical
2ef10 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69  ly.  ** order-di
2ef20 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72  stinct.   A Wher
2ef30 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e  eLoop that has n
2ef40 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  o columns in the
2ef50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2ef60 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64  .  ** is not ord
2ef70 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20  er-distinct. To 
2ef80 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
2ef90 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74  t is not quite t
2efa0 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67  he same as being
2efb0 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e  .  ** UNIQUE sin
2efc0 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75  ce a UNIQUE colu
2efd0 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  mn or index can 
2efe0 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  have multiple ro
2eff0 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72  ws that .  ** ar
2f000 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20  e NULL and NULL 
2f010 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76  values are equiv
2f020 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75  alent for the pu
2f030 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64  rpose of order-d
2f040 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f  istinct..  ** To
2f050 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
2f060 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ct, the columns 
2f070 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61  must be UNIQUE a
2f080 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a  nd NOT NULL..  *
2f090 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64  *.  ** The rowid
2f0a0 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20   for a table is 
2f0b0 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e  always UNIQUE an
2f0c0 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68  d NOT NULL so wh
2f0d0 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20  enever the.  ** 
2f0e0 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e  rowid appears in
2f0f0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2f100 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73  ause, the corres
2f110 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f  ponding WhereLoo
2f120 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  p is.  ** automa
2f130 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69  tically order-di
2f140 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20  stinct..  */..  
2f150 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
2f160 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72  !=0 );..  /* Sor
2f170 74 61 62 69 6c 69 74 79 20 6f 66 20 76 69 72 74  tability of virt
2f180 75 61 6c 20 74 61 62 6c 65 73 20 69 73 20 64 65  ual tables is de
2f190 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
2f1a0 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
2f1b0 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 76 69  d.  ** of the vi
2f1c0 72 74 75 61 6c 20 74 61 62 6c 65 20 69 74 73 65  rtual table itse
2f1d0 6c 66 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73  lf */.  if( pLas
2f1e0 74 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  t->wsFlags & WHE
2f1f0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
2f200 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ){.    testcase(
2f210 20 6e 4c 6f 6f 70 3e 30 20 29 3b 20 20 2f 2a 20   nLoop>0 );  /* 
2f220 54 72 75 65 20 77 68 65 6e 20 6f 75 74 65 72 20  True when outer 
2f230 6c 6f 6f 70 73 20 61 72 65 20 6f 6e 65 2d 72 6f  loops are one-ro
2f240 77 20 61 6e 64 20 6d 61 74 63 68 20 0a 20 20 20  w and match .   
2f250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f260 20 20 20 20 20 20 20 2a 2a 20 6e 6f 20 4f 52 44         ** no ORD
2f270 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
2f280 20 20 20 72 65 74 75 72 6e 20 70 4c 61 73 74 2d     return pLast-
2f290 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65  >u.vtab.isOrdere
2f2a0 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f  d;.  }.  if( nLo
2f2b0 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  op && Optimizati
2f2c0 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
2f2d0 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78  QLITE_OrderByIdx
2f2e0 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
2f2f0 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  ;..  nOrderBy = 
2f300 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
2f310 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72  .  testcase( nOr
2f320 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a  derBy==BMS-1 );.
2f330 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42    if( nOrderBy>B
2f340 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  MS-1 ) return 0;
2f350 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69    /* Cannot opti
2f360 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67  mize overly larg
2f370 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20  e ORDER BYs */. 
2f380 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2f390 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d   = 1;.  obDone =
2f3a0 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42   MASKBIT(nOrderB
2f3b0 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73  y)-1;.  orderDis
2f3c0 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  tinctMask = 0;. 
2f3d0 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f   ready = 0;.  fo
2f3e0 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64  r(iLoop=0; isOrd
2f3f0 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62  erDistinct && ob
2f400 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c  Sat<obDone && iL
2f410 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  oop<=nLoop; iLoo
2f420 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c  p++){.    if( iL
2f430 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d  oop>0 ) ready |=
2f440 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
2f450 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c  ;.    pLoop = iL
2f460 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74  oop<nLoop ? pPat
2f470 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  h->aLoop[iLoop] 
2f480 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 61 73 73  : pLast;.    ass
2f490 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
2f4a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2f4b0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
2f4c0 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e  .    iCur = pWIn
2f4d0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
2f4e0 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75  pLoop->iTab].iCu
2f4f0 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  rsor;..    /* Ma
2f500 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52  rk off any ORDER
2f510 20 42 59 20 74 65 72 6d 20 58 20 74 68 61 74 20   BY term X that 
2f520 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  is a column in t
2f530 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20  he table of.    
2f540 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ** the current l
2f550 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74 68  oop for which th
2f560 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74  ere is term in t
2f570 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20  he WHERE.    ** 
2f580 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
2f590 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20  rm X IS NULL or 
2f5a0 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e  X=? that referen
2f5b0 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20  ce only outer.  
2f5c0 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20    ** loops..    
2f5d0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
2f5e0 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
2f5f0 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b  {.      if( MASK
2f600 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
2f610 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2f620 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
2f630 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
2f640 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
2f650 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  .pExpr);.      i
2f660 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d  f( pOBExpr->op!=
2f670 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74  TK_COLUMN ) cont
2f680 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
2f690 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
2f6a0 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
2f6b0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
2f6c0 66 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f  findTerm(&pWInfo
2f6d0 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42  ->sWC, iCur, pOB
2f6e0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20  Expr->iColumn,. 
2f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f700 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20 57 4f        ~ready, WO
2f710 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30  _EQ|WO_ISNULL, 0
2f720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
2f730 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
2f740 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
2f750 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f  rm->eOperator&WO
2f760 5f 45 51 29 21 3d 30 20 26 26 20 70 4f 42 45 78  _EQ)!=0 && pOBEx
2f770 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  pr->iColumn>=0 )
2f780 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
2f790 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20  char *z1, *z2;. 
2f7a0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
2f7b0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2f7c0 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
2f7d0 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
2f7e0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
2f7f0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
2f800 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
2f810 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20  oll;.        z1 
2f820 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  = pColl->zName;.
2f830 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
2f840 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2f850 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
2f860 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29  e, pTerm->pExpr)
2f870 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
2f880 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
2f890 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
2f8a0 20 20 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c        z2 = pColl
2f8b0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
2f8c0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
2f8d0 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29  Cmp(z1, z2)!=0 )
2f8e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2f8f0 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c   }.      obSat |
2f900 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
2f910 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c    }..    if( (pL
2f920 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2f930 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20  HERE_ONEROW)==0 
2f940 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  ){.      if( pLo
2f950 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2f960 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20  ERE_IPK ){.     
2f970 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
2f980 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
2f990 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
2f9a0 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c  if( (pIndex = pL
2f9b0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
2f9c0 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65  dex)==0 || pInde
2f9d0 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b  x->bUnordered ){
2f9e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f9f0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
2fa00 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
2fa10 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  = pIndex->nColum
2fa20 6e 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64  n;.        isOrd
2fa30 65 72 44 69 73 74 69 6e 63 74 20 3d 20 70 49 6e  erDistinct = pIn
2fa40 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
2fa50 5f 4e 6f 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  _None;.      }..
2fa60 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
2fa70 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e  rough all column
2fa80 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  s of the index a
2fa90 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74 68 65  nd deal with the
2faa0 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74   ones.      ** t
2fab0 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73  hat are not cons
2fac0 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72  trained by == or
2fad0 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   IN..      */.  
2fae0 20 20 20 20 72 65 76 20 3d 20 72 65 76 53 65 74      rev = revSet
2faf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74   = 0;.      dist
2fb00 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b  inctColumns = 0;
2fb10 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
2fb20 6a 3c 3d 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  j<=nColumn; j++)
2fb30 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e  {.        u8 bOn
2fb40 63 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 74 6f  ce;   /* True to
2fb50 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42   run the ORDER B
2fb60 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f  Y search loop */
2fb70 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69  ..        /* Ski
2fb80 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53  p over == and IS
2fb90 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20   NULL terms */. 
2fba0 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f         if( j<pLo
2fbb0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a  op->u.btree.nEq.
2fbc0 20 20 20 20 20 20 20 20 20 26 26 20 28 28 69 20           && ((i 
2fbd0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
2fbe0 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20 26  j]->eOperator) &
2fbf0 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c   (WO_EQ|WO_ISNUL
2fc00 4c 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29  L))!=0.        )
2fc10 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2fc20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  i & WO_ISNULL ){
2fc30 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
2fc40 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
2fc50 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
2fc60 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
2fc70 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
2fc80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2fc90 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20   continue;  .   
2fca0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2fcb0 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d  /* Get the colum
2fcc0 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  n number in the 
2fcd0 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20  table (iColumn) 
2fce0 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20  and sort order. 
2fcf0 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64         ** (revId
2fd00 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20  x) for the j-th 
2fd10 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
2fd20 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  dex..        */.
2fd30 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 6e 43          if( j<nC
2fd40 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
2fd50 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 69 6e 64     /* Normal ind
2fd60 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ex columns */.  
2fd70 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
2fd80 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  = pIndex->aiColu
2fd90 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  mn[j];.         
2fda0 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78   revIdx = pIndex
2fdb0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b  ->aSortOrder[j];
2fdc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2fdd0 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
2fde0 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20  pTable->iPKey ) 
2fdf0 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
2fe00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fe10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 52 4f         /* The RO
2fe20 57 49 44 20 63 6f 6c 75 6d 6e 20 61 74 20 74 68  WID column at th
2fe30 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  e end */.       
2fe40 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43     assert( j==nC
2fe50 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20  olumn );.       
2fe60 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b     iColumn = -1;
2fe70 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
2fe80 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  x = 0;.        }
2fe90 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ..        /* An 
2fea0 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f  unconstrained co
2feb0 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20  lumn that might 
2fec0 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68  be NULL means th
2fed0 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  at this.        
2fee0 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ** WhereLoop is 
2fef0 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64  not well-ordered
2ff00 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
2ff10 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
2ff20 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20  Distinct.       
2ff30 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a    && iColumn>=0.
2ff40 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70           && j>=p
2ff50 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
2ff60 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49  q.         && pI
2ff70 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  ndex->pTable->aC
2ff80 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e  ol[iColumn].notN
2ff90 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29  ull==0.        )
2ffa0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72  {.          isOr
2ffb0 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
2ffc0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2ffd0 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
2ffe0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68  ORDER BY term th
2fff0 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
30000 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d  o the j-th colum
30010 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  n.        ** of 
30020 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 61 6e  the index and an
30030 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45  d mark that ORDE
30040 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20  R BY term off . 
30050 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30060 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20    bOnce = 1;.   
30070 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30       isMatch = 0
30080 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
30090 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f  0; bOnce && i<nO
300a0 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
300b0 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
300c0 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
300d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
300e0 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73       pOBExpr = s
300f0 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
30100 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
30110 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
30120 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
30130 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
30140 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20  ERE_GROUPBY );. 
30150 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
30160 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  e( wctrlFlags & 
30170 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
30180 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
30190 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
301a0 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57  (WHERE_GROUPBY|W
301b0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29  HERE_DISTINCTBY)
301c0 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30  )==0 ) bOnce = 0
301d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
301e0 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
301f0 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75  COLUMN ) continu
30200 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
30210 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65   pOBExpr->iTable
30220 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
30230 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
30240 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
30250 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  n!=iColumn ) con
30260 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
30270 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20   if( iColumn>=0 
30280 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
30290 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
302a0 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
302b0 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
302c0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
302d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
302e0 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
302f0 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
30300 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30310 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
30320 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
30330 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  ndex->azColl[j])
30340 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
30350 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30360 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
30370 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
30380 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
30390 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
303a0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  h ){.          i
303b0 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  f( iColumn<0 ){.
303c0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
303d0 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f  case( distinctCo
303e0 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20  lumns==0 );.    
303f0 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74          distinct
30400 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20  Columns = 1;.   
30410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30420 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
30430 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
30440 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
30450 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
30460 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b  E_GROUPBY)==0 ){
30470 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
30480 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f  Make sure the so
30490 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70  rt order is comp
304a0 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44  atible in an ORD
304b0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
304c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72            ** Sor
304d0 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c  t order is irrel
304e0 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55  evant for a GROU
304f0 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a  P BY clause. */.
30500 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30510 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20  revSet ){.      
30520 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76          if( (rev
30530 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64   ^ revIdx)!=pOrd
30540 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
30550 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rder ) return 0;
30560 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
30570 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
30580 20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e    rev = revIdx ^
30590 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
305a0 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  sortOrder;.     
305b0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
305c0 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20   ) *pRevMask |= 
305d0 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a  MASKBIT(iLoop);.
305e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
305f0 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  vSet = 1;.      
30600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30610 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
30620 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
30630 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a  No match found *
30640 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
30650 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 43 6f 6c 75 6d  j==0 || j<nColum
30660 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
30670 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
30680 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b  erDistinct!=0 );
30690 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
306a0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
306b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
306c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
306d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
306e0 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65   /* end Loop ove
306f0 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  r all index colu
30700 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  mns */.      if(
30710 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
30720 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
30730 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
30740 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
30750 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
30760 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nct = 1;.      }
30770 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66  .    } /* end-if
30780 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a   not one-row */.
30790 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
307a0 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52   any other ORDER
307b0 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72   BY terms that r
307c0 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a  eference pLoop *
307d0 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65  /.    if( isOrde
307e0 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
307f0 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74     orderDistinct
30800 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  Mask |= pLoop->m
30810 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66  askSelf;.      f
30820 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
30830 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
30840 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20    Expr *p;.     
30850 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
30860 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
30870 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20  inue;.        p 
30880 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
30890 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
308a0 69 66 28 20 28 65 78 70 72 54 61 62 6c 65 55 73  if( (exprTableUs
308b0 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  age(&pWInfo->sMa
308c0 73 6b 53 65 74 2c 20 70 29 26 7e 6f 72 64 65 72  skSet, p)&~order
308d0 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30  DistinctMask)==0
308e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62   ){.          ob
308f0 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
30900 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
30910 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f     }.    }.  } /
30920 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f  * End the loop o
30930 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  ver all WhereLoo
30940 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f  ps from outer-mo
30950 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72  st down to inner
30960 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f  -most */.  if( o
30970 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72  bSat==obDone ) r
30980 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21  eturn 1;.  if( !
30990 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
309a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
309b0 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64  turn -1;.}..#ifd
309c0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
309d0 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62  ABLED./* For deb
309e0 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a  ugging use only:
309f0 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
30a00 20 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68   char *wherePath
30a10 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a  Name(WherePath *
30a20 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70  pPath, int nLoop
30a30 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61  , WhereLoop *pLa
30a40 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  st){.  static ch
30a50 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20  ar zName[65];.  
30a60 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
30a70 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b  ; i<nLoop; i++){
30a80 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74   zName[i] = pPat
30a90 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64  h->aLoop[i]->cId
30aa0 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20  ; }.  if( pLast 
30ab0 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70  ) zName[i++] = p
30ac0 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61  Last->cId;.  zNa
30ad0 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74  me[i] = 0;.  ret
30ae0 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e  urn zName;.}.#en
30af0 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  dif.../*.** Give
30b00 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68  n the list of Wh
30b10 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
30b20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  at pWInfo->pLoop
30b30 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  s, this routine.
30b40 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ** attempts to f
30b50 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
30b60 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69  ost path that vi
30b70 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c  sits each WhereL
30b80 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68  oop.** once.  Th
30b90 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20  is path is then 
30ba0 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20  loaded into the 
30bb0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f  pWInfo->a[].pWLo
30bc0 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a  op fields..**.**
30bd0 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   Assume that the
30be0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
30bf0 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68 61   output rows tha
30c00 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  t will need to b
30c10 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c  e sorted.** will
30c20 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20   be nRowEst (in 
30c30 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72  the 10*log2 repr
30c40 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72  esentation).  Or
30c50 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67  , ignore sorting
30c60 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f  .** costs if nRo
30c70 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52  wEst==0..**.** R
30c80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
30c90 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53 51  on success or SQ
30ca0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20  LITE_NOMEM of a 
30cb0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
30cc0 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  n.** error occur
30cd0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
30ce0 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
30cf0 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
30d00 66 6f 2c 20 57 68 65 72 65 43 6f 73 74 20 6e 52  fo, WhereCost nR
30d10 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78  owEst){.  int mx
30d20 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20  Choice;         
30d30 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
30d40 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61  umber of simulta
30d50 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61 63  neous paths trac
30d60 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ked */.  int nLo
30d70 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
30d80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30d90 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69  terms in the joi
30da0 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  n */.  Parse *pP
30db0 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
30dc0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
30dd0 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
30de0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
30df0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
30e00 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
30e10 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20  .  int iLoop;   
30e20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30e30 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65  Loop counter ove
30e40 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  r the terms of t
30e50 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74  he join */.  int
30e60 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20   ii, jj;        
30e70 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
30e80 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
30e90 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20   mxI = 0;       
30ea0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
30eb0 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f  of next entry to
30ec0 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 57 68   replace */.  Wh
30ed0 65 72 65 43 6f 73 74 20 72 43 6f 73 74 3b 20 20  ereCost rCost;  
30ee0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
30ef0 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a 20 20 57  of a path */.  W
30f00 68 65 72 65 43 6f 73 74 20 6e 4f 75 74 3b 20 20  hereCost nOut;  
30f10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30f20 65 72 20 6f 66 20 6f 75 74 70 75 74 73 20 2a 2f  er of outputs */
30f30 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6d 78 43  .  WhereCost mxC
30f40 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ost = 0;     /* 
30f50 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20  Maximum cost of 
30f60 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a  a set of paths *
30f70 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6d 78  /.  WhereCost mx
30f80 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Out = 0;      /*
30f90 20 4d 61 78 69 6d 75 6d 20 6e 4f 75 74 20 76 61   Maximum nOut va
30fa0 6c 75 65 20 6f 6e 20 74 68 65 20 73 65 74 20 6f  lue on the set o
30fb0 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 57 68 65  f paths */.  Whe
30fc0 72 65 43 6f 73 74 20 72 53 6f 72 74 43 6f 73 74  reCost rSortCost
30fd0 3b 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 74  ;      /* Cost t
30fe0 6f 20 64 6f 20 61 20 73 6f 72 74 20 2a 2f 0a 20  o do a sort */. 
30ff0 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b   int nTo, nFrom;
31000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
31010 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e  mber of valid en
31020 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61  tries in aTo[] a
31030 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20  nd aFrom[] */.  
31040 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d  WherePath *aFrom
31050 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ;         /* All
31060 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20   nFrom paths at 
31070 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76  the previous lev
31080 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  el */.  WherePat
31090 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20  h *aTo;         
310a0 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73    /* The nTo bes
310b0 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20 63  t paths at the c
310c0 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a  urrent level */.
310d0 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46 72    WherePath *pFr
310e0 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
310f0 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72  n element of aFr
31100 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65  om[] that we are
31110 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
31120 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b   WherePath *pTo;
31130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
31140 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b   element of aTo[
31150 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f  ] that we are wo
31160 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68  rking on */.  Wh
31170 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b  ereLoop *pWLoop;
31180 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
31190 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
311a0 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65  objects */.  Whe
311b0 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20  reLoop **pX;    
311c0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
311d0 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70 53  o divy up the pS
311e0 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  pace memory */. 
311f0 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20   char *pSpace;  
31200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
31210 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75  mporary memory u
31220 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  sed by this rout
31230 69 6e 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ine */..  pParse
31240 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
31250 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
31260 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20  ->db;.  nLoop = 
31270 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a  pWInfo->nLevel;.
31280 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72    /* TUNING: For
31290 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c   simple queries,
312a0 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70   only the best p
312b0 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a  ath is tracked..
312c0 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a    ** For 2-way j
312d0 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74  oins, the 5 best
312e0 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f   paths are follo
312f0 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f  wed..  ** For jo
31300 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65  ins of 3 or more
31310 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74   tables, track t
31320 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73  he 10 best paths
31330 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d   */.  mxChoice =
31340 20 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20 31 20   (nLoop==1) ? 1 
31350 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20  : (nLoop==2 ? 5 
31360 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28  : 10);.  assert(
31370 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e   nLoop<=pWInfo->
31380 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
31390 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
313a0 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67  x002, ("---- beg
313b0 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a  in solver\n"));.
313c0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
313d0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70  nd initialize sp
313e0 61 63 65 20 66 6f 72 20 61 54 6f 20 61 6e 64 20  ace for aTo and 
313f0 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d 20  aFrom */.  ii = 
31400 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74  (sizeof(WherePat
31410 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  h)+sizeof(WhereL
31420 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43  oop*)*nLoop)*mxC
31430 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53 70 61 63  hoice*2;.  pSpac
31440 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
31450 6c 6f 63 52 61 77 28 64 62 2c 20 69 69 29 3b 0a  locRaw(db, ii);.
31460 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20    if( pSpace==0 
31470 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
31480 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28  NOMEM;.  aTo = (
31490 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63  WherePath*)pSpac
314a0 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f  e;.  aFrom = aTo
314b0 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d  +mxChoice;.  mem
314c0 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69  set(aFrom, 0, si
314d0 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b  zeof(aFrom[0]));
314e0 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f  .  pX = (WhereLo
314f0 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68  op**)(aFrom+mxCh
31500 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  oice);.  for(ii=
31510 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f  mxChoice*2, pFro
31520 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d  m=aTo; ii>0; ii-
31530 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b  -, pFrom++, pX +
31540 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46  = nLoop){.    pF
31550 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b  rom->aLoop = pX;
31560 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 64 20  .  }..  /* Seed 
31570 74 68 65 20 73 65 61 72 63 68 20 77 69 74 68 20  the search with 
31580 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61  a single WherePa
31590 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65  th containing ze
315a0 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20  ro WhereLoops.. 
315b0 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a   **.  ** TUNING:
315c0 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20   Do not let the 
315d0 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74  number of iterat
315e0 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 35  ions go above 25
315f0 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20  .  If the cost. 
31600 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67   ** of computing
31610 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
31620 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20  dex is not paid 
31630 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20  back within the 
31640 66 69 72 73 74 20 32 35 0a 20 20 2a 2a 20 72 6f  first 25.  ** ro
31650 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ws, then do not 
31660 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  use the automati
31670 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46  c index. */.  aF
31680 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49  rom[0].nRow = MI
31690 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  N(pParse->nQuery
316a0 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73 73 65  Loop, 46);  asse
316b0 72 74 28 20 34 36 3d 3d 77 68 65 72 65 43 6f 73  rt( 46==whereCos
316c0 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72 6f 6d  t(25) );.  nFrom
316d0 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50 72 65 63   = 1;..  /* Prec
316e0 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 73 74 20  ompute the cost 
316f0 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20 66  of sorting the f
31700 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 65 74 2c  inal result set,
31710 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 0a 20   if the caller. 
31720 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 57 68   ** to sqlite3Wh
31730 65 72 65 42 65 67 69 6e 28 29 20 77 61 73 20 63  ereBegin() was c
31740 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 73  oncerned about s
31750 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 72 53 6f 72  orting */.  rSor
31760 74 43 6f 73 74 20 3d 20 30 3b 0a 20 20 69 66 28  tCost = 0;.  if(
31770 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
31780 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d  y==0 || nRowEst=
31790 3d 30 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 5b  =0 ){.    aFrom[
317a0 30 5d 2e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  0].isOrderedVali
317b0 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
317c0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45      /* TUNING: E
317d0 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66  stimated cost of
317e0 20 73 6f 72 74 69 6e 67 20 69 73 20 4e 2a 6c 6f   sorting is N*lo
317f0 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73  g2(N) where N is
31800 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
31810 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
31820 73 2e 20 2a 2f 0a 20 20 20 20 72 53 6f 72 74 43  s. */.    rSortC
31830 6f 73 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20  ost = nRowEst + 
31840 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73 74 29 3b  estLog(nRowEst);
31850 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
31860 30 78 30 30 32 2c 28 22 2d 2d 2d 2d 20 73 6f 72  0x002,("---- sor
31870 74 20 63 6f 73 74 3d 25 2d 33 64 5c 6e 22 2c 20  t cost=%-3d\n", 
31880 72 53 6f 72 74 43 6f 73 74 29 29 3b 0a 20 20 7d  rSortCost));.  }
31890 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73  ..  /* Compute s
318a0 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67  uccessively long
318b0 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73  er WherePaths us
318c0 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73  ing the previous
318d0 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a   generation.  **
318e0 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61   of WherePaths a
318f0 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20  s the basis for 
31900 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20  the next.  Keep 
31910 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43  track of the mxC
31920 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20  hoice.  ** best 
31930 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65  paths at each ge
31940 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f  neration */.  fo
31950 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70  r(iLoop=0; iLoop
31960 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  <nLoop; iLoop++)
31970 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20  {.    nTo = 0;. 
31980 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72     for(ii=0, pFr
31990 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72  om=aFrom; ii<nFr
319a0 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b  om; ii++, pFrom+
319b0 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57  +){.      for(pW
319c0 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Loop=pWInfo->pLo
319d0 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c  ops; pWLoop; pWL
319e0 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78  oop=pWLoop->pNex
319f0 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20  tLoop){.        
31a00 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b  Bitmask maskNew;
31a10 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
31a20 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20   revMask = 0;.  
31a30 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65 72        u8 isOrder
31a40 65 64 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d 2d  edValid = pFrom-
31a50 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b  >isOrderedValid;
31a60 0a 20 20 20 20 20 20 20 20 75 38 20 69 73 4f 72  .        u8 isOr
31a70 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69  dered = pFrom->i
31a80 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20  sOrdered;.      
31a90 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70    if( (pWLoop->p
31aa0 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e  rereq & ~pFrom->
31ab0 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
31ac0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
31ad0 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61   if( (pWLoop->ma
31ae0 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e  skSelf & pFrom->
31af0 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
31b00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
31b10 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
31b20 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63  t, pWLoop is a c
31b30 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74  andidate to be t
31b40 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20  he next loop. . 
31b50 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74         ** Comput
31b60 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20  e its cost */.  
31b70 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68        rCost = wh
31b80 65 72 65 43 6f 73 74 41 64 64 28 70 57 4c 6f 6f  ereCostAdd(pWLoo
31b90 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70  p->rSetup,pWLoop
31ba0 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e  ->rRun + pFrom->
31bb0 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72  nRow);.        r
31bc0 43 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74  Cost = whereCost
31bd0 41 64 64 28 72 43 6f 73 74 2c 20 70 46 72 6f 6d  Add(rCost, pFrom
31be0 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  ->rCost);.      
31bf0 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e    nOut = pFrom->
31c00 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e  nRow + pWLoop->n
31c10 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73  Out;.        mas
31c20 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61  kNew = pFrom->ma
31c30 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d  skLoop | pWLoop-
31c40 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
31c50 20 20 20 69 66 28 20 21 69 73 4f 72 64 65 72 65     if( !isOrdere
31c60 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  dValid ){.      
31c70 20 20 20 20 73 77 69 74 63 68 28 20 77 68 65 72      switch( wher
31c80 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
31c90 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20  derBy(pWInfo,.  
31ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cb0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
31cc0 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57  derBy, pFrom, pW
31cd0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
31ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31cf0 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20           iLoop, 
31d00 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b  pWLoop, &revMask
31d10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
31d20 20 63 61 73 65 20 31 3a 20 20 2f 2a 20 59 65 73   case 1:  /* Yes
31d30 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20  .  pFrom+pWLoop 
31d40 64 6f 65 73 20 73 61 74 69 73 66 79 20 74 68 65  does satisfy the
31d50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
31d60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
31d70 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 31 3b    isOrdered = 1;
31d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
31d90 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20  sOrderedValid = 
31da0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
31db0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
31dc0 20 20 20 20 63 61 73 65 20 30 3a 20 20 2f 2a 20      case 0:  /* 
31dd0 4e 6f 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f  No.  pFrom+pWLoo
31de0 70 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  p will require a
31df0 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 2a   separate sort *
31e00 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
31e10 69 73 4f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20  isOrdered = 0;. 
31e20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
31e30 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b  rderedValid = 1;
31e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
31e50 43 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74  Cost = whereCost
31e60 41 64 64 28 72 43 6f 73 74 2c 20 72 53 6f 72 74  Add(rCost, rSort
31e70 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Cost);.         
31e80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
31e90 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
31ea0 20 2f 2a 20 43 61 6e 6e 6f 74 20 74 65 6c 6c 20   /* Cannot tell 
31eb0 79 65 74 2e 20 20 54 72 79 20 61 67 61 69 6e 20  yet.  Try again 
31ec0 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  on the next iter
31ed0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
31ee0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
31ef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31f00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31f10 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72     revMask = pFr
31f20 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20  om->revLoop;.   
31f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
31f40 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
31f50 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20  f pWLoop should 
31f60 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
31f70 6d 78 43 68 6f 69 63 65 20 62 65 73 74 20 73 6f  mxChoice best so
31f80 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
31f90 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54  for(jj=0, pTo=aT
31fa0 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c  o; jj<nTo; jj++,
31fb0 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
31fc0 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b     if( pTo->mask
31fd0 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20  Loop==maskNew.  
31fe0 20 20 20 20 20 20 20 20 20 26 26 20 70 54 6f 2d           && pTo-
31ff0 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3d  >isOrderedValid=
32000 3d 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 0a  =isOrderedValid.
32010 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28             && ((
32020 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73  pTo->rCost<=rCos
32030 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d  t && pTo->nRow<=
32040 6e 4f 75 74 29 20 7c 7c 0a 20 20 20 20 20 20 20  nOut) ||.       
32050 20 20 20 20 20 20 20 20 20 28 70 54 6f 2d 3e 72           (pTo->r
32060 43 6f 73 74 3e 3d 72 43 6f 73 74 20 26 26 20 70  Cost>=rCost && p
32070 54 6f 2d 3e 6e 52 6f 77 3e 3d 6e 4f 75 74 29 29  To->nRow>=nOut))
32080 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
32090 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
320a0 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b  se( jj==nTo-1 );
320b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
320c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
320d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
320e0 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b    if( jj>=nTo ){
320f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
32100 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 0a 20 20  To>=mxChoice .  
32110 20 20 20 20 20 20 20 20 20 26 26 20 28 72 43 6f           && (rCo
32120 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43  st>mxCost || (rC
32130 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 6e  ost==mxCost && n
32140 4f 75 74 3e 3d 6d 78 4f 75 74 29 29 0a 20 20 20  Out>=mxOut)).   
32150 20 20 20 20 20 20 20 29 7b 0a 23 69 66 64 65 66         ){.#ifdef
32160 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
32170 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20  LED.            
32180 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
32190 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
321a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
321b0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53  e3DebugPrintf("S
321c0 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
321d0 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
321e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
321f0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
32200 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
32210 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
32220 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
32230 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
32240 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72  redValid ? (isOr
32250 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
32260 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
32270 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
32280 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
32290 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
322a0 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  }.          /* A
322b0 64 64 20 61 20 6e 65 77 20 50 61 74 68 20 74 6f  dd a new Path to
322c0 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74 20 2a   the aTo[] set *
322d0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
322e0 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a  nTo<mxChoice ){.
322f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
32300 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
32310 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20   of the aTo set 
32320 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  by one */.      
32330 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b        jj = nTo++
32340 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
32350 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
32360 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61  * New path repla
32370 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f  ces the prior wo
32380 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e  rst to keep coun
32390 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65  t below mxChoice
323a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
323b0 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20  jj = mxI;.      
323c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
323d0 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a  pTo = &aTo[jj];.
323e0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
323f0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
32400 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
32410 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
32420 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
32430 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
32440 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74 3d  "New    %s cost=
32450 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
32460 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
32470 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
32480 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
32490 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
324a0 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
324b0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
324c0 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65  dValid ? (isOrde
324d0 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
324e0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
324f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
32500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32510 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
32520 6f 73 74 3c 3d 72 43 6f 73 74 20 26 26 20 70 54  ost<=rCost && pT
32530 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 20 29 7b  o->nRow<=nOut ){
32540 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
32550 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
32560 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
32570 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
32580 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32590 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
325a0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
325b0 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20          "Skip   
325c0 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
325d0 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
325e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
325f0 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
32600 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
32610 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
32620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32630 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
32640 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20   ? (isOrdered ? 
32650 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
32660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
32670 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
32680 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f  ntf("   vs %s co
32690 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72  st=%-3d,%d order
326a0 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
326b0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
326c0 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
326d0 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
326e0 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
326f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32700 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
32710 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69  dValid ? (pTo->i
32720 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
32730 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
32740 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
32750 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  if.            t
32760 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
32770 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20  ost==rCost );.  
32780 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
32790 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
327a0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
327b0 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
327c0 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20  rCost+1 );.     
327d0 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 61 6e       /* A new an
327e0 64 20 62 65 74 74 65 72 20 73 63 6f 72 65 20 66  d better score f
327f0 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20  or a previously 
32800 63 72 65 61 74 65 64 20 65 71 75 69 76 61 6c 65  created equivale
32810 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69 66 64 65  nt path */.#ifde
32820 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
32830 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20 69  BLED.          i
32840 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
32850 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
32860 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
32870 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
32880 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64              "Upd
32890 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  ate %s cost=%-3d
328a0 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  ,%3d order=%c",.
328b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328c0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
328d0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
328e0 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
328f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
32900 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
32910 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20   ? (isOrdered ? 
32920 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
32930 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
32940 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
32950 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74  f("  was %s cost
32960 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
32970 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
32980 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
32990 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
329a0 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
329b0 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
329c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
329d0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
329e0 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65  d ? (pTo->isOrde
329f0 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
32a00 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
32a10 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
32a20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
32a30 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e   pWLoop is a win
32a40 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20  ner.  Add it to 
32a50 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20  the set of best 
32a60 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
32a70 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20    pTo->maskLoop 
32a80 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
32a90 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
32aa0 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54  Self;.        pT
32ab0 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76  o->revLoop = rev
32ac0 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  Mask;.        pT
32ad0 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a  o->nRow = nOut;.
32ae0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f          pTo->rCo
32af0 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20  st = rCost;.    
32b00 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
32b10 65 64 56 61 6c 69 64 20 3d 20 69 73 4f 72 64 65  edValid = isOrde
32b20 72 65 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20  redValid;.      
32b30 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
32b40 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20   = isOrdered;.  
32b50 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f        memcpy(pTo
32b60 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e  ->aLoop, pFrom->
32b70 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68  aLoop, sizeof(Wh
32b80 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29  ereLoop*)*iLoop)
32b90 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61  ;.        pTo->a
32ba0 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57  Loop[iLoop] = pW
32bb0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  Loop;.        if
32bc0 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20  ( nTo>=mxChoice 
32bd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49  ){.          mxI
32be0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
32bf0 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e  mxCost = aTo[0].
32c00 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20  rCost;.         
32c10 20 6d 78 4f 75 74 20 3d 20 61 54 6f 5b 30 5d 2e   mxOut = aTo[0].
32c20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nRow;.          
32c30 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61  for(jj=1, pTo=&a
32c40 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69  To[1]; jj<mxChoi
32c50 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  ce; jj++, pTo++)
32c60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
32c70 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43  ( pTo->rCost>mxC
32c80 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f  ost || (pTo->rCo
32c90 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54  st==mxCost && pT
32ca0 6f 2d 3e 6e 52 6f 77 3e 6d 78 4f 75 74 29 20 29  o->nRow>mxOut) )
32cb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
32cc0 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43  mxCost = pTo->rC
32cd0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ost;.           
32ce0 20 20 20 6d 78 4f 75 74 20 3d 20 70 54 6f 2d 3e     mxOut = pTo->
32cf0 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nRow;.          
32d00 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20      mxI = jj;.  
32d10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32d30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
32d40 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
32d50 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
32d60 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
32d70 72 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20 20 20  race>=2 ){.     
32d80 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
32d90 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20  ntf("---- after 
32da0 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22  round %d ----\n"
32db0 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  , iLoop);.      
32dc0 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54  for(ii=0, pTo=aT
32dd0 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c  o; ii<nTo; ii++,
32de0 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
32df0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
32e00 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d  ntf(" %s cost=%-
32e10 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64  3d nrow=%-3d ord
32e20 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
32e30 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
32e40 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
32e50 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
32e60 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
32e70 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
32e80 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d  redValid ? (pTo-
32e90 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  >isOrdered ? 'Y'
32ea0 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
32eb0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
32ec0 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  >isOrderedValid 
32ed0 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  && pTo->isOrdere
32ee0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
32ef0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
32f00 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e  f(" rev=0x%llx\n
32f10 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29  ", pTo->revLoop)
32f20 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
32f30 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
32f40 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
32f50 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n");.        }. 
32f60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
32f70 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70  dif..    /* Swap
32f80 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46   the roles of aF
32f90 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20  rom and aTo for 
32fa0 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74  the next generat
32fb0 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d  ion */.    pFrom
32fc0 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20   = aTo;.    aTo 
32fd0 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72  = aFrom;.    aFr
32fe0 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20  om = pFrom;.    
32ff0 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d  nFrom = nTo;.  }
33000 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30  ..  if( nFrom==0
33010 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
33020 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
33030 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69  "no query soluti
33040 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  on");.    sqlite
33050 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61  3DbFree(db, pSpa
33060 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ce);.    return 
33070 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
33080 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74  }.  .  /* Find t
33090 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
330a0 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c  ath.  pFrom will
330b0 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   be left pointin
330c0 67 20 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a  g to that path *
330d0 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f  /.  pFrom = aFro
330e0 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69  m;.  for(ii=1; i
330f0 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a  i<nFrom; ii++){.
33100 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72      if( pFrom->r
33110 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72  Cost>aFrom[ii].r
33120 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26  Cost ) pFrom = &
33130 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20  aFrom[ii];.  }. 
33140 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
33150 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29  >nLevel==nLoop )
33160 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ;.  /* Load the 
33170 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
33180 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a   into pWInfo */.
33190 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
331a0 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  Loop<nLoop; iLoo
331b0 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c  p++){.    WhereL
331c0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70  evel *pLevel = p
331d0 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70  WInfo->a + iLoop
331e0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57  ;.    pLevel->pW
331f0 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20  Loop = pWLoop = 
33200 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f  pFrom->aLoop[iLo
33210 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  op];.    pLevel-
33220 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d  >iFrom = pWLoop-
33230 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65  >iTab;.    pLeve
33240 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49  l->iTabCur = pWI
33250 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
33260 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e  [pLevel->iFrom].
33270 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69  iCursor;.  }.  i
33280 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
33290 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
332a0 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30  ANT_DISTINCT)!=0
332b0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
332c0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
332d0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d  RE_DISTINCTBY)==
332e0 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e  0.   && pWInfo->
332f0 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45  eDistinct==WHERE
33300 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20  _DISTINCT_NOOP. 
33310 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20 29    && nRowEst.  )
33320 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f  {.    Bitmask no
33330 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20 72  tUsed;.    int r
33340 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74  c = wherePathSat
33350 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
33360 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52  Info, pWInfo->pR
33370 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c  esultSet, pFrom,
33380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33390 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54    WHERE_DISTINCT
333a0 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72  BY, nLoop-1, pFr
333b0 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d  om->aLoop[nLoop-
333c0 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20  1], &notUsed);. 
333d0 20 20 20 69 66 28 20 72 63 3d 3d 31 20 29 20 70     if( rc==1 ) p
333e0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
333f0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
33400 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 7d 0a 20  T_ORDERED;.  }. 
33410 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72   if( pFrom->isOr
33420 64 65 72 65 64 20 29 7b 0a 20 20 20 20 69 66 28  dered ){.    if(
33430 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
33440 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
33450 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20  INCTBY ){.      
33460 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
33470 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
33480 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
33490 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49  }else{.      pWI
334a0 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b  nfo->bOBSat = 1;
334b0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  .      pWInfo->r
334c0 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
334d0 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20  revLoop;.    }. 
334e0 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f   }.  pWInfo->nRo
334f0 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52  wOut = pFrom->nR
33500 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  ow;..  /* Free t
33510 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
33520 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65  and return succe
33530 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  ss */.  sqlite3D
33540 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65  bFree(db, pSpace
33550 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
33560 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
33570 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65  Most queries use
33580 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
33590 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e  able (they are n
335a0 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61  ot joins) and ha
335b0 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20  ve.** simple == 
335c0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69  constraints agai
335d0 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c  nst indexed fiel
335e0 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ds.  This routin
335f0 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  e attempts.** to
33600 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70   plan those simp
33610 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d  le cases using m
33620 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e  uch less ceremon
33630 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65  y than the.** ge
33640 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75  neral-purpose qu
33650 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64  ery planner, and
33660 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66   thereby yield f
33670 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72  aster sqlite3_pr
33680 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73  epare().** times
33690 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
336a0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  case..**.** Retu
336b0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73  rn non-zero on s
336c0 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20  uccess, if this 
336d0 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e  query can be han
336e0 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20  dled by this.** 
336f0 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20  no-frills query 
33700 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e  planner.  Return
33710 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75   zero if this qu
33720 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a  ery needs the .*
33730 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
33740 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  e query planner.
33750 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
33760 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65  hereShortCut(Whe
33770 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
33780 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72  Builder){.  Wher
33790 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
337a0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
337b0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57  item *pItem;.  W
337c0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
337d0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
337e0 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  erm;.  WhereLoop
337f0 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69   *pLoop;.  int i
33800 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  Cur;.  int j;.  
33810 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
33820 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20  ndex *pIdx;.  . 
33830 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
33840 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66  er->pWInfo;.  if
33850 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
33860 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52  lags & WHERE_FOR
33870 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72  CE_TABLE ) retur
33880 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
33890 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
338a0 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49  >nSrc>=1 );.  pI
338b0 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
338c0 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61  abList->a;.  pTa
338d0 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
338e0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
338f0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
33900 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  0;.  if( pItem->
33910 7a 49 6e 64 65 78 20 29 20 72 65 74 75 72 6e 20  zIndex ) return 
33920 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  0;.  iCur = pIte
33930 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57  m->iCursor;.  pW
33940 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
33950 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69  ;.  pLoop = pBui
33960 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c  lder->pNew;.  pL
33970 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30  oop->wsFlags = 0
33980 3b 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64  ;.  pTerm = find
33990 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
339a0 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30 29  -1, 0, WO_EQ, 0)
339b0 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b  ;.  if( pTerm ){
339c0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
339d0 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
339e0 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c  MN_EQ|WHERE_IPK|
339f0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
33a00 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
33a10 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
33a20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
33a30 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  1;.    pLoop->u.
33a40 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
33a50 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
33a60 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f  st of a rowid lo
33a70 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20  okup is 10 */.  
33a80 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
33a90 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 77 68 65 72  33;  /* 33==wher
33aa0 65 43 6f 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d  eCost(10) */.  }
33ab0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49  else{.    for(pI
33ac0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
33ad0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
33ae0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
33af0 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
33b00 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f  LTermSpace==pLoo
33b10 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20  p->aLTerm );.   
33b20 20 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79     assert( Array
33b30 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65  Size(pLoop->aLTe
33b40 72 6d 53 70 61 63 65 29 3d 3d 34 20 29 3b 0a 20  rmSpace)==4 );. 
33b50 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
33b60 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
33b70 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d  .       || pIdx-
33b80 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
33b90 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64  0 .       || pId
33ba0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 41 72 72 61 79  x->nColumn>Array
33bb0 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65  Size(pLoop->aLTe
33bc0 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20 20  rmSpace) .      
33bd0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
33be0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
33bf0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  x->nColumn; j++)
33c00 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  {.        pTerm 
33c10 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
33c20 69 43 75 72 2c 20 70 49 64 78 2d 3e 61 69 43 6f  iCur, pIdx->aiCo
33c30 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45  lumn[j], 0, WO_E
33c40 51 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  Q, pIdx);.      
33c50 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
33c60 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
33c70 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
33c80 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
33c90 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70  }.      if( j!=p
33ca0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63  Idx->nColumn ) c
33cb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
33cc0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
33cd0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
33ce0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45  WHERE_ONEROW|WHE
33cf0 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
33d00 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 63 6f    if( (pItem->co
33d10 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73  lUsed & ~columns
33d20 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d  InIndex(pIdx))==
33d30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  0 ){.        pLo
33d40 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
33d50 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
33d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f       }.      pLo
33d70 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a  op->nLTerm = j;.
33d80 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
33d90 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20  tree.nEq = j;.  
33da0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
33db0 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
33dc0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
33dd0 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69  G: Cost of a uni
33de0 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  que index lookup
33df0 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20   is 15 */.      
33e00 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39  pLoop->rRun = 39
33e10 3b 20 20 2f 2a 20 33 39 3d 3d 77 68 65 72 65 43  ;  /* 39==whereC
33e20 6f 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20  ost(15) */.     
33e30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
33e40 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  }.  if( pLoop->w
33e50 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c  sFlags ){.    pL
33e60 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 57 68 65  oop->nOut = (Whe
33e70 72 65 43 6f 73 74 29 31 3b 0a 20 20 20 20 70 57  reCost)1;.    pW
33e80 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
33e90 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70  p = pLoop;.    p
33ea0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  Loop->maskSelf =
33eb0 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
33ec0 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
33ed0 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  );.    pWInfo->a
33ee0 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43  [0].iTabCur = iC
33ef0 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ur;.    pWInfo->
33f00 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20  nRowOut = 1;.   
33f10 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
33f20 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
33f30 62 4f 42 53 61 74 20 3d 20 20 31 3b 0a 20 20 20  bOBSat =  1;.   
33f40 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
33f50 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
33f60 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
33f70 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
33f80 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
33f90 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
33fa0 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
33fb0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
33fc0 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27  pLoop->cId = '0'
33fd0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
33fe0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
33ff0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
34000 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67  Generate the beg
34010 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f  inning of the lo
34020 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52  op used for WHER
34030 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
34040 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ing..** The retu
34050 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f  rn value is a po
34060 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71  inter to an opaq
34070 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ue structure tha
34080 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e  t contains.** in
34090 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64  formation needed
340a0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
340b0 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20  e loop.  Later, 
340c0 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
340d0 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e  ine.** should in
340e0 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72  voke sqlite3Wher
340f0 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20  eEnd() with the 
34100 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
34110 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
34120 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d   in order to com
34130 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20  plete the WHERE 
34140 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
34150 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
34160 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69  rror occurs, thi
34170 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
34180 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
34190 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20  e basic idea is 
341a0 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c  to do a nested l
341b0 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f  oop, one loop fo
341c0 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a  r each table in.
341d0 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
341e0 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20  se of a select. 
341f0 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44   (INSERT and UPD
34200 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ATE statements a
34210 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  re the.** same a
34220 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20  s a SELECT with 
34230 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
34240 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
34250 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a  clause.)  For.**
34260 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
34270 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a   SQL is this:.**
34280 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54  .**       SELECT
34290 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20   * FROM t1, t2, 
342a0 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a  t3 WHERE ...;.**
342b0 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64  .** Then the cod
342c0 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63  e generated is c
342d0 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65  onceptually like
342e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
342f0 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61  **.**      forea
34300 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
34310 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
34320 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
34330 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
34340 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20  2 in t2 do      
34350 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
34360 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20  ereBegin().**   
34370 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
34380 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f  ow3 in t3 do   /
34390 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e  .**            .
343a0 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65  ...**          e
343b0 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
343c0 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
343d0 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
343e0 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
343f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34400 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
34410 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20  ereEnd().**     
34420 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
34430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
34440 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
34450 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e  he loops might n
34460 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20  ot be nested in 
34470 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69  the order in whi
34480 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61  ch they.** appea
34490 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
344a0 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72  ause if a differ
344b0 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74  ent order is bet
344c0 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65  ter able to make
344d0 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63  .** use of indic
344e0 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  es.  Note also t
344f0 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20  hat when the IN 
34500 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73  operator appears
34510 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45   in.** the WHERE
34520 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68   clause, it migh
34530 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69  t result in addi
34540 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f  tional nested lo
34550 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e  ops for.** scann
34560 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ing through all 
34570 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69  values on the ri
34580 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
34590 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54   the IN..**.** T
345a0 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63  here are Btree c
345b0 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
345c0 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c  d with each tabl
345d0 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73  e.  t1 uses curs
345e0 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61  or.** number pTa
345f0 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  bList->a[0].iCur
34600 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68  sor.  t2 uses th
34610 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73  e cursor pTabLis
34620 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e  t->a[1].iCursor.
34630 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  .** And so forth
34640 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
34650 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
34660 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42  o open those VDB
34670 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64  E cursors.** and
34680 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
34690 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  () generates the
346a0 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74   code to close t
346b0 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  hem..**.** The c
346c0 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
346d0 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e  WhereBegin() gen
346e0 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68  erates leaves th
346f0 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a  e cursors named.
34700 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70  ** in pTabList p
34710 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72  ointing at their
34720 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74   appropriate ent
34730 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d  ries.  The [...]
34740 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65   code.** can use
34750 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f   OP_Column and O
34760 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20  P_Rowid opcodes 
34770 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73  on these cursors
34780 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64   to extract.** d
34790 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72  ata from the var
347a0 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74  ious tables of t
347b0 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  he loop..**.** I
347c0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
347d0 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  se is empty, the
347e0 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d   foreach loops m
347f0 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68  ust each scan th
34800 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61  eir.** entire ta
34810 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68  bles.  Thus a th
34820 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20  ree-way join is 
34830 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74  an O(N^3) operat
34840 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20  ion.  But if.** 
34850 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20  the tables have 
34860 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72  indices and ther
34870 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74  e are terms in t
34880 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
34890 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f  that.** refer to
348a0 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20   those indices, 
348b0 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65  a complete table
348c0 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f   scan can be avo
348d0 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ided and the.** 
348e0 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75  code will run mu
348f0 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74  ch faster.  Most
34900 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   of the work of 
34910 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
34920 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73  checking.** to s
34930 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
34940 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e  indices that can
34950 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65   be used to spee
34960 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  d up the loop..*
34970 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68  *.** Terms of th
34980 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
34990 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20  re also used to 
349a0 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73  limit which rows
349b0 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b   actually.** mak
349c0 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e  e it to the "...
349d0 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  " in the middle 
349e0 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66  of the loop.  Af
349f0 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63  ter each "foreac
34a00 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20  h",.** terms of 
34a10 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
34a20 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74   that use only t
34a30 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f  erms in that loo
34a40 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c  p and outer.** l
34a50 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74  oops are evaluat
34a60 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20  ed and if false 
34a70 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61  a jump is made a
34a80 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71  round all subseq
34a90 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f  uent.** inner lo
34aa0 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74  ops (or around t
34ab0 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20  he "..." if the 
34ac0 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68  test occurs with
34ad0 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a  in the inner-.**
34ae0 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a   most loop).**.*
34af0 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a  * OUTER JOINS.**
34b00 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69  .** An outer joi
34b10 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61  n of tables t1 a
34b20 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74  nd t2 is concept
34b30 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f  ally coded as fo
34b40 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
34b50 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
34b60 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c  t1 do.**      fl
34b70 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66  ag = 0.**      f
34b80 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
34b90 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  2 do.**        s
34ba0 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20  tart:.**        
34bb0 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
34bc0 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20    flag = 1.**   
34bd0 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69     end.**      i
34be0 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a  f flag==0 then.*
34bf0 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68  *        move th
34c00 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f  e row2 cursor to
34c10 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20   a null row.**  
34c20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74        goto start
34c30 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20  .**      fi.**  
34c40 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45    end.**.** ORDE
34c50 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43  R BY CLAUSE PROC
34c60 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72  ESSING.**.** pOr
34c70 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74  derBy is a point
34c80 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  er to the ORDER 
34c90 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74 68  BY clause (or th
34ca0 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
34cb0 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52  e.** if the WHER
34cc0 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69  E_GROUPBY flag i
34cd0 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46 6c  s set in wctrlFl
34ce0 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43 54  ags) of a SELECT
34cf0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66   statement.** if
34d00 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
34d10 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  If there is no O
34d20 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
34d30 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  r if this routin
34d40 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66  e.** is called f
34d50 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72  rom an UPDATE or
34d60 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
34d70 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79  t, then pOrderBy
34d80 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 57 68 65   is NULL..*/.Whe
34d90 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
34da0 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
34db0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
34dc0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
34dd0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
34de0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
34df0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
34e00 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c  se: A list of al
34e10 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
34e20 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
34e30 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
34e40 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
34e50 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
34e60 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
34e70 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
34e80 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
34e90 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
34ea0 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65  ResultSet, /* Re
34eb0 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
34ec0 71 75 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77  query */.  u16 w
34ed0 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
34ee0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
34ef0 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66  HERE_* flags def
34f00 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
34f10 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  t.h */.  int iId
34f20 78 43 75 72 20 20 20 20 20 20 20 20 20 20 20 2f  xCur           /
34f30 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41  * If WHERE_ONETA
34f40 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c  BLE_ONLY is set,
34f50 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75   index cursor nu
34f60 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  mber */.){.  int
34f70 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20   nByteWInfo;    
34f80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20          /* Num. 
34f90 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
34fa0 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74  for WhereInfo st
34fb0 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ruct */.  int nT
34fc0 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
34fd0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
34fe0 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54  f elements in pT
34ff0 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72  abList */.  Wher
35000 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
35010 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62         /* Will b
35020 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e  ecome the return
35030 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
35040 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  unction */.  Vdb
35050 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
35060 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76  Vdbe;   /* The v
35070 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
35080 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d  engine */.  Bitm
35090 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20  ask notReady;   
350a0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
350b0 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79  s that are not y
350c0 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f  et positioned */
350d0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
350e0 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a  der sWLB;     /*
350f0 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62   The WhereLoop b
35100 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72  uilder */.  Wher
35110 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
35120 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78  et;    /* The ex
35130 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
35140 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  t */.  WhereLeve
35150 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20  l *pLevel;      
35160 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65    /* A single le
35170 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61  vel in pWInfo->a
35180 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
35190 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
351a0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
351b0 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c   a single WhereL
351c0 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
351d0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
351e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
351f0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
35200 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
35210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
35220 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
35230 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  n */.  int rc;  
35240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35250 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
35260 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61   */...  /* Varia
35270 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ble initializati
35280 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  on */.  db = pPa
35290 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65  rse->db;.  memse
352a0 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65  t(&sWLB, 0, size
352b0 6f 66 28 73 57 4c 42 29 29 3b 0a 20 20 73 57 4c  of(sWLB));.  sWL
352c0 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  B.pOrderBy = pOr
352d0 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73  derBy;..  /* Dis
352e0 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43  able the DISTINC
352f0 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  T optimization i
35300 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  f SQLITE_Distinc
35310 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61 0a  tOpt is set via.
35320 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    ** sqlite3_tes
35330 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45  t_ctrl(SQLITE_TE
35340 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
35350 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69  IONS,...) */.  i
35360 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
35370 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
35380 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20  TE_DistinctOpt) 
35390 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67  ){.    wctrlFlag
353a0 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54  s &= ~WHERE_WANT
353b0 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a  _DISTINCT;.  }..
353c0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
353d0 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
353e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
353f0 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e  limited by the n
35400 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69  umber of.  ** bi
35410 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20  ts in a Bitmask 
35420 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
35430 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
35440 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70  ==BMS );.  if( p
35450 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d  TabList->nSrc>BM
35460 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  S ){.    sqlite3
35470 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
35480 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62   "at most %d tab
35490 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20  les in a join", 
354a0 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  BMS);.    return
354b0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   0;.  }..  /* Th
354c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d  is function norm
354d0 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61  ally generates a
354e0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72   nested loop for
354f0 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a   all tables in .
35500 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20    ** pTabList.  
35510 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52 45  But if the WHERE
35520 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
35530 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
35540 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20   we should.  ** 
35550 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f  only generate co
35560 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  de for the first
35570 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
35580 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68  st and assume th
35590 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73  at.  ** any curs
355a0 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
355b0 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74  ith subsequent t
355c0 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74  ables are uninit
355d0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
355e0 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72  nTabList = (wctr
355f0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
35600 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20  NETABLE_ONLY) ? 
35610 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  1 : pTabList->nS
35620 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  rc;..  /* Alloca
35630 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
35640 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  e the WhereInfo 
35650 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
35660 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20  ill become the. 
35670 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
35680 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  . A single alloc
35690 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
356a0 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72 65   store the Where
356b0 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74  Info.  ** struct
356c0 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
356d0 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c  f WhereInfo.a[],
356e0 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
356f0 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
35700 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61 73  and the WhereMas
35710 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e 20  kSet structure. 
35720 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73  Since WhereClaus
35730 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d  e contains an 8-
35740 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20  byte.  ** field 
35750 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69  (type Bitmask) i
35760 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65  t must be aligne
35770 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62  d on an 8-byte b
35780 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20  oundary on.  ** 
35790 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75 72  some architectur
357a0 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f  es. Hence the RO
357b0 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20  UND8() below..  
357c0 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20  */.  nByteWInfo 
357d0 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
357e0 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62  WhereInfo)+(nTab
357f0 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57  List-1)*sizeof(W
35800 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70  hereLevel));.  p
35810 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  WInfo = sqlite3D
35820 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
35830 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a  nByteWInfo + siz
35840 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
35850 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
35860 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
35870 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
35880 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57   pWInfo);.    pW
35890 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f  Info = 0;.    go
358a0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
358b0 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  or;.  }.  pWInfo
358c0 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c  ->nLevel = nTabL
358d0 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  ist;.  pWInfo->p
358e0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
358f0 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
35900 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
35910 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
35920 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
35930 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
35940 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  et = pResultSet;
35950 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  .  pWInfo->iBrea
35960 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
35970 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70  akeLabel(v);.  p
35980 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
35990 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a  s = wctrlFlags;.
359a0 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e    pWInfo->savedN
359b0 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
359c0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
359d0 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57    pMaskSet = &pW
359e0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a  Info->sMaskSet;.
359f0 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20    sWLB.pWInfo = 
35a00 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70  pWInfo;.  sWLB.p
35a10 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
35a20 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d  C;.  sWLB.pNew =
35a30 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28   (WhereLoop*)(((
35a40 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42  char*)pWInfo)+nB
35a50 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73  yteWInfo);.  ass
35a60 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
35a70 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70  ALIGNMENT(sWLB.p
35a80 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c  New) );.  whereL
35a90 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65  oopInit(sWLB.pNe
35aa0 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  w);.#ifdef SQLIT
35ab0 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70  E_DEBUG.  sWLB.p
35ac0 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a  New->cId = '*';.
35ad0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c  #endif..  /* Spl
35ae0 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  it the WHERE cla
35af0 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74  use into separat
35b00 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
35b10 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a   where each.  **
35b20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
35b30 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61  s separated by a
35b40 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
35b50 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53    */.  initMaskS
35b60 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20  et(pMaskSet);.  
35b70 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
35b80 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57  &pWInfo->sWC, pW
35b90 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33  Info);.  sqlite3
35ba0 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74  ExprCodeConstant
35bb0 73 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  s(pParse, pWhere
35bc0 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28  );.  whereSplit(
35bd0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57  &pWInfo->sWC, pW
35be0 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20  here, TK_AND);. 
35bf0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
35c00 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
35c10 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20   -1); /* Insert 
35c20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
35c30 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 20 20  ier Goto */.    
35c40 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
35c50 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75  se: a WHERE clau
35c60 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  se that is const
35c70 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74  ant.  Evaluate t
35c80 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  he.  ** expressi
35c90 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75  on and either ju
35ca0 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  mp over all of t
35cb0 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20  he code or fall 
35cc0 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  thru..  */.  if(
35cd0 20 70 57 68 65 72 65 20 26 26 20 28 6e 54 61 62   pWhere && (nTab
35ce0 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  List==0 || sqlit
35cf0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
35d00 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29  NotJoin(pWhere))
35d10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
35d20 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
35d30 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66  e, pWhere, pWInf
35d40 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54  o->iBreak, SQLIT
35d50 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
35d60 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
35d70 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
35d80 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63   case: No FROM c
35d90 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28  lause.  */.  if(
35da0 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a   nTabList==0 ){.
35db0 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
35dc0 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61   ) pWInfo->bOBSa
35dd0 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 77  t = 1;.    if( w
35de0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
35df0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
35e00 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
35e10 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
35e20 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
35e30 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
35e40 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74   /* Assign a bit
35e50 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73   from the bitmas
35e60 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  k to every term 
35e70 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
35e80 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  se..  **.  ** Wh
35e90 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74  en assigning bit
35ea0 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46  mask values to F
35eb0 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f  ROM clause curso
35ec0 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20  rs, it must be. 
35ed0 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61   ** the case tha
35ee0 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69  t if X is the bi
35ef0 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d  tmask for the N-
35f00 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  th FROM clause t
35f10 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  erm then.  ** th
35f20 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
35f30 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  l FROM clause te
35f40 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  rms to the left 
35f50 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d  of the N-th term
35f60 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20  .  ** is (X-1). 
35f70 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20    An expression 
35f80 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
35f90 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
35fa0 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69  N can use.  ** i
35fb0 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  ts Expr.iRightJo
35fc0 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f  inTable value to
35fd0 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73   find the bitmas
35fe0 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  k of the right t
35ff0 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  able.  ** of the
36000 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74   join.  Subtract
36010 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65  ing one from the
36020 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74   right table bit
36030 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a  mask gives a.  *
36040 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  * bitmask for al
36050 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
36060 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
36070 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62  .  Knowing the b
36080 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20  itmask.  ** for 
36090 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
360a0 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74  e left of a left
360b0 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61   join is importa
360c0 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  nt.  Ticket #301
360d0 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  5..  **.  ** Not
360e0 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20  e that bitmasks 
360f0 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
36100 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  all pTabList->nS
36110 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a  rc tables in.  *
36120 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20  * pTabList, not 
36130 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  just the first n
36140 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20  TabList tables. 
36150 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72   nTabList is nor
36160 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c  mally.  ** equal
36170 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   to pTabList->nS
36180 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20  rc but might be 
36190 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69  shortened to 1 i
361a0 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45  f the.  ** WHERE
361b0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
361c0 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f  lag is set..  */
361d0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
361e0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
361f0 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74  ii++){.    creat
36200 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  eMask(pMaskSet, 
36210 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
36220 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69  iCursor);.  }.#i
36230 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b  fndef NDEBUG.  {
36240 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54  .    Bitmask toT
36250 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  heLeft = 0;.    
36260 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
36270 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
36280 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  +){.      Bitmas
36290 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k m = getMask(pM
362a0 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
362b0 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
362c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
362d0 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74  (m-1)==toTheLeft
362e0 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c   );.      toTheL
362f0 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a  eft |= m;.    }.
36300 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
36310 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20   Analyze all of 
36320 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
36330 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65  ns.  Note that e
36340 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67  xprAnalyze() mig
36350 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20  ht.  ** add new 
36360 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e  virtual terms on
36370 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
36380 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
36390 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20   We do not.  ** 
363a0 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20  want to analyze 
363b0 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65  these virtual te
363c0 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e  rms, so start an
363d0 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65  alyzing at the e
363e0 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b  nd.  ** and work
363f0 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74   forward so that
36400 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75   the added virtu
36410 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76  al terms are nev
36420 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20  er processed..  
36430 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  */.  exprAnalyze
36440 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 70  All(pTabList, &p
36450 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69  WInfo->sWC);.  i
36460 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
36470 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
36480 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
36490 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
364a0 65 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47  e ORDER BY (or G
364b0 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20  ROUP BY) clause 
364c0 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72 65 6e  contains referen
364d0 63 65 73 20 74 6f 20 67 65 6e 65 72 61 6c 0a 20  ces to general. 
364e0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   ** expressions,
364f0 20 74 68 65 6e 20 77 65 20 77 6f 6e 27 74 20 62   then we won't b
36500 65 20 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66  e able to satisf
36510 79 20 69 74 20 75 73 69 6e 67 20 69 6e 64 69 63  y it using indic
36520 65 73 2c 20 73 6f 0a 20 20 2a 2a 20 67 6f 20 61  es, so.  ** go a
36530 68 65 61 64 20 61 6e 64 20 64 69 73 61 62 6c 65  head and disable
36540 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
36550 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  if( pOrderBy && 
36560 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
36570 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
36580 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  T)!=0 ){.    for
36590 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 64 65 72  (ii=0; ii<pOrder
365a0 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  By->nExpr; ii++)
365b0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
365c0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
365d0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
365e0 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 70 45 78  derBy->a[ii].pEx
365f0 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
36600 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
36610 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  UMN ){.        p
36620 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
36630 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  = pOrderBy = 0;.
36640 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
36650 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
36660 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
36670 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
36680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36690 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74 72 6c    }..  if( wctrl
366a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
366b0 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
366c0 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63     if( isDistinc
366d0 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73  tRedundant(pPars
366e0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57  e, pTabList, &pW
366f0 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75  Info->sWC, pResu
36700 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20  ltSet) ){.      
36710 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20  /* The DISTINCT 
36720 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74  marking is point
36730 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74  less.  Ignore it
36740 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  . */.      pWInf
36750 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
36760 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
36770 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  IQUE;.    }else 
36780 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
36790 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
367a0 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20  to ORDER BY the 
367b0 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61  result set to ma
367c0 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63  ke distinct proc
367d0 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f  essing easier */
367e0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77  .      pWInfo->w
367f0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45  ctrlFlags |= WHE
36800 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20  RE_DISTINCTBY;. 
36810 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
36820 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53  derBy = pResultS
36830 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  et;.    }.  }.. 
36840 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
36850 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
36860 63 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54 52  cts */.  WHERETR
36870 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a  ACE(0xffff,("***
36880 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74   Optimizer Start
36890 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69 66 28   ***\n"));.  if(
368a0 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20   nTabList!=1 || 
368b0 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26 73  whereShortCut(&s
368c0 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  WLB)==0 ){.    r
368d0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
368e0 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20  All(&sWLB);.    
368f0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
36900 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
36910 20 0a 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79   .    /* Display
36920 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72   all of the Wher
36930 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 66  eLoop objects if
36940 20 77 68 65 72 65 74 72 61 63 65 20 69 73 20 65   wheretrace is e
36950 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64 65 66  nabled */.#ifdef
36960 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
36970 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
36980 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
36990 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  .      WhereLoop
369a0 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69   *p;.      int i
369b0 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  ;.      static c
369c0 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22  har zLabel[] = "
369d0 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66  0123456789abcdef
369e0 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
369f0 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20  wyxz".          
36a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 42               "AB
36a20 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
36a30 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20  STUVWYXZ";.     
36a40 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70   for(p=pWInfo->p
36a50 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70  Loops, i=0; p; p
36a60 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69  =p->pNextLoop, i
36a70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
36a80 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73  cId = zLabel[i%s
36a90 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a  izeof(zLabel)];.
36aa0 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
36ab0 70 50 72 69 6e 74 28 70 2c 20 70 54 61 62 4c 69  pPrint(p, pTabLi
36ac0 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
36ad0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20   }.#endif.  .   
36ae0 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
36af0 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20  (pWInfo, 0);.   
36b00 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
36b10 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
36b20 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
36b30 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
36b40 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
36b50 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
36b60 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
36b70 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20  >nRowOut+1);.   
36b80 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
36b90 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
36ba0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
36bb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
36bc0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
36bd0 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61  y==0 && (db->fla
36be0 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65  gs & SQLITE_Reve
36bf0 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a  rseOrder)!=0 ){.
36c00 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
36c10 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29  Mask = (Bitmask)
36c20 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  (-1);.  }.  if( 
36c30 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
36c40 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63  NEVER(db->malloc
36c50 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67  Failed) ){.    g
36c60 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
36c70 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  ror;.  }.#ifdef 
36c80 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
36c90 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
36ca0 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20  WhereTrace ){.  
36cb0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 73 71    int ii;.    sq
36cc0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
36cd0 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20  ("---- Solution 
36ce0 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f  nRow=%d", pWInfo
36cf0 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20  ->nRowOut);.    
36d00 69 66 28 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53  if( pWInfo->bOBS
36d10 61 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  at ){.      sqli
36d20 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
36d30 20 4f 52 44 45 52 42 59 3d 30 78 25 6c 6c 78 22   ORDERBY=0x%llx"
36d40 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73  , pWInfo->revMas
36d50 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  k);.    }.    sw
36d60 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44  itch( pWInfo->eD
36d70 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
36d80 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
36d90 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20  INCT_UNIQUE: {. 
36da0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
36db0 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
36dc0 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a  TINCT=unique");.
36dd0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
36de0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
36df0 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
36e00 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  _ORDERED: {.    
36e10 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
36e20 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
36e30 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  CT=ordered");.  
36e40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
36e50 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
36e60 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
36e70 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  NORDERED: {.    
36e80 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
36e90 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
36ea0 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a  CT=unordered");.
36eb0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
36ec0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
36ed0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
36ee0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66  ntf("\n");.    f
36ef0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e  or(ii=0; ii<pWIn
36f00 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b  fo->nLevel; ii++
36f10 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
36f20 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e  opPrint(pWInfo->
36f30 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 70 54  a[ii].pWLoop, pT
36f40 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  abList);.    }. 
36f50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41   }.#endif.  /* A
36f60 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74  ttempt to omit t
36f70 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a  ables from the j
36f80 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  oin that do not 
36f90 65 66 66 65 63 74 20 74 68 65 20 72 65 73 75 6c  effect the resul
36fa0 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66  t */.  if( pWInf
36fb0 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20  o->nLevel>=2.   
36fc0 26 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30  && pResultSet!=0
36fd0 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
36fe0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
36ff0 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f  QLITE_OmitNoopJo
37000 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74  in).  ){.    Bit
37010 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d 20 65  mask tabUsed = e
37020 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
37030 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 65 73  e(pMaskSet, pRes
37040 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28  ultSet);.    if(
37050 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 29   sWLB.pOrderBy )
37060 20 74 61 62 55 73 65 64 20 7c 3d 20 65 78 70 72   tabUsed |= expr
37070 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
37080 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f  MaskSet, sWLB.pO
37090 72 64 65 72 42 79 29 3b 0a 20 20 20 20 77 68 69  rderBy);.    whi
370a0 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  le( pWInfo->nLev
370b0 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 57  el>=2 ){.      W
370c0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
370d0 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c   *pEnd;.      pL
370e0 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b  oop = pWInfo->a[
370f0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31  pWInfo->nLevel-1
37100 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  ].pWLoop;.      
37110 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61  if( (pWInfo->pTa
37120 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e  bList->a[pLoop->
37130 69 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  iTab].jointype &
37140 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62   JT_LEFT)==0 ) b
37150 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
37160 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
37170 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
37180 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  T)==0.       && 
37190 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
371a0 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
371b0 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
371c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
371d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74 61   }.      if( (ta
371e0 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d  bUsed & pLoop->m
371f0 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72  askSelf)!=0 ) br
37200 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  eak;.      pEnd 
37210 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20  = sWLB.pWC->a + 
37220 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  sWLB.pWC->nTerm;
37230 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
37240 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54  =sWLB.pWC->a; pT
37250 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b  erm<pEnd; pTerm+
37260 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
37270 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
37280 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
37290 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20  elf)!=0.        
372a0 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
372b0 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
372c0 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
372d0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
372e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
372f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
37300 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45      if( pTerm<pE
37310 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  nd ) break;.    
37320 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
37330 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c  fff, ("-> drop l
37340 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c  oop %c not used\
37350 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29  n", pLoop->cId))
37360 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
37370 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20  nLevel--;.      
37380 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20  nTabList--;.    
37390 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  }.  }.  WHERETRA
373a0 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20  CE(0xffff,("*** 
373b0 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68  Optimizer Finish
373c0 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70  ed ***\n"));.  p
373d0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e  WInfo->pParse->n
373e0 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49  QueryLoop += pWI
373f0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20  nfo->nRowOut;.. 
37400 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65   /* If the calle
37410 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  r is an UPDATE o
37420 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
37430 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65  nt that is reque
37440 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73  sting.  ** to us
37450 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  e a one-pass alg
37460 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e  orithm, determin
37470 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70  e if this is app
37480 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54  ropriate..  ** T
37490 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f  he one-pass algo
374a0 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73  rithm only works
374b0 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
374c0 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
374d0 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  .  ** the statem
374e0 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61 20  ent to update a 
374f0 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f  single row..  */
37500 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72  .  assert( (wctr
37510 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
37520 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
37530 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c  =0 || pWInfo->nL
37540 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28  evel==1 );.  if(
37550 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
37560 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
37570 49 52 45 44 29 21 3d 30 20 0a 20 20 20 26 26 20  IRED)!=0 .   && 
37580 28 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57  (pWInfo->a[0].pW
37590 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
375a0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30  WHERE_ONEROW)!=0
375b0 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e   ){.    pWInfo->
375c0 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20  okOnePass = 1;. 
375d0 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
375e0 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
375f0 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e  &= ~WHERE_IDX_ON
37600 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  LY;.  }..  /* Op
37610 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  en all tables in
37620 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e   the pTabList an
37630 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65  d any indices se
37640 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20  lected for.  ** 
37650 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20  searching those 
37660 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6e  tables..  */.  n
37670 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d  otReady = ~(Bitm
37680 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d  ask)0;.  for(ii=
37690 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
376a0 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  ->a; ii<nTabList
376b0 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  ; ii++, pLevel++
376c0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
376d0 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
376e0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
376f0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
37700 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74   /* Index of dat
37710 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
37720 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a   table/index */.
37730 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
37740 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
37750 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d  m;..    pTabItem
37760 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
37770 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
37780 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49      pTab = pTabI
37790 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
377a0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
377b0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
377c0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
377d0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
377e0 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  ->pWLoop;.    if
377f0 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
37800 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
37810 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53  )!=0 || pTab->pS
37820 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f  elect ){.      /
37830 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
37840 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65      }else.#ifnde
37850 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
37860 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
37870 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
37880 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
37890 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
378a0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
378b0 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20  *pVTab = (const 
378c0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65  char *)sqlite3Ge
378d0 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
378e0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75  );.      int iCu
378f0 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
37900 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  ursor;.      sql
37910 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
37920 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72  , OP_VOpen, iCur
37930 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50  , 0, 0, pVTab, P
37940 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c  4_VTAB);.    }el
37950 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
37960 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
37970 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* noop */.    }
37980 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
37990 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
379a0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
379b0 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
379c0 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
379d0 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   & WHERE_OMIT_OP
379e0 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a  EN_CLOSE)==0 ){.
379f0 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70        int op = p
37a00 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
37a10 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20   ? OP_OpenWrite 
37a20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20  : OP_OpenRead;. 
37a30 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
37a40 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
37a50 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c  abItem->iCursor,
37a60 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b   iDb, pTab, op);
37a70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
37a80 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
37a90 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
37aa0 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
37ab0 20 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49    testcase( !pWI
37ac0 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
37ad0 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  & pTab->nCol==BM
37ae0 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  S );.      if( !
37af0 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
37b00 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c  s && pTab->nCol<
37b10 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20 42  BMS ){.        B
37b20 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49  itmask b = pTabI
37b30 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
37b40 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b        int n = 0;
37b50 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62  .        for(; b
37b60 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d  ; b=b>>1, n++){}
37b70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37b80 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
37b90 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
37ba0 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20  ntAddr(v)-1, .  
37bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37bc0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
37bd0 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20  _INT_TO_PTR(n), 
37be0 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20  P4_INT32);.     
37bf0 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54     assert( n<=pT
37c00 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
37c10 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
37c20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
37c30 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
37c40 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
37c50 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
37c60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
37c70 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
37c80 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
37c90 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78        Index *pIx
37ca0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
37cb0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  e.pIndex;.      
37cc0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
37cd0 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
37ce0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29  nfo(pParse, pIx)
37cf0 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 4d 45  ;.      /* FIXME
37d00 3a 20 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a  :  As an optimiz
37d10 61 74 69 6f 6e 20 75 73 65 20 70 54 61 62 49 74  ation use pTabIt
37d20 65 6d 2d 3e 69 43 75 72 73 6f 72 20 69 66 20 57  em->iCursor if W
37d30 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 2a 2f  HERE_IDX_ONLY */
37d40 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65  .      int iInde
37d50 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
37d60 49 64 78 43 75 72 20 3d 20 69 49 64 78 43 75 72  IdxCur = iIdxCur
37d70 20 3f 20 69 49 64 78 43 75 72 20 3a 20 70 50 61   ? iIdxCur : pPa
37d80 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
37d90 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e     assert( pIx->
37da0 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
37db0 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
37dc0 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75  assert( iIndexCu
37dd0 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r>=0 );.      sq
37de0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
37df0 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
37e00 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e  iIndexCur, pIx->
37e10 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20  tnum, iDb,.     
37e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e30 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20     (char*)pKey, 
37e40 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
37e50 46 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  FF);.      VdbeC
37e60 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
37e70 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20   pIx->zName));. 
37e80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
37e90 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
37ea0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
37eb0 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e     notReady &= ~
37ec0 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
37ed0 3e 73 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49  >sMaskSet, pTabI
37ee0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
37ef0 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f   }.  pWInfo->iTo
37f00 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
37f10 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
37f20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
37f30 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
37f40 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20  reBeginError;.. 
37f50 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
37f60 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20   code to do the 
37f70 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74  search.  Each it
37f80 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  eration of the f
37f90 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c  or.  ** loop bel
37fa0 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ow generates cod
37fb0 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e  e for a single n
37fc0 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
37fd0 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61  e VM.  ** progra
37fe0 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  m..  */.  notRea
37ff0 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
38000 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
38010 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29  <nTabList; ii++)
38020 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  {.    pLevel = &
38030 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 23  pWInfo->a[ii];.#
38040 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
38050 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
38060 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  EX.    if( (pLev
38070 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  el->pWLoop->wsFl
38080 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
38090 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
380a0 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74      constructAut
380b0 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72  omaticIndex(pPar
380c0 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  se, &pWInfo->sWC
380d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
380e0 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70    &pTabList->a[p
380f0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e  Level->iFrom], n
38100 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29  otReady, pLevel)
38110 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
38120 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
38130 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
38140 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ror;.    }.#endi
38150 66 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65  f.    explainOne
38160 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61  Scan(pParse, pTa
38170 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69  bList, pLevel, i
38180 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  i, pLevel->iFrom
38190 2c 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20  , wctrlFlags);. 
381a0 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42     pLevel->addrB
381b0 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ody = sqlite3Vdb
381c0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
381d0 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  .    notReady = 
381e0 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74  codeOneLoopStart
381f0 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74  (pWInfo, ii, not
38200 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e  Ready);.    pWIn
38210 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65