/ Hex Artifact Content
Login

Artifact d2f58a441ba8709a99df6654b26a50b7ca7dada4:


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 70  Term++];.  if( p
6ed0: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
6ee0: 72 74 79 28 70 2c 20 45 50 5f 55 6e 6c 69 6b 65  rty(p, EP_Unlike
6ef0: 6c 79 29 20 29 7b 0a 20 20 20 20 70 54 65 72 6d  ly) ){.    pTerm
6f00: 2d 3e 74 72 75 74 68 50 72 6f 62 20 3d 20 77 68  ->truthProb = wh
6f10: 65 72 65 43 6f 73 74 28 70 2d 3e 69 54 61 62 6c  ereCost(p->iTabl
6f20: 65 29 20 2d 20 39 39 3b 0a 20 20 7d 65 6c 73 65  e) - 99;.  }else
6f30: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 74 72 75  {.    pTerm->tru
6f40: 74 68 50 72 6f 62 20 3d 20 2d 31 3b 0a 20 20 7d  thProb = -1;.  }
6f50: 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  .  pTerm->pExpr 
6f60: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
6f70: 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20 20 70  pCollate(p);.  p
6f80: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20  Term->wtFlags = 
6f90: 77 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d  wtFlags;.  pTerm
6fa0: 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70  ->pWC = pWC;.  p
6fb0: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
6fc0: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78  -1;.  return idx
6fd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6fe0: 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69  routine identifi
6ff0: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
7000: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
7010: 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65  lause where.** e
7020: 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f  ach subexpressio
7030: 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
7040: 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74  y the AND operat
7050: 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  or or some other
7060: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65  .** operator spe
7070: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70  cified in the op
7080: 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65   parameter.  The
7090: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
70a0: 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c  ucture.** is fil
70b0: 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72  led with pointer
70c0: 73 20 74 6f 20 73 75 62 65 78 70 72 65 73 73 69  s to subexpressi
70d0: 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ons.  For exampl
70e0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52  e:.**.**    WHER
70f0: 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e  E  a=='hello' AN
7100: 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29  D coalesce(b,11)
7110: 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64  <10 AND (c+12!=d
7120: 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20   OR c==22).**   
7130: 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
7140: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
7150: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
7160: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
7170: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 73 6c  **            sl
7180: 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20  ot[0]           
7190: 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20   slot[1]        
71a0: 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a         slot[2].*
71b0: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
71c0: 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  l WHERE clause i
71d0: 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74  n pExpr is unalt
71e0: 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20  ered.  All this 
71f0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20  routine.** does 
7200: 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65  is make slot[] e
7210: 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20  ntries point to 
7220: 73 75 62 73 74 72 75 63 74 75 72 65 20 77 69 74  substructure wit
7230: 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a  hin pExpr..**.**
7240: 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   In the previous
7250: 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e   sentence and in
7260: 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73   the diagram, "s
7270: 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f  lot[]" refers to
7280: 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61  .** the WhereCla
7290: 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20  use.a[] array.  
72a0: 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79  The slot[] array
72b0: 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64   grows as needed
72c0: 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61   to contain.** a
72d0: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
72e0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f  WHERE clause..*/
72f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
7300: 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61  reSplit(WhereCla
7310: 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
7320: 70 45 78 70 72 2c 20 75 38 20 6f 70 29 7b 0a 20  pExpr, u8 op){. 
7330: 20 70 57 43 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20   pWC->op = op;. 
7340: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
7350: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45  return;.  if( pE
7360: 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20  xpr->op!=op ){. 
7370: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
7380: 73 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c  sert(pWC, pExpr,
7390: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
73a0: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
73b0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
73c0: 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70  op);.    whereSp
73d0: 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e  lit(pWC, pExpr->
73e0: 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d  pRight, op);.  }
73f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
7400: 6c 69 7a 65 20 61 20 57 68 65 72 65 4d 61 73 6b  lize a WhereMask
7410: 53 65 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 23 64  Set object.*/.#d
7420: 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65  efine initMaskSe
7430: 74 28 50 29 20 20 28 50 29 2d 3e 6e 3d 30 0a 0a  t(P)  (P)->n=0..
7440: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7450: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
7460: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
7470: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
7480: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
7490: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
74a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
74b0: 73 6b 20 67 65 74 4d 61 73 6b 28 57 68 65 72 65  sk getMask(Where
74c0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
74d0: 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b  t, int iCursor){
74e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
74f0: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c  rt( pMaskSet->n<
7500: 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74  =(int)sizeof(Bit
7510: 6d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72  mask)*8 );.  for
7520: 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74  (i=0; i<pMaskSet
7530: 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ->n; i++){.    i
7540: 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  f( pMaskSet->ix[
7550: 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  i]==iCursor ){. 
7560: 20 20 20 20 20 72 65 74 75 72 6e 20 4d 41 53 4b       return MASK
7570: 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20  BIT(i);.    }.  
7580: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
7590: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
75a0: 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72  new mask for cur
75b0: 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a  sor iCursor..**.
75c0: 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  ** There is one 
75d0: 63 75 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65  cursor per table
75e0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
75f0: 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  use.  The number
7600: 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e   of.** tables in
7610: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
7620: 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61   is limited by a
7630: 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74   test early in t
7640: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  he.** sqlite3Whe
7650: 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e  reBegin() routin
7660: 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74  e.  So we know t
7670: 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74  hat the pMaskSet
7680: 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20  ->ix[].** array 
7690: 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66  will never overf
76a0: 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  low..*/.static v
76b0: 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57  oid createMask(W
76c0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
76d0: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
76e0: 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  or){.  assert( p
76f0: 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72  MaskSet->n < Arr
7700: 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d  aySize(pMaskSet-
7710: 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53  >ix) );.  pMaskS
7720: 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d  et->ix[pMaskSet-
7730: 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b  >n++] = iCursor;
7740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  .}../*.** These 
7750: 72 6f 75 74 69 6e 65 73 20 77 61 6c 6b 20 28 72  routines walk (r
7760: 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65  ecursively) an e
7770: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
7780: 6e 64 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 61  nd generate.** a
7790: 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74   bitmask indicat
77a0: 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65 73  ing which tables
77b0: 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 61   are used in tha
77c0: 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  t expression.** 
77d0: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
77e0: 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74  Bitmask exprList
77f0: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
7800: 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69  MaskSet*, ExprLi
7810: 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74  st*);.static Bit
7820: 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54  mask exprSelectT
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 53 65 6c 65 63 74 2a  askSet*, Select*
7850: 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  );.static Bitmas
7860: 6b 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  k exprTableUsage
7870: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
7880: 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70  MaskSet, Expr *p
7890: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  ){.  Bitmask mas
78a0: 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d  k = 0;.  if( p==
78b0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
78c0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
78d0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b  LUMN ){.    mask
78e0: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
78f0: 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b  Set, p->iTable);
7900: 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b  .    return mask
7910: 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65  ;.  }.  mask = e
7920: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
7930: 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68  askSet, p->pRigh
7940: 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78  t);.  mask |= ex
7950: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
7960: 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29  skSet, p->pLeft)
7970: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
7980: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
7990: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
79a0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65  mask |= exprSele
79b0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
79c0: 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c  skSet, p->x.pSel
79d0: 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ect);.  }else{. 
79e0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
79f0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
7a00: 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69  askSet, p->x.pLi
7a10: 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  st);.  }.  retur
7a20: 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63  n mask;.}.static
7a30: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73   Bitmask exprLis
7a40: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
7a50: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
7a60: 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  et, ExprList *pL
7a70: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
7a80: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
7a90: 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  0;.  if( pList )
7aa0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
7ab0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
7ac0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20  ++){.      mask 
7ad0: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
7ae0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73  e(pMaskSet, pLis
7af0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
7b00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7b10: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69  rn mask;.}.stati
7b20: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65  c Bitmask exprSe
7b30: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57  lectTableUsage(W
7b40: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
7b50: 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70  skSet, Select *p
7b60: 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61  S){.  Bitmask ma
7b70: 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  sk = 0;.  while(
7b80: 20 70 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69   pS ){.    SrcLi
7b90: 73 74 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70  st *pSrc = pS->p
7ba0: 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  Src;.    mask |=
7bb0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
7bc0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
7bd0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d  ->pEList);.    m
7be0: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
7bf0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
7c00: 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79  et, pS->pGroupBy
7c10: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
7c20: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
7c30: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
7c40: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d  pOrderBy);.    m
7c50: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
7c60: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
7c70: 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  pS->pWhere);.   
7c80: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
7c90: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
7ca0: 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  , pS->pHaving);.
7cb0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
7cc0: 53 72 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Src!=0) ){.     
7cd0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
7ce0: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
7cf0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
7d00: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53     mask |= exprS
7d10: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
7d20: 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e  pMaskSet, pSrc->
7d30: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
7d40: 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65         mask |= e
7d50: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
7d60: 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b  askSet, pSrc->a[
7d70: 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d  i].pOn);.      }
7d80: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20  .    }.    pS = 
7d90: 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  pS->pPrior;.  }.
7da0: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
7db0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
7dc0: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
7dd0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65   operator is one
7de0: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
7df0: 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c  s that is.** all
7e00: 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65  owed for an inde
7e10: 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  xable WHERE clau
7e20: 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c  se term.  The al
7e30: 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20  lowed operators 
7e40: 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c  are.** "=", "<",
7e50: 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22   ">", "<=", ">="
7e60: 2c 20 22 49 4e 22 2c 20 61 6e 64 20 22 49 53 20  , "IN", and "IS 
7e70: 4e 55 4c 4c 22 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL".*/.static 
7e80: 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e  int allowedOp(in
7e90: 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28  t op){.  assert(
7ea0: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20   TK_GT>TK_EQ && 
7eb0: 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_GT<TK_GE );. 
7ec0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54   assert( TK_LT>T
7ed0: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b  K_EQ && TK_LT<TK
7ee0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
7ef0: 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20   TK_LE>TK_EQ && 
7f00: 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LE<TK_GE );. 
7f10: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
7f20: 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74  TK_EQ+4 );.  ret
7f30: 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c  urn op==TK_IN ||
7f40: 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f   (op>=TK_EQ && o
7f50: 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d  p<=TK_GE) || op=
7f60: 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f  =TK_ISNULL;.}../
7f70: 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62  *.** Swap two ob
7f80: 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 59  jects of type TY
7f90: 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  PE..*/.#define S
7fa0: 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54  WAP(TYPE,A,B) {T
7fb0: 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d  YPE t=A; A=B; B=
7fc0: 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75  t;}../*.** Commu
7fd0: 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  te a comparison 
7fe0: 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65  operator.  Expre
7ff0: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
8000: 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61  rm "X op Y".** a
8010: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
8020: 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a  o "Y op X"..**.*
8030: 2a 20 49 66 20 6c 65 66 74 2f 72 69 67 68 74 20  * If left/right 
8040: 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c 65 73  precedence rules
8050: 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20   come into play 
8060: 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67  when determining
8070: 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e   the.** collatin
8080: 67 20 73 65 71 75 65 6e 63 65 2c 20 74 68 65 6e  g sequence, then
8090: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
80a0: 72 73 20 61 72 65 20 61 64 6a 75 73 74 65 64 20  rs are adjusted 
80b0: 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61  to ensure.** tha
80c0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
80d0: 73 65 71 75 65 6e 63 65 20 64 6f 65 73 20 6e 6f  sequence does no
80e0: 74 20 63 68 61 6e 67 65 2e 20 20 46 6f 72 20 65  t change.  For e
80f0: 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20 63 6f  xample:.** "Y co
8100: 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20  llate NOCASE op 
8110: 58 22 20 62 65 63 6f 6d 65 73 20 22 58 20 6f 70  X" becomes "X op
8120: 20 59 22 20 62 65 63 61 75 73 65 20 61 6e 79 20   Y" because any 
8130: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
8140: 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66  ce on.** the lef
8150: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61  t hand side of a
8160: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72   comparison over
8170: 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74  rides any collat
8180: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a  ion sequence .**
8190: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
81a0: 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20   right. For the 
81b0: 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20  same reason the 
81c0: 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a  EP_Collate flag.
81d0: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74  ** is not commut
81e0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
81f0: 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50  id exprCommute(P
8200: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
8210: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31  pr *pExpr){.  u1
8220: 36 20 65 78 70 52 69 67 68 74 20 3d 20 28 70 45  6 expRight = (pE
8230: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61  xpr->pRight->fla
8240: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
8250: 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74 20  ;.  u16 expLeft 
8260: 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = (pExpr->pLeft-
8270: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
8280: 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ate);.  assert( 
8290: 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d  allowedOp(pExpr-
82a0: 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f  >op) && pExpr->o
82b0: 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66  p!=TK_IN );.  if
82c0: 28 20 65 78 70 52 69 67 68 74 3d 3d 65 78 70 4c  ( expRight==expL
82d0: 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  eft ){.    /* Ei
82e0: 74 68 65 72 20 58 20 61 6e 64 20 59 20 62 6f 74  ther X and Y bot
82f0: 68 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f  h have COLLATE o
8300: 70 65 72 61 74 6f 72 20 6f 72 20 6e 65 69 74 68  perator or neith
8310: 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28  er do */.    if(
8320: 20 65 78 70 52 69 67 68 74 20 29 7b 0a 20 20 20   expRight ){.   
8330: 20 20 20 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64     /* Both X and
8340: 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20   Y have COLLATE 
8350: 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65  operators.  Make
8360: 20 73 75 72 65 20 58 20 69 73 20 61 6c 77 61 79   sure X is alway
8370: 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20  s.      ** used 
8380: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
8390: 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20  EP_Collate flag 
83a0: 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20  from Y. */.     
83b0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
83c0: 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c  flags &= ~EP_Col
83d0: 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20  late;.    }else 
83e0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
83f0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
8400: 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20  Expr->pLeft)!=0 
8410: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65 69 74  ){.      /* Neit
8420: 68 65 72 20 58 20 6e 6f 72 20 59 20 68 61 76 65  her X nor Y have
8430: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
8440: 72 73 2c 20 62 75 74 20 58 20 68 61 73 20 61 20  rs, but X has a 
8450: 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20 20 20  non-default.    
8460: 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73    ** collating s
8470: 65 71 75 65 6e 63 65 2e 20 20 53 6f 20 61 64 64  equence.  So add
8480: 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20   the EP_Collate 
8490: 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63  marker on X to c
84a0: 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74  ause.      ** it
84b0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
84c0: 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20  first. */.      
84d0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c  pExpr->pLeft->fl
84e0: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
84f0: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53  e;.    }.  }.  S
8500: 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d  WAP(Expr*,pExpr-
8510: 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70  >pRight,pExpr->p
8520: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
8530: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b  pr->op>=TK_GT ){
8540: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
8550: 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20  LT==TK_GT+2 );. 
8560: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
8570: 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20  ==TK_LE+2 );.   
8580: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
8590: 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  K_EQ );.    asse
85a0: 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20  rt( TK_GT<TK_LE 
85b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
85c0: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
85d0: 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b  && pExpr->op<=TK
85e0: 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72  _GE );.    pExpr
85f0: 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e  ->op = ((pExpr->
8600: 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f  op-TK_GT)^2)+TK_
8610: 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  GT;.  }.}../*.**
8620: 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20   Translate from 
8630: 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74  TK_xx operator t
8640: 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e  o WO_xx bitmask.
8650: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f  .*/.static u16 o
8660: 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20  peratorMask(int 
8670: 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20  op){.  u16 c;.  
8680: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
8690: 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f  p(op) );.  if( o
86a0: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
86b0: 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c  c = WO_IN;.  }el
86c0: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
86d0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20  NULL ){.    c = 
86e0: 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  WO_ISNULL;.  }el
86f0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
8700: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
8710: 51 29 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a  Q)) < 0x7fff );.
8720: 20 20 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f      c = (u16)(WO
8730: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29  _EQ<<(op-TK_EQ))
8740: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
8750: 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
8760: 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b   c==WO_ISNULL );
8770: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
8780: 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e  K_IN || c==WO_IN
8790: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
87a0: 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f  !=TK_EQ || c==WO
87b0: 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _EQ );.  assert(
87c0: 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d   op!=TK_LT || c=
87d0: 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65  =WO_LT );.  asse
87e0: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  rt( op!=TK_LE ||
87f0: 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61   c==WO_LE );.  a
8800: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54  ssert( op!=TK_GT
8810: 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a   || c==WO_GT );.
8820: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
8830: 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20  _GE || c==WO_GE 
8840: 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d  );.  return c;.}
8850: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
8860: 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68 65 72  to the next Wher
8870: 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68  eTerm that match
8880: 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
8890: 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
88a0: 65 73 74 61 62 6c 69 73 68 65 64 20 77 68 65 6e  established when
88b0: 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a 65 63   the pScan objec
88c0: 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65  t was initialize
88d0: 64 20 62 79 20 77 68 65 72 65 53 63 61 6e 49 6e  d by whereScanIn
88e0: 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  it()..** Return 
88f0: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
8900: 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69  e no more matchi
8910: 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a  ng WhereTerms..*
8920: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
8930: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e 65 78  rm *whereScanNex
8940: 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63  t(WhereScan *pSc
8950: 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b  an){.  int iCur;
8960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8970: 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65  he cursor on the
8980: 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d   LHS of the term
8990: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
89a0: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  n;         /* Th
89b0: 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  e column on the 
89c0: 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 2e  LHS of the term.
89d0: 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a    -1 for IPK */.
89e0: 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
89f0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
8a00: 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 74 65  ression being te
8a10: 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  sted */.  WhereC
8a20: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
8a30: 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
8a40: 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20  pScan->pWC */.  
8a50: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
8a60: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
8a70: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f   being tested */
8a80: 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53 63 61 6e  .  int k = pScan
8a90: 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65 72 65  ->k;    /* Where
8aa0: 20 74 6f 20 73 74 61 72 74 20 73 63 61 6e 6e 69   to start scanni
8ab0: 6e 67 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20  ng */..  while( 
8ac0: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 70  pScan->iEquiv<=p
8ad0: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a  Scan->nEquiv ){.
8ae0: 20 20 20 20 69 43 75 72 20 3d 20 70 53 63 61 6e      iCur = pScan
8af0: 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e  ->aEquiv[pScan->
8b00: 69 45 71 75 69 76 2d 32 5d 3b 0a 20 20 20 20 69  iEquiv-2];.    i
8b10: 43 6f 6c 75 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e  Column = pScan->
8b20: 61 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45  aEquiv[pScan->iE
8b30: 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20 77 68 69  quiv-1];.    whi
8b40: 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63 61 6e  le( (pWC = pScan
8b50: 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20 20 20  ->pWC)!=0 ){.   
8b60: 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
8b70: 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54  ->a+k; k<pWC->nT
8b80: 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b  erm; k++, pTerm+
8b90: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
8ba0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
8bb0: 72 3d 3d 69 43 75 72 20 26 26 20 70 54 65 72 6d  r==iCur && pTerm
8bc0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
8bd0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
8be0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
8bf0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8c00: 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20  EQUIV)!=0.      
8c10: 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e       && pScan->n
8c20: 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28  Equiv<ArraySize(
8c30: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 29 0a 20  pScan->aEquiv). 
8c40: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
8c50: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
8c60: 20 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20             pX = 
8c70: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
8c80: 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45  ollate(pTerm->pE
8c90: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
8ca0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
8cb0: 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
8cc0: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  UMN );.         
8cd0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53     for(j=0; j<pS
8ce0: 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b 3d  can->nEquiv; j+=
8cf0: 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2){.            
8d00: 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61 45 71    if( pScan->aEq
8d10: 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62  uiv[j]==pX->iTab
8d20: 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  le.             
8d30: 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 45 71 75    && pScan->aEqu
8d40: 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f  iv[j+1]==pX->iCo
8d50: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
8d60: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
8d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
8d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
8d90: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
8da0: 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  ==pScan->nEquiv 
8db0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8dc0: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a   pScan->aEquiv[j
8dd0: 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a  ] = pX->iTable;.
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
8df0: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d  can->aEquiv[j+1]
8e00: 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a   = pX->iColumn;.
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
8e20: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d 20 32  can->nEquiv += 2
8e30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
8e40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8e50: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
8e60: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53  ->eOperator & pS
8e70: 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20  can->opMask)!=0 
8e80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
8e90: 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66 66  * Verify the aff
8ea0: 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74  inity and collat
8eb0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74  ing sequence mat
8ec0: 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
8ed0: 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f    if( pScan->zCo
8ee0: 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d  llName && (pTerm
8ef0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
8f00: 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  _ISNULL)==0 ){. 
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c               Col
8f20: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
8f30: 20 20 20 20 20 20 20 20 20 20 20 50 61 72 73 65             Parse
8f40: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
8f50: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
8f70: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
8f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
8f90: 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
8fa0: 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70  AffinityOk(pX, p
8fb0: 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b  Scan->idxaff) ){
8fc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8fd0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8fe0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8ff0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
9000: 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pX->pLeft);.    
9010: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
9020: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
9030: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
9040: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65 66          pX->pLef
9080: 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
90a0: 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f  ( pColl==0 ) pCo
90b0: 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
90c0: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
90d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
90e0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
90f0: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61 6e  ll->zName, pScan
9100: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a  ->zCollName) ){.
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9120: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9130: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9140: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9150: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
9160: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
9170: 51 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  Q)!=0.          
9180: 20 20 20 26 26 20 28 70 58 20 3d 20 70 54 65 72     && (pX = pTer
9190: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
91a0: 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  )->op==TK_COLUMN
91b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
91c0: 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 63   pX->iTable==pSc
91d0: 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a 20 20  an->aEquiv[0].  
91e0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58             && pX
91f0: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e  ->iColumn==pScan
9200: 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20 20 20  ->aEquiv[1].    
9210: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
9220: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
9230: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
9240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63  .            pSc
9250: 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20  an->k = k+1;.   
9260: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9270: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  pTerm;.         
9280: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
9290: 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e     }.      pScan
92a0: 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70  ->pWC = pScan->p
92b0: 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20  WC->pOuter;.    
92c0: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    k = 0;.    }. 
92d0: 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20     pScan->pWC = 
92e0: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a  pScan->pOrigWC;.
92f0: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70      k = 0;.    p
9300: 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b 3d 20  Scan->iEquiv += 
9310: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
9320: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  0;.}../*.** Init
9330: 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20 63  ialize a WHERE c
9340: 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f 62  lause scanner ob
9350: 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ject.  Return a 
9360: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
9370: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20 20  * first match.  
9380: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
9390: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63  here are no matc
93a0: 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  hes..**.** The s
93b0: 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20 73  canner will be s
93c0: 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48 45  earching the WHE
93d0: 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20  RE clause pWC.  
93e0: 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20  It will look.** 
93f0: 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
9400: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
9410: 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69 73  xpr>" where X is
9420: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20   column iColumn 
9430: 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72  of table.** iCur
9440: 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74  .  The <op> must
9450: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f   be one of the o
9460: 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69 62  perators describ
9470: 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a  ed by opMask..**
9480: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72 63  .** If the searc
9490: 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20 74  h is for X and t
94a0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
94b0: 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f  contains terms o
94c0: 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d  f the.** form X=
94d0: 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  Y then this rout
94e0: 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 72  ine might also r
94f0: 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20 74  eturn terms of t
9500: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f  he form.** "Y <o
9510: 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68 65  p> <expr>".  The
9520: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   number of level
9530: 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69 74  s of transitivit
9540: 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a  y is limited,.**
9550: 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20 74   but is enough t
9560: 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f  o handle most co
9570: 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67  mmonly occurring
9580: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
9590: 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e  .**.** If X is n
95a0: 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  ot the INTEGER P
95b0: 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20  RIMARY KEY then 
95c0: 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  X must be compat
95d0: 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64  ible with.** ind
95e0: 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  ex pIdx..*/.stat
95f0: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
9600: 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57  ereScanInit(.  W
9610: 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c  hereScan *pScan,
9620: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
9630: 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62  ereScan object b
9640: 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64  eing initialized
9650: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
9660: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a  e *pWC,       /*
9670: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
9680: 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  e to be scanned 
9690: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
96a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
96b0: 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66  Cursor to scan f
96c0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  or */.  int iCol
96d0: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
96e0: 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61  /* Column to sca
96f0: 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f  n for */.  u32 o
9700: 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20  pMask,          
9710: 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73     /* Operator(s
9720: 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  ) to scan for */
9730: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
9740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
9750: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
9760: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
9770: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a   */.){.  int j;.
9780: 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63  .  /* memset(pSc
9790: 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  an, 0, sizeof(*p
97a0: 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63  Scan)); */.  pSc
97b0: 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57  an->pOrigWC = pW
97c0: 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20  C;.  pScan->pWC 
97d0: 3d 20 70 57 43 3b 0a 20 20 69 66 28 20 70 49 64  = pWC;.  if( pId
97e0: 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20  x && iColumn>=0 
97f0: 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64  ){.    pScan->id
9800: 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61  xaff = pIdx->pTa
9810: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
9820: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
9830: 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e   for(j=0; pIdx->
9840: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f  aiColumn[j]!=iCo
9850: 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
9860: 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70    if( NEVER(j>=p
9870: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20  Idx->nColumn) ) 
9880: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
9890: 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c      pScan->zColl
98a0: 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Name = pIdx->azC
98b0: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b  oll[j];.  }else{
98c0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  .    pScan->idxa
98d0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61  ff = 0;.    pSca
98e0: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30  n->zCollName = 0
98f0: 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f  ;.  }.  pScan->o
9900: 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a  pMask = opMask;.
9910: 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a    pScan->k = 0;.
9920: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
9930: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
9940: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20 3d 20  an->aEquiv[1] = 
9950: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e  iColumn;.  pScan
9960: 2d 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a 20 20  ->nEquiv = 2;.  
9970: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20  pScan->iEquiv = 
9980: 32 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72  2;.  return wher
9990: 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29  eScanNext(pScan)
99a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
99b0: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
99c0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
99d0: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
99e0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
99f0: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
9a00: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
9a10: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
9a20: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
9a30: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
9a40: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
9a50: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
9a60: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
9a70: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
9a80: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
9a90: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
9aa0: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
9ab0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  d..**.** The ter
9ac0: 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  m returned might
9ad0: 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20   by Y=<expr> if 
9ae0: 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72  there is another
9af0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a   constraint in.*
9b00: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
9b10: 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  se that specifie
9b20: 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79  s that X=Y.  Any
9b30: 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74   such constraint
9b40: 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65  s will be.** ide
9b50: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57  ntified by the W
9b60: 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74  O_EQUIV bit in t
9b70: 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  he pTerm->eOpera
9b80: 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a  tor field.  The.
9b90: 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72 61  ** aEquiv[] arra
9ba0: 79 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61 6c  y holds X and al
9bb0: 6c 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74  l its equivalent
9bc0: 73 2c 20 77 69 74 68 20 65 61 63 68 20 53 51 4c  s, with each SQL
9bd0: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61 6b   variable.** tak
9be0: 69 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74 73  ing up two slots
9bf0: 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20 54   in aEquiv[].  T
9c00: 68 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69 73  he first slot is
9c10: 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20   for the cursor 
9c20: 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74 68  number.** and th
9c30: 65 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72 20  e second is for 
9c40: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
9c50: 72 2e 20 20 54 68 65 72 65 20 61 72 65 20 32 32  r.  There are 22
9c60: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
9c70: 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d 65  [].** so that me
9c80: 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20  ans we can look 
9c90: 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f  for X plus up to
9ca0: 20 31 30 20 6f 74 68 65 72 20 65 71 75 69 76 61   10 other equiva
9cb0: 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a 20  lent values..** 
9cc0: 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66  Hence a search f
9cd0: 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e  or X will return
9ce0: 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 20   <expr> if X=A1 
9cf0: 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32  and A1=A2 and A2
9d00: 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20 61  =A3.** and ... a
9d10: 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31  nd A9=A10 and A1
9d20: 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20  0=<expr>..**.** 
9d30: 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  If there are mul
9d40: 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
9d50: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
9d60: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
9d70: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74  op> <expr>".** t
9d80: 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20  hen try for the 
9d90: 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65  one with no depe
9da0: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70  ndencies on <exp
9db0: 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f  r> - in other wo
9dc0: 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78  rds where.** <ex
9dd0: 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  pr> is a constan
9de0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  t expression of 
9df0: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79  some kind.  Only
9e00: 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20   return entries 
9e10: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
9e20: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
9e30: 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  Y is a column in
9e40: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
9e50: 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a  f no terms of.**
9e60: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
9e70: 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20  > <const-expr>" 
9e80: 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74  exist.   If no t
9e90: 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73  erms with a cons
9ea0: 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73  tant RHS.** exis
9eb0: 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e  t, try to return
9ec0: 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65   a term that doe
9ed0: 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55  s not use WO_EQU
9ee0: 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  IV..*/.static Wh
9ef0: 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72  ereTerm *findTer
9f00: 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m(.  WhereClause
9f10: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
9f20: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
9f30: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
9f40: 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
9f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
9f60: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  or number of LHS
9f70: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
9f80: 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  n,          /* C
9f90: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
9fa0: 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  LHS */.  Bitmask
9fb0: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
9fc0: 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f  * RHS must not o
9fd0: 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73  verlap with this
9fe0: 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f   mask */.  u32 o
9ff0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
a000: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78   /* Mask of WO_x
a010: 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62  x values describ
a020: 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ing operator */.
a030: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
a040: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
a050: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
a060: 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69  th this index, i
a070: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
a080: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52  .  WhereTerm *pR
a090: 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57 68 65  esult = 0;.  Whe
a0a0: 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57 68 65  reTerm *p;.  Whe
a0b0: 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a 20 20  reScan scan;..  
a0c0: 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  p = whereScanIni
a0d0: 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20 69 43  t(&scan, pWC, iC
a0e0: 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c  ur, iColumn, op,
a0f0: 20 70 49 64 78 29 3b 0a 20 20 77 68 69 6c 65 28   pIdx);.  while(
a100: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70   p ){.    if( (p
a110: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
a120: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a  notReady)==0 ){.
a130: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65        if( p->pre
a140: 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28  reqRight==0 && (
a150: 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f  p->eOperator&WO_
a160: 45 51 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  EQ)!=0 ){.      
a170: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20    return p;.    
a180: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52    }.      if( pR
a190: 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73 75  esult==0 ) pResu
a1a0: 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  lt = p;.    }.  
a1b0: 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 4e    p = whereScanN
a1c0: 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d 0a  ext(&scan);.  }.
a1d0: 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c 74    return pResult
a1e0: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
a1f0: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
a200: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
a210: 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 57  lyze(SrcList*, W
a220: 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74  hereClause*, int
a230: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65  );../*.** Call e
a240: 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c  xprAnalyze on al
a250: 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45  l terms in a WHE
a260: 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2f 0a  RE clause.  .*/.
a270: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
a280: 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72  AnalyzeAll(.  Sr
a290: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
a2a0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
a2b0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
a2c0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
a2d0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
a2e0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
a2f0: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
a300: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
a310: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20  i=pWC->nTerm-1; 
a320: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
a330: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62  exprAnalyze(pTab
a340: 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20  List, pWC, i);. 
a350: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
a360: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
a370: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
a380: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
a390: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
a3a0: 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45  ession is a LIKE
a3b0: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
a3c0: 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  r that.** can be
a3d0: 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
a3e0: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
a3f0: 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e  traints.  Return
a400: 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a   TRUE if it is.*
a410: 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69  * so and false i
a420: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  f not..**.** In 
a430: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70  order for the op
a440: 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74  erator to be opt
a450: 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48  imizible, the RH
a460: 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69  S must be a stri
a470: 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68  ng.** literal th
a480: 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  at does not begi
a490: 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72  n with a wildcar
a4a0: 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  d.  .*/.static i
a4b0: 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  nt isLikeOrGlob(
a4c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a4d0: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
a4e0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
a4f0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
a500: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
a510: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
a520: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
a530: 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c  Expr **ppPrefix,
a540: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
a550: 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73  TK_STRING expres
a560: 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72  sion with patter
a570: 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e  n prefix */.  in
a580: 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20  t *pisComplete, 
a590: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f  /* True if the o
a5a0: 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20  nly wildcard is 
a5b0: 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68  % in the last ch
a5c0: 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74  aracter */.  int
a5d0: 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f   *pnoCase      /
a5e0: 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63  * True if upperc
a5f0: 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ase is equivalen
a600: 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a  t to lowercase *
a610: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
a620: 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20  r *z = 0;       
a630: 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52    /* String on R
a640: 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61  HS of LIKE opera
a650: 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  tor */.  Expr *p
a660: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20  Right, *pLeft;  
a670: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64      /* Right and
a680: 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49   left size of LI
a690: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
a6a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
a6b0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
a6c0: 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20  ist of operands 
a6d0: 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  to the LIKE oper
a6e0: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b  ator */.  int c;
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a700: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72       /* One char
a710: 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a  acter in z[] */.
a720: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a740: 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69  Number of non-wi
a750: 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68  ldcard prefix ch
a760: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68  aracters */.  ch
a770: 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20  ar wc[3];       
a780: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64           /* Wild
a790: 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20  card characters 
a7a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
a7b0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
a7c0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
a7d0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ection */.  sqli
a7e0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
a7f0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20  = 0;.  int op;  
a800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a810: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70    /* Opcode of p
a820: 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20  Right */..  if( 
a830: 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75  !sqlite3IsLikeFu
a840: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72  nction(db, pExpr
a850: 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29  , pnoCase, wc) )
a860: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a870: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
a880: 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a  E_EBCDIC.  if( *
a890: 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e  pnoCase ) return
a8a0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69   0;.#endif.  pLi
a8b0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
a8c0: 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70  ist;.  pLeft = p
a8d0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
a8e0: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  ;.  if( pLeft->o
a8f0: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20  p!=TK_COLUMN .  
a900: 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41   || sqlite3ExprA
a910: 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d  ffinity(pLeft)!=
a920: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
a930: 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  .   || IsVirtual
a940: 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20 20  (pLeft->pTab).  
a950: 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ){.    /* IMP: R
a960: 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54 68 65  -02065-49465 The
a970: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
a980: 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47  of the LIKE or G
a990: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73  LOB operator mus
a9a0: 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
a9b0: 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78  name of an index
a9c0: 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54  ed column with T
a9d0: 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f  EXT affinity. */
a9e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a9f0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65   }.  assert( pLe
aa00: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31  ft->iColumn!=(-1
aa10: 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  ) ); /* Because 
aa20: 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46  IPK never has AF
aa30: 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69  F_TEXT */..  pRi
aa40: 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  ght = pList->a[0
aa50: 5d 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20  ].pExpr;.  op = 
aa60: 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66  pRight->op;.  if
aa70: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
aa80: 52 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52  R ){.    op = pR
aa90: 69 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20  ight->op2;.  }. 
aaa0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49   if( op==TK_VARI
aab0: 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65  ABLE ){.    Vdbe
aac0: 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20 70   *pReprepare = p
aad0: 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72  Parse->pReprepar
aae0: 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  e;.    int iCol 
aaf0: 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d  = pRight->iColum
ab00: 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71  n;.    pVal = sq
ab10: 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
ab20: 64 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72  dValue(pReprepar
ab30: 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  e, iCol, SQLITE_
ab40: 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69  AFF_NONE);.    i
ab50: 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74  f( pVal && sqlit
ab60: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
ab70: 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  al)==SQLITE_TEXT
ab80: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63   ){.      z = (c
ab90: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
aba0: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a  lue_text(pVal);.
abb0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
abc0: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
abd0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69  pParse->pVdbe, i
abe0: 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Col);.    assert
abf0: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
ac00: 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69  _VARIABLE || pRi
ac10: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  ght->op==TK_REGI
ac20: 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20  STER );.  }else 
ac30: 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  if( op==TK_STRIN
ac40: 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69  G ){.    z = pRi
ac50: 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  ght->u.zToken;. 
ac60: 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20   }.  if( z ){.  
ac70: 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77    cnt = 0;.    w
ac80: 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29  hile( (c=z[cnt])
ac90: 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20  !=0 && c!=wc[0] 
aca0: 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63  && c!=wc[1] && c
acb0: 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20  !=wc[2] ){.     
acc0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   cnt++;.    }.  
acd0: 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26 20    if( cnt!=0 && 
ace0: 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31  255!=(u8)z[cnt-1
acf0: 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ] ){.      Expr 
ad00: 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20  *pPrefix;.      
ad10: 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63  *pisComplete = c
ad20: 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74  ==wc[0] && z[cnt
ad30: 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50  +1]==0;.      pP
ad40: 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45  refix = sqlite3E
ad50: 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e  xpr(db, TK_STRIN
ad60: 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  G, z);.      if(
ad70: 20 70 50 72 65 66 69 78 20 29 20 70 50 72 65 66   pPrefix ) pPref
ad80: 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74  ix->u.zToken[cnt
ad90: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 70  ] = 0;.      *pp
ada0: 50 72 65 66 69 78 20 3d 20 70 50 72 65 66 69 78  Prefix = pPrefix
adb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d  ;.      if( op==
adc0: 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20  TK_VARIABLE ){. 
add0: 20 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d         Vdbe *v =
ade0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
adf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ae00: 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c  dbeSetVarmask(v,
ae10: 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
ae20: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  );.        if( *
ae30: 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70  pisComplete && p
ae40: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  Right->u.zToken[
ae50: 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
ae60: 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f 66  /* If the rhs of
ae70: 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73   the LIKE expres
ae80: 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62  sion is a variab
ae90: 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  le, and the curr
aea0: 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ent.          **
aeb0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61   value of the va
aec0: 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65  riable means the
aed0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
aee0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45   invoke the LIKE
aef0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75  .          ** fu
af00: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20  nction, then no 
af10: 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c  OP_Variable will
af20: 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
af30: 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20   program..      
af40: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73      ** This caus
af50: 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  es problems for 
af60: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
af70: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
af80: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41  ).          ** A
af90: 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75 6e  PI. To workaroun
afa0: 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75  d them, add a du
afb0: 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20  mmy OP_Variable 
afc0: 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20  here..          
afd0: 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e  */ .          in
afe0: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
aff0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
b000: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
b010: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
b020: 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  t(pParse, pRight
b030: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
b040: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
b050: 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56  geP3(v, sqlite3V
b060: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
b070: 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  )-1, 0);.       
b080: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
b090: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
b0a0: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   r1);.        }.
b0b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
b0c0: 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a  e{.      z = 0;.
b0d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
b0e0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
b0f0: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a  al);.  return (z
b100: 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  !=0);.}.#endif /
b110: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
b120: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
b130: 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
b140: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
b150: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63  TABLE./*.** Chec
b160: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
b170: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
b180: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
b190: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  **.**         co
b1a0: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a  lumn MATCH expr.
b1b0: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74  **.** If it is t
b1c0: 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e  hen return TRUE.
b1d0: 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e    If not, return
b1e0: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
b1f0: 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43  c int isMatchOfC
b200: 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70  olumn(.  Expr *p
b210: 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73  Expr      /* Tes
b220: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
b230: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  n */.){.  ExprLi
b240: 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66  st *pList;..  if
b250: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
b260: 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
b270: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
b280: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
b290: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
b2a0: 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29  en,"match")!=0 )
b2b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
b2c0: 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45    }.  pList = pE
b2d0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
b2e0: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
b2f0: 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=2 ){.    retur
b300: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
b310: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
b320: 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d  ->op != TK_COLUM
b330: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
b340: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
b350: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
b360: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
b370: 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
b380: 2a 20 49 66 20 74 68 65 20 70 42 61 73 65 20 65  * If the pBase e
b390: 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e  xpression origin
b3a0: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
b3b0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
b3c0: 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65  f.** a join, the
b3d0: 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 61  n transfer the a
b3e0: 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69  ppropriate marki
b3f0: 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69  ngs over to deri
b400: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ved..*/.static v
b410: 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e  oid transferJoin
b420: 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70  Markings(Expr *p
b430: 44 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70  Derived, Expr *p
b440: 42 61 73 65 29 7b 0a 20 20 69 66 28 20 70 44 65  Base){.  if( pDe
b450: 72 69 76 65 64 20 29 7b 0a 20 20 20 20 70 44 65  rived ){.    pDe
b460: 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20  rived->flags |= 
b470: 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45  pBase->flags & E
b480: 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20  P_FromJoin;.    
b490: 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74  pDerived->iRight
b4a0: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73  JoinTable = pBas
b4b0: 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
b4c0: 6c 65 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21  le;.  }.}..#if !
b4d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b4e0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
b4f0: 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  ION) && !defined
b500: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
b510: 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61  QUERY)./*.** Ana
b520: 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74  lyze a term that
b530: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f   consists of two
b540: 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e   or more OR-conn
b550: 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d  ected.** subterm
b560: 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a  s.  So in:.**.**
b570: 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20       ... WHERE  
b580: 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f  (a=5) AND (b=7 O
b590: 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41  R c=9 OR d=13) A
b5a0: 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20  ND (d=13).**    
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5c0: 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e        ^^^^^^^^^^
b5d0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a  ^^^^^^^^^^.**.**
b5e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   This routine an
b5f0: 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63  alyzes terms suc
b600: 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20  h as the middle 
b610: 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76  term in the abov
b620: 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20  e example..** A 
b630: 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65  WhereOrTerm obje
b640: 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61  ct is computed a
b650: 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  nd attached to t
b660: 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a  he term under.**
b670: 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72   analysis, regar
b680: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dless of the out
b690: 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c  come of the anal
b6a0: 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a  ysis.  Hence:.**
b6b0: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
b6c0: 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20  m.wtFlags   |=  
b6d0: 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20  TERM_ORINFO.**  
b6e0: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70     WhereTerm.u.p
b6f0: 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e  OrInfo  =  a dyn
b700: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
b710: 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f  ed WhereOrTerm o
b720: 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  bject.**.** The 
b730: 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79  term being analy
b740: 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20 74 77  zed must have tw
b750: 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d  o or more of OR-
b760: 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72  connected subter
b770: 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  ms..** A single 
b780: 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65  subterm might be
b790: 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f   a set of AND-co
b7a0: 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62 74  nnected sub-subt
b7b0: 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65  erms..** Example
b7c0: 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72  s of terms under
b7d0: 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a   analysis:.**.**
b7e0: 20 20 20 20 20 28 41 29 20 20 20 20 20 74 31 2e       (A)     t1.
b7f0: 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74  x=t2.y OR t1.x=t
b800: 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f  2.z OR t1.y=15 O
b810: 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a  R t1.z=t3.a+5.**
b820: 20 20 20 20 20 28 42 29 20 20 20 20 20 78 3d 65       (B)     x=e
b830: 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20  xpr1 OR expr2=x 
b840: 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20  OR x=expr3.**   
b850: 20 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74    (C)     t1.x=t
b860: 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e  2.y OR (t1.x=t2.
b870: 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a  z AND t1.y=15).*
b880: 2a 20 20 20 20 20 28 44 29 20 20 20 20 20 78 3d  *     (D)     x=
b890: 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41  expr1 OR (y>11 A
b8a0: 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49  ND y<22 AND z LI
b8b0: 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a  KE '*hello*').**
b8c0: 20 20 20 20 20 28 45 29 20 20 20 20 20 28 70 2e       (E)     (p.
b8d0: 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e  a=1 AND q.b=2 AN
b8e0: 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78  D r.c=3) OR (p.x
b8f0: 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44  =4 AND q.y=5 AND
b900: 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41   r.z=6).**.** CA
b910: 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61  SE 1:.**.** If a
b920: 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20  ll subterms are 
b930: 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d  of the form T.C=
b940: 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69  expr for some si
b950: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43  ngle column of C
b960: 20 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65   and.** a single
b970: 20 74 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f   table T (as sho
b980: 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20  wn in example B 
b990: 61 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61  above) then crea
b9a0: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
b9b0: 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73  .** term that is
b9c0: 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49   an equivalent I
b9d0: 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  N expression.  I
b9e0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
b9f0: 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65  f the term.** be
ba00: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a  ing analyzed is:
ba10: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20  .**.**      x = 
ba20: 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32  expr1  OR  expr2
ba30: 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78   = x  OR  x = ex
ba40: 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63  pr3.**.** then c
ba50: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
ba60: 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68  ual term like th
ba70: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  is:.**.**      x
ba80: 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32   IN (expr1,expr2
ba90: 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41  ,expr3).**.** CA
baa0: 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61  SE 2:.**.** If a
bab0: 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20  ll subterms are 
bac0: 69 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20 73  indexable by a s
bad0: 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74  ingle table T, t
bae0: 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20  hen set.**.**   
baf0: 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65    WhereTerm.eOpe
bb00: 72 61 74 6f 72 20 20 20 20 20 20 20 20 20 20 20  rator           
bb10: 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20     =  WO_OR.**  
bb20: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70     WhereTerm.u.p
bb30: 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
bb40: 65 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f  e  |=  the curso
bb50: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62  r number for tab
bb60: 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62  le T.**.** A sub
bb70: 74 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62  term is "indexab
bb80: 6c 65 22 20 69 66 20 69 74 20 69 73 20 6f 66 20  le" if it is of 
bb90: 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43  the form.** "T.C
bba0: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68   <op> <expr>" wh
bbb0: 65 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c  ere C is any col
bbc0: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61  umn of table T a
bbd0: 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f  nd .** <op> is o
bbe0: 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20  ne of "=", "<", 
bbf0: 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c  "<=", ">", ">=",
bc00: 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22   "IS NULL", or "
bc10: 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72  IN"..** A subter
bc20: 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61  m is also indexa
bc30: 62 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e 20  ble if it is an 
bc40: 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  AND of two or mo
bc50: 72 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d  re.** subsubterm
bc60: 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  s at least one o
bc70: 66 20 77 68 69 63 68 20 69 73 20 69 6e 64 65 78  f which is index
bc80: 61 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65  able.  Indexable
bc90: 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d   AND .** subterm
bca0: 73 20 68 61 76 65 20 74 68 65 69 72 20 65 4f 70  s have their eOp
bcb0: 65 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f  erator set to WO
bcc0: 5f 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61  _AND and they ha
bcd0: 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f  ve.** u.pAndInfo
bce0: 20 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69   set to a dynami
bcf0: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
bd00: 57 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a  WhereAndTerm obj
bd10: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20  ect..**.** From 
bd20: 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66  another point of
bd30: 20 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c   view, "indexabl
bd40: 65 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  e" means that th
bd50: 65 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a  e subterm could.
bd60: 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62  ** potentially b
bd70: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
bd80: 6e 64 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f  ndex if an appro
bd90: 70 72 69 61 74 65 20 69 6e 64 65 78 20 65 78 69  priate index exi
bda0: 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61  sts..** This ana
bdb0: 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63  lysis does not c
bdc0: 6f 6e 73 69 64 65 72 20 77 68 65 74 68 65 72 20  onsider whether 
bdd0: 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78  or not the index
bde0: 20 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a   exists; that.**
bdf0: 20 69 73 20 64 65 63 69 64 65 64 20 65 6c 73 65   is decided else
be00: 77 68 65 72 65 2e 20 20 54 68 69 73 20 61 6e 61  where.  This ana
be10: 6c 79 73 69 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73  lysis only looks
be20: 20 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74   at whether subt
be30: 65 72 6d 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69  erms.** appropri
be40: 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  ate for indexing
be50: 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c   exist..**.** Al
be60: 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72  l examples A thr
be70: 6f 75 67 68 20 45 20 61 62 6f 76 65 20 73 61 74  ough E above sat
be80: 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 42 75  isfy case 2.  Bu
be90: 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61  t if a term.** a
bea0: 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73 20 63  lso statisfies c
beb0: 61 73 65 20 31 20 28 73 75 63 68 20 61 73 20 42  ase 1 (such as B
bec0: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
bed0: 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c  he optimizer wil
bee0: 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66  l.** always pref
bef0: 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e  er case 1, so in
bf00: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 70 72   that case we pr
bf10: 65 74 65 6e 64 20 74 68 61 74 20 63 61 73 65 20  etend that case 
bf20: 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69  2 is not.** sati
bf30: 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  sfied..**.** It 
bf40: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
bf50: 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20  e that multiple 
bf60: 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78  tables are index
bf70: 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  able.  For examp
bf80: 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65  le,.** (E) above
bf90: 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e   is indexable on
bfa0: 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e   tables P, Q, an
bfb0: 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  d R..**.** Terms
bfc0: 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61   that satisfy ca
bfd0: 73 65 20 32 20 61 72 65 20 63 61 6e 64 69 64 61  se 2 are candida
bfe0: 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62  tes for lookup b
bff0: 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72  y using.** separ
c000: 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66  ate indices to f
c010: 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65  ind rowids for e
c020: 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20  ach subterm and 
c030: 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  composing.** the
c040: 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f   union of all ro
c050: 77 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77  wids using a Row
c060: 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
c070: 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20  s is similar.** 
c080: 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63  to "bitmap indic
c090: 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74  es" in other dat
c0a0: 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a  abase engines..*
c0b0: 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a  *.** OTHERWISE:.
c0c0: 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72  **.** If neither
c0d0: 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65   case 1 nor case
c0e0: 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c   2 apply, then l
c0f0: 65 61 76 65 20 74 68 65 20 65 4f 70 65 72 61 74  eave the eOperat
c100: 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72  or set to.** zer
c110: 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69 73  o.  This term is
c120: 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20   not useful for 
c130: 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69  search..*/.stati
c140: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
c150: 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c  zeOrTerm(.  SrcL
c160: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
c170: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
c180: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
c190: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
c1a0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63          /* the c
c1b0: 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c  omplete WHERE cl
c1c0: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ause */.  int id
c1d0: 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  xTerm           
c1e0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
c1f0: 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62  the OR-term to b
c200: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
c210: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
c220: 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
c230: 66 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48  fo;        /* WH
c240: 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
c250: 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ssing context */
c260: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c270: 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
c280: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e;         /* Pa
c290: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
c2a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c2b0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
c2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
c2d0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
c2e0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
c2f0: 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  *pTerm = &pWC->a
c300: 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a  [idxTerm];    /*
c310: 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   The term to be 
c320: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78  analyzed */.  Ex
c330: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
c340: 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20  m->pExpr;       
c350: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c360: 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74  ression of the t
c370: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  erm */.  int i; 
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3a0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
c3b0: 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  s */.  WhereClau
c3c0: 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20  se *pOrWc;      
c3d0: 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70   /* Breakup of p
c3e0: 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72  Term into subter
c3f0: 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ms */.  WhereTer
c400: 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20  m *pOrTerm;     
c410: 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20    /* A Sub-term 
c420: 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63  within the pOrWc
c430: 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66   */.  WhereOrInf
c440: 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20  o *pOrInfo;     
c450: 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e  /* Additional in
c460: 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69  formation associ
c470: 61 74 65 64 20 77 69 74 68 20 70 54 65 72 6d 20  ated with pTerm 
c480: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e  */.  Bitmask chn
c490: 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f  gToIN;         /
c4a0: 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69  * Tables that mi
c4b0: 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65  ght satisfy case
c4c0: 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20   1 */.  Bitmask 
c4d0: 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20  indexable;      
c4e0: 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74    /* Tables that
c4f0: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20   are indexable, 
c500: 73 61 74 69 73 66 79 69 6e 67 20 63 61 73 65 20  satisfying case 
c510: 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  2 */..  /*.  ** 
c520: 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61  Break the OR cla
c530: 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70  use into its sep
c540: 61 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20  arate subterms. 
c550: 20 54 68 65 20 73 75 62 74 65 72 6d 73 20 61 72   The subterms ar
c560: 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e  e.  ** stored in
c570: 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73   a WhereClause s
c580: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
c590: 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 57  ing within the W
c5a0: 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20  hereOrInfo.  ** 
c5b0: 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61  object that is a
c5c0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f  ttached to the o
c5d0: 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73  riginal OR claus
c5e0: 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61  e term..  */.  a
c5f0: 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77  ssert( (pTerm->w
c600: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44  tFlags & (TERM_D
c610: 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e  YNAMIC|TERM_ORIN
c620: 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29  FO|TERM_ANDINFO)
c630: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
c640: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
c650: 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75  OR );.  pTerm->u
c660: 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e  .pOrInfo = pOrIn
c670: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
c680: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
c690: 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a  eof(*pOrInfo));.
c6a0: 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30    if( pOrInfo==0
c6b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65   ) return;.  pTe
c6c0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
c6d0: 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f  ERM_ORINFO;.  pO
c6e0: 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e  rWc = &pOrInfo->
c6f0: 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  wc;.  whereClaus
c700: 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 49  eInit(pOrWc, pWI
c710: 6e 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  nfo);.  whereSpl
c720: 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c  it(pOrWc, pExpr,
c730: 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41   TK_OR);.  exprA
c740: 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20  nalyzeAll(pSrc, 
c750: 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62  pOrWc);.  if( db
c760: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c770: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
c780: 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e  t( pOrWc->nTerm>
c790: 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  =2 );..  /*.  **
c7a0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74   Compute the set
c7b0: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
c7c0: 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61  might satisfy ca
c7d0: 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f  ses 1 or 2..  */
c7e0: 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e  .  indexable = ~
c7f0: 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68  (Bitmask)0;.  ch
c800: 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61  ngToIN = ~(Bitma
c810: 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f  sk)0;.  for(i=pO
c820: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f  rWc->nTerm-1, pO
c830: 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20  rTerm=pOrWc->a; 
c840: 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c  i>=0 && indexabl
c850: 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  e; i--, pOrTerm+
c860: 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72  +){.    if( (pOr
c870: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
c880: 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  & WO_SINGLE)==0 
c890: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e  ){.      WhereAn
c8a0: 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b  dInfo *pAndInfo;
c8b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
c8c0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
c8d0: 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f   & (TERM_ANDINFO
c8e0: 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d  |TERM_ORINFO))==
c8f0: 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54  0 );.      chngT
c900: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  oIN = 0;.      p
c910: 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  AndInfo = sqlite
c920: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
c930: 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66   sizeof(*pAndInf
c940: 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  o));.      if( p
c950: 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  AndInfo ){.     
c960: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
c970: 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20  pAndWC;.        
c980: 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54  WhereTerm *pAndT
c990: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  erm;.        int
c9a0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   j;.        Bitm
c9b0: 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20  ask b = 0;.     
c9c0: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41     pOrTerm->u.pA
c9d0: 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66  ndInfo = pAndInf
c9e0: 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  o;.        pOrTe
c9f0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
ca00: 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20  ERM_ANDINFO;.   
ca10: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f       pOrTerm->eO
ca20: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44  perator = WO_AND
ca30: 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43  ;.        pAndWC
ca40: 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63   = &pAndInfo->wc
ca50: 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43  ;.        whereC
ca60: 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43  lauseInit(pAndWC
ca70: 2c 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a  , pWC->pWInfo);.
ca80: 20 20 20 20 20 20 20 20 77 68 65 72 65 53 70 6c          whereSpl
ca90: 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65  it(pAndWC, pOrTe
caa0: 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e  rm->pExpr, TK_AN
cab0: 44 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72  D);.        expr
cac0: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c  AnalyzeAll(pSrc,
cad0: 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20   pAndWC);.      
cae0: 20 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72    pAndWC->pOuter
caf0: 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20   = pWC;.        
cb00: 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61  testcase( db->ma
cb10: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
cb20: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
cb30: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
cb40: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
cb50: 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57  , pAndTerm=pAndW
cb60: 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e  C->a; j<pAndWC->
cb70: 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64  nTerm; j++, pAnd
cb80: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
cb90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41 6e       assert( pAn
cba0: 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  dTerm->pExpr );.
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
cbc0: 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65  allowedOp(pAndTe
cbd0: 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29  rm->pExpr->op) )
cbe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
cbf0: 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57  b |= getMask(&pW
cc00: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
cc10: 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pAndTerm->leftCu
cc20: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20  rsor);.         
cc30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
cc40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cc50: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
cc60: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
cc70: 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
cc80: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
cc90: 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20  _COPIED ){.     
cca0: 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65   /* Skip this te
ccb0: 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20  rm for now.  We 
ccc0: 72 65 76 69 73 69 74 20 69 74 20 77 68 65 6e 20  revisit it when 
ccd0: 77 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20  we process the. 
cce0: 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f       ** correspo
ccf0: 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55  nding TERM_VIRTU
cd00: 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d  AL term */.    }
cd10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
cd20: 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d  ask b;.      b =
cd30: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
cd40: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  ->sMaskSet, pOrT
cd50: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
cd60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
cd70: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
cd80: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20  ERM_VIRTUAL ){. 
cd90: 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
cda0: 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57   *pOther = &pOrW
cdb0: 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50  c->a[pOrTerm->iP
cdc0: 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20  arent];.        
cdd0: 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57  b |= getMask(&pW
cde0: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
cdf0: 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73  pOther->leftCurs
ce00: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
ce10: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
ce20: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f  b;.      if( (pO
ce30: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
ce40: 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a   & WO_EQ)==0 ){.
ce50: 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e          chngToIN
ce60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
ce70: 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54  e{.        chngT
ce80: 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20  oIN &= b;.      
ce90: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
cea0: 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68  *.  ** Record th
ceb0: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
cec0: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73  that satisfy cas
ced0: 65 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69  e 2.  The set mi
cee0: 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74  ght be.  ** empt
cef0: 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66  y..  */.  pOrInf
cf00: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69  o->indexable = i
cf10: 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72  ndexable;.  pTer
cf20: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69  m->eOperator = i
cf30: 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20  ndexable==0 ? 0 
cf40: 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20  : WO_OR;..  /*. 
cf50: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c   ** chngToIN hol
cf60: 64 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c  ds a set of tabl
cf70: 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20  es that *might* 
cf80: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20  satisfy case 1. 
cf90: 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76   But.  ** we hav
cfa0: 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64  e to do some add
cfb0: 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67  itional checking
cfc0: 20 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20   to see if case 
cfd0: 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73  1 really.  ** is
cfe0: 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a   satisfied..  **
cff0: 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77  .  ** chngToIN w
d000: 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20  ill hold either 
d010: 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e  0, 1, or 2 bits.
d020: 20 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65    The 0-bit case
d030: 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74   means.  ** that
d040: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73   there is no pos
d050: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e  sibility of tran
d060: 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20  sforming the OR 
d070: 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20  clause into an. 
d080: 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   ** IN operator 
d090: 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d  because one or m
d0a0: 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ore terms in the
d0b0: 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   OR clause conta
d0c0: 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e  in.  ** somethin
d0d0: 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20  g other than == 
d0e0: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  on a column in t
d0f0: 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e  he single table.
d100: 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a    The 1-bit.  **
d110: 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74   case means that
d120: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
d130: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20  he OR clause is 
d140: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a  of the form.  **
d150: 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65   "table.column=e
d160: 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69  xpr" for some si
d170: 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ngle table.  The
d180: 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73   one bit that is
d190: 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63   set.  ** will c
d1a0: 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65  orrespond to the
d1b0: 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20   common table.  
d1c0: 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  We still need to
d1d0: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20   check to make. 
d1e0: 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d   ** sure the sam
d1f0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  e column is used
d200: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20   on all terms.  
d210: 54 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69  The 2-bit case i
d220: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  s when.  ** the 
d230: 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66  all terms are of
d240: 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65   the form "table
d250: 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e  1.column=table2.
d260: 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a  column".  It.  *
d270: 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69  * might be possi
d280: 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49  ble to form an I
d290: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
d2a0: 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f  either table1.co
d2b0: 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62  lumn.  ** or tab
d2c0: 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68  le2.column as th
d2d0: 65 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20  e LHS if either 
d2e0: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65  is common to eve
d2f0: 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20  ry term of.  ** 
d300: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20  the OR clause.. 
d310: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
d320: 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  at terms of the 
d330: 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75  form "table.colu
d340: 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e  mn1=table.column
d350: 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d  2" (the.  ** sam
d360: 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20  e table on both 
d370: 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29  sizes of the ==)
d380: 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d   cannot be optim
d390: 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ized..  */.  if(
d3a0: 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20   chngToIN ){.   
d3b0: 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49   int okToChngToI
d3c0: 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  N = 0;     /* Tr
d3d0: 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72  ue if the conver
d3e0: 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61  sion to IN is va
d3f0: 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  lid */.    int i
d400: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20  Column = -1;    
d410: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69       /* Column i
d420: 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49  ndex on lhs of I
d430: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
d440: 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20    int iCursor = 
d450: 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  -1;         /* T
d460: 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d  able cursor comm
d470: 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20  on to all terms 
d480: 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30  */.    int j = 0
d490: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d4a0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
d4b0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72   */..    /* Sear
d4c0: 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61  ch for a table a
d4d0: 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61  nd column that a
d4e0: 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69  ppears on one si
d4f0: 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  de or the.    **
d500: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d   other of the ==
d510: 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65   operator in eve
d520: 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61  ry subterm.  Tha
d530: 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  t table and colu
d540: 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  mn.    ** will b
d550: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43  e recorded in iC
d560: 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d  ursor and iColum
d570: 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20  n.  There might 
d580: 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a  not be any.    *
d590: 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64  * such table and
d5a0: 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b   column.  Set ok
d5b0: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e  ToChngToIN if an
d5c0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62   appropriate tab
d5d0: 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f  le.    ** and co
d5e0: 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75  lumn is found bu
d5f0: 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67  t leave okToChng
d600: 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f  ToIN false if no
d610: 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a  t found..    */.
d620: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32      for(j=0; j<2
d630: 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49   && !okToChngToI
d640: 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70  N; j++){.      p
d650: 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e  OrTerm = pOrWc->
d660: 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  a;.      for(i=p
d670: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69  OrWc->nTerm-1; i
d680: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72  >=0; i--, pOrTer
d690: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  m++){.        as
d6a0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
d6b0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
d6c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54   );.        pOrT
d6d0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20  erm->wtFlags &= 
d6e0: 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20  ~TERM_OR_OK;.   
d6f0: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
d700: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
d710: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
d720: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
d730: 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64  e 2-bit case and
d740: 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73   we are on the s
d750: 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20  econd iteration 
d760: 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
d770: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73   current term is
d780: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
d790: 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73  iteration.  So s
d7a0: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a  kip this term. *
d7b0: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
d7c0: 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20  rt( j==1 );.    
d7d0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
d7e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d7f0: 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20    if( (chngToIN 
d800: 26 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  & getMask(&pWInf
d810: 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72  o->sMaskSet, pOr
d820: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
d830: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
d840: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20     /* This term 
d850: 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66  must be of the f
d860: 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77  orm t1.a==t2.b w
d870: 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68  here t2 is in th
d880: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
d890: 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20  hngToIN set but 
d8a0: 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73  t1 is not.  This
d8b0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69   term will be ei
d8c0: 74 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20  ther preceeded. 
d8d0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66           ** or f
d8e0: 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76  ollwed by an inv
d8f0: 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62  erted copy (t2.b
d900: 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74  ==t1.a).  Skip t
d910: 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20  his term .      
d920: 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69      ** and use i
d930: 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f  ts inversion. */
d940: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
d950: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
d960: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
d970: 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IED );.         
d980: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
d990: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
d9a0: 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
d9b0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d9c0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
d9d0: 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c   & (TERM_COPIED|
d9e0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b  TERM_VIRTUAL) );
d9f0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
da00: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
da10: 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
da20: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
da30: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
da40: 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72  iCursor = pOrTer
da50: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20  m->leftCursor;. 
da60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
da70: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
da80: 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  i<0 ){.        /
da90: 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74  * No candidate t
daa0: 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20  able+column was 
dab0: 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e  found.  This can
dac0: 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20   only occur.    
dad0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65      ** on the se
dae0: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a  cond iteration *
daf0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
db00: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
db10: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
db20: 72 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29  rOfTwo(chngToIN)
db30: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
db40: 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65  rt( chngToIN==ge
db50: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
db60: 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72  MaskSet, iCursor
db70: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ) );.        bre
db80: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
db90: 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31    testcase( j==1
dba0: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65   );..      /* We
dbb0: 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61   have found a ca
dbc0: 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e  ndidate table an
dbd0: 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b  d column.  Check
dbe0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a   to see if that.
dbf0: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
dc00: 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d  nd column is com
dc10: 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72  mon to every ter
dc20: 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75  m in the OR clau
dc30: 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f  se */.      okTo
dc40: 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20  ChngToIN = 1;.  
dc50: 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26      for(; i>=0 &
dc60: 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20  & okToChngToIN; 
dc70: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
dc80: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
dc90: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
dca0: 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
dcb0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
dcc0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
dcd0: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
dce0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
dcf0: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
dd00: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  R_OK;.        }e
dd10: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
dd20: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69  >u.leftColumn!=i
dd30: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
dd40: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
dd50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
dd60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
dd70: 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52  nt affLeft, affR
dd80: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
dd90: 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d  /* If the right-
dda0: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73  hand side is als
ddb0: 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  o a column, then
ddc0: 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a   the affinities.
ddd0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
dde0: 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c  both right and l
ddf0: 65 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62  eft sides must b
de00: 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74  e such that no t
de10: 79 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ype.          **
de20: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65   conversions are
de30: 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65   required on the
de40: 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74   right.  (Ticket
de50: 20 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20   #2249).        
de60: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61    */.          a
de70: 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  ffRight = sqlite
de80: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
de90: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  rTerm->pExpr->pR
dea0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
deb0: 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74   affLeft = sqlit
dec0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
ded0: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
dee0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Left);.         
def0: 20 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30   if( affRight!=0
df00: 20 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66   && affRight!=af
df10: 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  fLeft ){.       
df20: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
df30: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  N = 0;.         
df40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
df50: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
df60: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f  lags |= TERM_OR_
df70: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
df80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
df90: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
dfa0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f  At this point, o
dfb0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74  kToChngToIN is t
dfc0: 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20  rue if original 
dfd0: 70 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a  pTerm satisfies.
dfe0: 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20      ** case 1.  
dff0: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f  In that case, co
e000: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69  nstruct a new vi
e010: 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20  rtual term that 
e020: 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d  is .    ** pTerm
e030: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
e040: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  an IN operator..
e050: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f      */.    if( o
e060: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20  kToChngToIN ){. 
e070: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
e080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
e090: 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69   transient dupli
e0a0: 63 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  cate expression 
e0b0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
e0c0: 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20  t *pList = 0;   
e0d0: 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68  /* The RHS of th
e0e0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
e0f0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
e100: 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ft = 0;       /*
e110: 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   The LHS of the 
e120: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
e130: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
e140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e150: 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f  he complete IN o
e160: 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20  perator */..    
e170: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
e180: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
e190: 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20  pOrWc->a; i>=0; 
e1a0: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
e1b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f  .        if( (pO
e1c0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
e1d0: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20   TERM_OR_OK)==0 
e1e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
e1f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
e200: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
e210: 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
e220: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
e230: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
e240: 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20  Cursor );.      
e250: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
e260: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
e270: 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  =iColumn );.    
e280: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
e290: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
e2a0: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  rTerm->pExpr->pR
e2b0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
e2c0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
e2d0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
e2e0: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
e2f0: 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20  pList, pDup);.  
e300: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f        pLeft = pO
e310: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
e320: 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eft;.      }.   
e330: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
e340: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75  !=0 );.      pDu
e350: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
e360: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
e370: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
e380: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
e390: 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c  se, TK_IN, pDup,
e3a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
e3b0: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
e3c0: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
e3d0: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
e3e0: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c  inMarkings(pNew,
e3f0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
e400: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
e410: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
e420: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
e430: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
e440: 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  .pList = pList;.
e450: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
e460: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
e470: 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45  rt(pWC, pNew, TE
e480: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
e490: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
e4a0: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
e4b0: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ew==0 );.       
e4c0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
e4d0: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
e4e0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
e4f0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
e500: 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e  ];.        pWC->
e510: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
e520: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
e530: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
e540: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ld = 1;.      }e
e550: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
e560: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
e570: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
e580: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65       }.      pTe
e590: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
e5a0: 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73  WO_NOOP;  /* cas
e5b0: 65 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20  e 1 trumps case 
e5c0: 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  2 */.    }.  }.}
e5d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
e5e0: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
e5f0: 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49  IZATION && !SQLI
e600: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
e610: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69   */../*.** The i
e620: 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
e630: 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65  tine is an Where
e640: 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77  Term structure w
e650: 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  ith only the.** 
e660: 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69  "pExpr" field fi
e670: 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f  lled in.  The jo
e680: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
e690: 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20  e is to analyze 
e6a0: 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73  the.** subexpres
e6b0: 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74  sion and populat
e6c0: 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
e6d0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68  fields of the Wh
e6e0: 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63  ereTerm.** struc
e6f0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
e700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
e710: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65   of the form "<e
e720: 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20  xpr> <op> X" it 
e730: 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a  gets commuted.**
e740: 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64   to the standard
e750: 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e   form of "X <op>
e760: 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20   <expr>"..**.** 
e770: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
e780: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
e790: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
e7a0: 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61  e both X and Y a
e7b0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74  re.** columns, t
e7c0: 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hen the original
e7d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
e7e0: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e  nchanged and a n
e7f0: 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65  ew virtual.** te
e800: 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
e810: 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64  Y <op> X" is add
e820: 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ed to the WHERE 
e830: 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e  clause and.** an
e840: 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c  alyzed separatel
e850: 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  y.  The original
e860: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
e870: 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44  with TERM_COPIED
e880: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20  .** and the new 
e890: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
e8a0: 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  ith TERM_DYNAMIC
e8b0: 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70   (because it's p
e8c0: 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  Expr.** needs to
e8d0: 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74   be freed with t
e8e0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20  he WhereClause) 
e8f0: 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  and TERM_VIRTUAL
e900: 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20   (because it.** 
e910: 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f  is a commuted co
e920: 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65  py of a prior te
e930: 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e  rm.)  The origin
e940: 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69  al term has nChi
e950: 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ld=1.** and the 
e960: 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65  copy has idxPare
e970: 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  nt set to the in
e980: 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69  dex of the origi
e990: 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61  nal term..*/.sta
e9a0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
e9b0: 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20  lyze(.  SrcList 
e9c0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
e9d0: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
e9e0: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
e9f0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
ea00: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
ea10: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
ea20: 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20   idxTerm        
ea30: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
ea40: 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  of the term to b
ea50: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
ea60: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
ea70: 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
ea80: 66 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  fo; /* WHERE cla
ea90: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  use processing c
eaa0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
eab0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ead0: 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
eae0: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65  nalyzed */.  Whe
eaf0: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
eb00: 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Set;          /*
eb10: 20 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e   Set of table in
eb20: 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45  dex masks */.  E
eb30: 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20  xpr *pExpr;     
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb50: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
eb60: 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  n to be analyzed
eb70: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
eb80: 65 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20  ereqLeft;       
eb90: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71         /* Prereq
eba0: 75 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70  uesites of the p
ebb0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20  Expr->pLeft */. 
ebc0: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
ebd0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
ebe0: 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74    /* Prerequesit
ebf0: 65 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20  es of pExpr */. 
ec00: 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69   Bitmask extraRi
ec10: 67 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ght = 0;        
ec20: 20 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e    /* Extra depen
ec30: 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20  dencies on LEFT 
ec40: 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  JOIN */.  Expr *
ec50: 70 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20  pStr1 = 0;      
ec60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48             /* RH
ec70: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
ec80: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
ec90: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b   isComplete = 0;
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ecb0: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
ecc0: 42 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64  B ends with wild
ecd0: 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  card */.  int no
ece0: 43 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Case = 0;       
ecf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49             /* LI
ed00: 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75  KE/GLOB distingu
ed10: 69 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20  ishes case */.  
ed20: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
ed30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed40: 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70   /* Top-level op
ed50: 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e  erator.  pExpr->
ed60: 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  op */.  Parse *p
ed70: 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
ed80: 70 50 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73  pParse;  /* Pars
ed90: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
eda0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
edb0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
edc0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
edd0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69  nnection */..  i
ede0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
edf0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
ee00: 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  n;.  }.  pTerm =
ee10: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
ee20: 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  ];.  pMaskSet = 
ee30: 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
ee40: 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65  t;.  pExpr = pTe
ee50: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73  rm->pExpr;.  ass
ee60: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
ee70: 54 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e  TK_AS && pExpr->
ee80: 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op!=TK_COLLATE )
ee90: 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d  ;.  prereqLeft =
eea0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
eeb0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
eec0: 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20  >pLeft);.  op = 
eed0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
eee0: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
eef0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
ef00: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
ef10: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
ef20: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
ef30: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
ef40: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
ef50: 71 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c  qRight = exprSel
ef60: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  ectTableUsage(pM
ef70: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78  askSet, pExpr->x
ef80: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d  .pSelect);.    }
ef90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72  else{.      pTer
efa0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
efb0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
efc0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
efd0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
efe0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
eff0: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
f000: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  {.    pTerm->pre
f010: 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20  reqRight = 0;.  
f020: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d  }else{.    pTerm
f030: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
f040: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
f050: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
f060: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70  pRight);.  }.  p
f070: 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54  rereqAll = exprT
f080: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
f090: 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  et, pExpr);.  if
f0a0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
f0b0: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
f0c0: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74  Join) ){.    Bit
f0d0: 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b  mask x = getMask
f0e0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
f0f0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
f100: 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c  e);.    prereqAl
f110: 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72  l |= x;.    extr
f120: 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f  aRight = x-1;  /
f130: 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d  * ON clause term
f140: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65  s may not be use
f150: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a  d with an index.
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f170: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66         ** on lef
f180: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
f190: 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20  T JOIN.  Ticket 
f1a0: 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70  #3015 */.  }.  p
f1b0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
f1c0: 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70  = prereqAll;.  p
f1d0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
f1e0: 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e   = -1;.  pTerm->
f1f0: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
f200: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f210: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f   = 0;.  if( allo
f220: 77 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20  wedOp(op) ){.   
f230: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73   Expr *pLeft = s
f240: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
f250: 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65  llate(pExpr->pLe
f260: 66 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  ft);.    Expr *p
f270: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
f280: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
f290: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
f2a0: 20 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20     u16 opMask = 
f2b0: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
f2c0: 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74  ght & prereqLeft
f2d0: 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20  )==0 ? WO_ALL : 
f2e0: 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66  WO_EQUIV;.    if
f2f0: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
f300: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
f310: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
f320: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
f330: 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e;.      pTerm->
f340: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
f350: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
f360: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
f370: 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72  rator = operator
f380: 4d 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73  Mask(op) & opMas
f390: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
f3a0: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68   pRight && pRigh
f3b0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
f3c0: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
f3d0: 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  erm *pNew;.     
f3e0: 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20   Expr *pDup;.   
f3f0: 20 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 20     u16 eExtraOp 
f400: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  = 0;        /* E
f410: 78 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e  xtra bits for pN
f420: 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f  ew->eOperator */
f430: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
f440: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20  ->leftCursor>=0 
f450: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
f460: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70  dxNew;.        p
f470: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
f480: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
f490: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
f4a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f4b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
f4c0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
f4d0: 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  db, pDup);.     
f4e0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
f4f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
f500: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
f510: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
f520: 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  Dup, TERM_VIRTUA
f530: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
f540: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78  .        if( idx
f550: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  New==0 ) return;
f560: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
f570: 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b  &pWC->a[idxNew];
f580: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
f590: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
f5a0: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
f5b0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
f5c0: 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  m];.        pTer
f5d0: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
f5e0: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74         pTerm->wt
f5f0: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
f600: 50 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66  PIED;.        if
f610: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f620: 45 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21  EQ.         && !
f630: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f640: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
f650: 69 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  in).         && 
f660: 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
f670: 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54  led(db, SQLITE_T
f680: 72 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20  ransitive).     
f690: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
f6a0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f6b0: 20 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20   |= WO_EQUIV;.  
f6c0: 20 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70          eExtraOp
f6d0: 20 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20   = WO_EQUIV;.   
f6e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
f6f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70  se{.        pDup
f700: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
f710: 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a    pNew = pTerm;.
f720: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78        }.      ex
f730: 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65  prCommute(pParse
f740: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70  , pDup);.      p
f750: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
f760: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44  prSkipCollate(pD
f770: 75 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  up->pLeft);.    
f780: 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73    pNew->leftCurs
f790: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
f7a0: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  le;.      pNew->
f7b0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
f7c0: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
f7d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
f7e0: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
f7f0: 72 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72  raRight) != prer
f800: 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  eqLeft );.      
f810: 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68  pNew->prereqRigh
f820: 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c  t = prereqLeft |
f830: 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20   extraRight;.   
f840: 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41     pNew->prereqA
f850: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
f860: 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65        pNew->eOpe
f870: 72 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f  rator = (operato
f880: 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20  rMask(pDup->op) 
f890: 2b 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70  + eExtraOp) & op
f8a0: 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Mask;.    }.  }.
f8b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f8c0: 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54  OMIT_BETWEEN_OPT
f8d0: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49  IMIZATION.  /* I
f8e0: 66 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20  f a term is the 
f8f0: 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
f900: 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77  , create two new
f910: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20   virtual terms. 
f920: 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20   ** that define 
f930: 74 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74  the range that t
f940: 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65  he BETWEEN imple
f950: 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d  ments.  For exam
f960: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
f970: 20 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20      a BETWEEN b 
f980: 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20  AND c.  **.  ** 
f990: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  is converted int
f9a0: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
f9b0: 20 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41    (a BETWEEN b A
f9c0: 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29  ND c) AND (a>=b)
f9d0: 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a   AND (a<=c).  **
f9e0: 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65  .  ** The two ne
f9f0: 77 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65  w terms are adde
fa00: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
fa10: 66 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  f the WhereClaus
fa20: 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54  e object..  ** T
fa30: 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65  he new terms are
fa40: 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61   "dynamic" and a
fa50: 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74  re children of t
fa60: 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57  he original BETW
fa70: 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20  EEN.  ** term.  
fa80: 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  That means that 
fa90: 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74  if the BETWEEN t
faa0: 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68  erm is coded, th
fab0: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20  e children are. 
fac0: 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72   ** skipped.  Or
fad0: 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65  , if the childre
fae0: 6e 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20  n are satisfied 
faf0: 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65  by an index, the
fb00: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42   original.  ** B
fb10: 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73  ETWEEN term is s
fb20: 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
fb30: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
fb40: 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26  p==TK_BETWEEN &&
fb50: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44   pWC->op==TK_AND
fb60: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
fb70: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
fb80: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e  >x.pList;.    in
fb90: 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20  t i;.    static 
fba0: 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d  const u8 ops[] =
fbb0: 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b   {TK_GE, TK_LE};
fbc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
fbd0: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
fbe0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
fbf0: 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28  r==2 );.    for(
fc00: 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
fc10: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
fc20: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
fc30: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  idxNew;.      pN
fc40: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
fc50: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70  PExpr(pParse, op
fc60: 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20  s[i], .         
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
fc90: 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c  up(db, pExpr->pL
fca0: 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  eft, 0),.       
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fcd0: 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e  rDup(db, pList->
fce0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20  a[i].pExpr, 0), 
fcf0: 30 29 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 66  0);.      transf
fd00: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
fd10: 4e 65 77 45 78 70 72 2c 20 70 45 78 70 72 29 3b  NewExpr, pExpr);
fd20: 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20  .      idxNew = 
fd30: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
fd40: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
fd50: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
fd60: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
fd70: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
fd80: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
fd90: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
fda0: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
fdb0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
fdc0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
fdd0: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
fde0: 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  New].iParent = i
fdf0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20  dxTerm;.    }.  
fe00: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
fe10: 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  = 2;.  }.#endif 
fe20: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
fe30: 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54  ETWEEN_OPTIMIZAT
fe40: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  ION */..#if !def
fe50: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
fe60: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
fe70: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
fe80: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
fe90: 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  RY).  /* Analyze
fea0: 20 61 20 74 65 72 6d 20 74 68 61 74 20 69 73 20   a term that is 
feb0: 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20  composed of two 
fec0: 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73  or more subterms
fed0: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
fee0: 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f  ** an OR operato
fef0: 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  r..  */.  else i
ff00: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
ff10: 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OR ){.    asser
ff20: 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  t( pWC->op==TK_A
ff30: 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  ND );.    exprAn
ff40: 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63  alyzeOrTerm(pSrc
ff50: 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b  , pWC, idxTerm);
ff60: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57  .    pTerm = &pW
ff70: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
ff80: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
ff90: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
ffa0: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
ffb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ffc0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
ffd0: 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73  ON.  /* Add cons
ffe0: 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63  traints to reduc
fff0: 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  e the search spa
10000 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20  ce on a LIKE or 
10010 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74  GLOB.  ** operat
10020 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  or..  **.  ** A 
10030 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20  like pattern of 
10040 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45  the form "x LIKE
10050 20 27 61 62 63 25 27 22 20 69 73 20 63 68 61 6e   'abc%'" is chan
10060 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61  ged into constra
10070 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ints.  **.  **  
10080 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27          x>='abc'
10090 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44   AND x<'abd' AND
100a0 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20   x LIKE 'abc%'. 
100b0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73   **.  ** The las
100c0 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  t character of t
100d0 68 65 20 70 72 65 66 69 78 20 22 61 62 63 22 20  he prefix "abc" 
100e0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74  is incremented t
100f0 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20  o form the.  ** 
10100 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64  termination cond
10110 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a  ition "abd"..  *
10120 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d  /.  if( pWC->op=
10130 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69  =TK_AND .   && i
10140 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72  sLikeOrGlob(pPar
10150 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72  se, pExpr, &pStr
10160 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20  1, &isComplete, 
10170 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20  &noCase).  ){.  
10180 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20    Expr *pLeft;  
10190 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c       /* LHS of L
101a0 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f  IKE/GLOB operato
101b0 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  r */.    Expr *p
101c0 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43  Str2;       /* C
101d0 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52  opy of pStr1 - R
101e0 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
101f0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
10200 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b  Expr *pNewExpr1;
10210 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
10220 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64  xpr2;.    int id
10230 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69  xNew1;.    int i
10240 64 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f 6b 65  dxNew2;.    Toke
10250 6e 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20  n sCollSeqName; 
10260 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
10270 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
10280 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70  /..    pLeft = p
10290 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
102a0 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [1].pExpr;.    p
102b0 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78  Str2 = sqlite3Ex
102c0 70 72 44 75 70 28 64 62 2c 20 70 53 74 72 31 2c  prDup(db, pStr1,
102d0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62   0);.    if( !db
102e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
102f0 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70  {.      u8 c, *p
10300 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74  C;       /* Last
10310 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72   character befor
10320 65 20 74 68 65 20 66 69 72 73 74 20 77 69 6c 64  e the first wild
10330 63 61 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43  card */.      pC
10340 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e   = (u8*)&pStr2->
10350 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33  u.zToken[sqlite3
10360 53 74 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e  Strlen30(pStr2->
10370 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20  u.zToken)-1];.  
10380 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20      c = *pC;.   
10390 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b     if( noCase ){
103a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
103b0 70 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72  point is to incr
103c0 65 6d 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63  ement the last c
103d0 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20  haracter before 
103e0 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
103f0 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20    ** wildcard.  
10400 42 75 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d  But if we increm
10410 65 6e 74 20 27 40 27 2c 20 74 68 61 74 20 77 69  ent '@', that wi
10420 6c 6c 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20  ll push it into 
10430 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  the.        ** a
10440 6c 70 68 61 62 65 74 69 63 20 72 61 6e 67 65 20  lphabetic range 
10450 77 68 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65  where case conve
10460 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73  rsions will mess
10470 20 75 70 20 74 68 65 20 0a 20 20 20 20 20 20 20   up the .       
10480 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20   ** inequality. 
10490 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20   To avoid this, 
104a0 6d 61 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73  make sure to als
104b0 6f 20 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20  o run the full. 
104c0 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f         ** LIKE o
104d0 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20  n all candidate 
104e0 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63  expressions by c
104f0 6c 65 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f  learing the isCo
10500 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20  mplete flag.    
10510 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
10520 66 28 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73  f( c=='A'-1 ) is
10530 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20  Complete = 0;.  
10540 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
10550 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d  3UpperToLower[c]
10560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10570 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20  *pC = c + 1;.   
10580 20 7d 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e   }.    sCollSeqN
10590 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f  ame.z = noCase ?
105a0 20 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e   "NOCASE" : "BIN
105b0 41 52 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53  ARY";.    sCollS
105c0 65 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20  eqName.n = 6;.  
105d0 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71    pNewExpr1 = sq
105e0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
105f0 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20   pLeft, 0);.    
10600 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
10610 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
10620 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20   TK_GE, .       
10630 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
10640 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
10650 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c  Parse,pNewExpr1,
10660 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a  &sCollSeqName),.
10670 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72 31             pStr1
10680 2c 20 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66  , 0);.    transf
10690 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
106a0 4e 65 77 45 78 70 72 31 2c 20 70 45 78 70 72 29  NewExpr1, pExpr)
106b0 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20  ;.    idxNew1 = 
106c0 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
106d0 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31  t(pWC, pNewExpr1
106e0 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
106f0 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
10700 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
10710 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78  ew1==0 );.    ex
10720 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
10730 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20  pWC, idxNew1);. 
10740 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73     pNewExpr2 = s
10750 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
10760 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  , pLeft, 0);.   
10770 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c   pNewExpr2 = sql
10780 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
10790 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20  , TK_LT,.       
107a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
107b0 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
107c0 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 32 2c  Parse,pNewExpr2,
107d0 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a  &sCollSeqName),.
107e0 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72 32             pStr2
107f0 2c 20 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66  , 0);.    transf
10800 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
10810 4e 65 77 45 78 70 72 32 2c 20 70 45 78 70 72 29  NewExpr2, pExpr)
10820 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20  ;.    idxNew2 = 
10830 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
10840 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32  t(pWC, pNewExpr2
10850 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
10860 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
10870 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
10880 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78  ew2==0 );.    ex
10890 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
108a0 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20  pWC, idxNew2);. 
108b0 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
108c0 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
108d0 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20   if( isComplete 
108e0 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ){.      pWC->a[
108f0 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74  idxNew1].iParent
10900 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
10910 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32    pWC->a[idxNew2
10920 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
10930 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
10940 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
10950 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
10960 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
10970 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
10980 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
10990 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
109a0 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20  ABLE.  /* Add a 
109b0 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61  WO_MATCH auxilia
109c0 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63  ry term to the c
109d0 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66  onstraint set if
109e0 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
109f0 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
10a00 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f  of the form:  co
10a10 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e  lumn MATCH expr.
10a20 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  .  ** This infor
10a30 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  mation is used b
10a40 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
10a50 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a   methods of.  **
10a60 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
10a70 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65    The native que
10a80 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65  ry optimizer doe
10a90 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20  s not attempt.  
10aa0 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  ** to do anythin
10ab0 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e  g with MATCH fun
10ac0 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
10ad0 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  f( isMatchOfColu
10ae0 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  mn(pExpr) ){.   
10af0 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
10b00 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
10b10 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65  pLeft;.    Where
10b20 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
10b30 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72      Bitmask prer
10b40 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71  eqColumn, prereq
10b50 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68  Expr;..    pRigh
10b60 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
10b70 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
10b80 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
10b90 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
10ba0 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72  .pExpr;.    prer
10bb0 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62  eqExpr = exprTab
10bc0 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
10bd0 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70  , pRight);.    p
10be0 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78  rereqColumn = ex
10bf0 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
10c00 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20  skSet, pLeft);. 
10c10 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78     if( (prereqEx
10c20 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d  pr & prereqColum
10c30 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  n)==0 ){.      E
10c40 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
10c50 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
10c60 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
10c70 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a  rse, TK_MATCH, .
10c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
10ca0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
10cb0 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20  db, pRight, 0), 
10cc0 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  0);.      idxNew
10cd0 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
10ce0 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
10cf0 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
10d00 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
10d10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10d20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
10d30 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
10d40 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
10d50 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
10d60 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
10d70 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70  reqExpr;.      p
10d80 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
10d90 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
10da0 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
10db0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
10dc0 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
10dd0 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
10de0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
10df0 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  WO_MATCH;.      
10e00 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e  pNewTerm->iParen
10e10 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
10e20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
10e30 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
10e40 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
10e50 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72   = 1;.      pTer
10e60 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
10e70 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
10e80 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
10e90 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
10ea0 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
10eb0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
10ec0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
10ed0 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66  TABLE */..#ifdef
10ee0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
10ef0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
10f00 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73  /* When sqlite_s
10f10 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
10f20 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
10f30 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20   an operator of 
10f40 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78  the.  ** form "x
10f50 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61   IS NOT NULL" ca
10f60 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65  n sometimes be e
10f70 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66  valuated more ef
10f80 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61  ficiently.  ** a
10f90 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20  s "x>NULL" if x 
10fa0 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
10fb0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  R PRIMARY KEY.  
10fc0 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20  So construct a. 
10fd0 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d   ** virtual term
10fe0 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20   of that form.. 
10ff0 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
11000 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  at the virtual t
11010 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67  erm must be tagg
11020 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55  ed with TERM_VNU
11030 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54  LL.  This.  ** T
11040 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69  ERM_VNULL tag wi
11050 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20  ll suppress the 
11060 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
11070 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
11080 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70    ** of the loop
11090 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54  .  Without the T
110a0 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20  ERM_VNULL flag, 
110b0 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65  the not-null che
110c0 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73  ck at.  ** the s
110d0 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tart of the loop
110e0 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e   will prevent an
110f0 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62  y results from b
11100 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20  eing returned.. 
11110 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
11120 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a  >op==TK_NOTNULL.
11130 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65     && pExpr->pLe
11140 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
11150 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70  N.   && pExpr->p
11160 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Left->iColumn>=0
11170 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
11180 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
11190 51 4c 49 54 45 5f 53 74 61 74 33 29 0a 20 20 29  QLITE_Stat3).  )
111a0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
111b0 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
111c0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
111d0 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64  Left;.    int id
111e0 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54  xNew;.    WhereT
111f0 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a  erm *pNewTerm;..
11200 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
11210 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
11220 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20  se, TK_GT,.     
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
11250 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c  prDup(db, pLeft,
11260 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
11290 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30  arse, TK_NULL, 0
112a0 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20  , 0, 0), 0);..  
112b0 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
112c0 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
112d0 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20  , pNewExpr,.    
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112f0 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56            TERM_V
11300 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
11310 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b  MIC|TERM_VNULL);
11320 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 20  .    if( idxNew 
11330 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ){.      pNewTer
11340 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
11350 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
11360 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
11370 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
11380 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
11390 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
113a0 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
113b0 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
113c0 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
113d0 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
113e0 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
113f0 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  GT;.      pNewTe
11400 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64  rm->iParent = id
11410 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65  xTerm;.      pTe
11420 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
11430 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65  Term];.      pTe
11440 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
11450 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
11460 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
11470 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
11480 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
11490 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
114a0 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
114b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
114c0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
114d0 41 54 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65  AT4 */..  /* Pre
114e0 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74  vent ON clause t
114f0 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a  erms of a LEFT J
11500 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75  OIN from being u
11510 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a  sed to drive.  *
11520 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74  * an index for t
11530 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
11540 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  t of the join.. 
11550 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65   */.  pTerm->pre
11560 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72  reqRight |= extr
11570 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  aRight;.}../*.**
11580 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
11590 65 61 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f  earches pList fo
115a0 72 20 61 20 65 6e 74 72 79 20 74 68 61 74 20 6d  r a entry that m
115b0 61 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d  atches the iCol-
115c0 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  th column.** of 
115d0 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a  index pIdx..**.*
115e0 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70  * If such an exp
115f0 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64  ression is found
11600 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70  , its index in p
11610 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74  List->a[] is ret
11620 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20  urned. If.** no 
11630 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
11640 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72  und, -1 is retur
11650 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
11660 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28  nt findIndexCol(
11670 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11680 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11690 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
116a0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
116b0 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
116c0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
116d0 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73  ession list to s
116e0 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69  earch */.  int i
116f0 42 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  Base,           
11700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
11710 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61  rsor for table a
11720 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
11730 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  Idx */.  Index *
11740 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
11750 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
11760 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d  x to match colum
11770 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43  n of */.  int iC
11780 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ol              
11790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
117a0 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20  umn of index to 
117b0 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
117c0 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
117d0 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d  r *zColl = pIdx-
117e0 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a  >azColl[iCol];..
117f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
11800 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
11810 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
11820 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
11830 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  llate(pList->a[i
11840 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
11850 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
11860 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43  MN.     && p->iC
11870 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43  olumn==pIdx->aiC
11880 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20  olumn[iCol].    
11890 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
118a0 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20  Base.    ){.    
118b0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
118c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
118d0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
118e0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
118f0 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  ;.      if( ALWA
11900 59 53 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d  YS(pColl) && 0==
11910 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
11920 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  Coll->zName, zCo
11930 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ll) ){.        r
11940 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d  eturn i;.      }
11950 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
11960 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
11970 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
11980 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65 78   the DISTINCT ex
11990 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61  pression-list pa
119a0 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72  ssed as the thir
119b0 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
119c0 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a   redundant..**.*
119d0 2a 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73  * A DISTINCT lis
119e0 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69  t is redundant i
119f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
11a00 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 73 75 62  ontains some sub
11a10 73 65 74 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e  set of.** column
11a20 73 20 74 68 61 74 20 61 72 65 20 75 6e 69 71 75  s that are uniqu
11a30 65 20 61 6e 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a  e and non-null..
11a40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
11a50 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e  DistinctRedundan
11a60 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
11a70 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  se,            /
11a80 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
11a90 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
11aa0 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
11ab0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
11ac0 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
11ad0 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
11ae0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
11af0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11b00 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 20  List *pDistinct 
11b10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73        /* The res
11b20 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65 65  ult set that nee
11b30 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e 43  ds to be DISTINC
11b40 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  T */.){.  Table 
11b50 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
11b60 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20  pIdx;.  int i;  
11b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b80 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
11b90 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Base;..  /* If t
11ba0 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61  here is more tha
11bb0 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73  n one table or s
11bc0 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65  ub-select in the
11bd0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a   FROM clause of.
11be0 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c    ** this query,
11bf0 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
11c00 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
11c10 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44   show that the D
11c20 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c  ISTINCT .  ** cl
11c30 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e  ause is redundan
11c40 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  t. */.  if( pTab
11c50 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20  List->nSrc!=1 ) 
11c60 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73  return 0;.  iBas
11c70 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e = pTabList->a[
11c80 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54  0].iCursor;.  pT
11c90 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
11ca0 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
11cb0 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78  If any of the ex
11cc0 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20  pressions is an 
11cd0 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61  IPK column on ta
11ce0 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20  ble iBase, then 
11cf0 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75  return .  ** tru
11d00 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d  e. Note: The (p-
11d10 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20  >iTable==iBase) 
11d20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73  part of this tes
11d30 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69  t may be false i
11d40 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
11d50 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63  nt SELECT is a c
11d60 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75  orrelated sub-qu
11d70 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
11d80 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74  i=0; i<pDistinct
11d90 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
11da0 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
11db0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
11dc0 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61  ate(pDistinct->a
11dd0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
11de0 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
11df0 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
11e00 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69  e==iBase && p->i
11e10 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
11e20 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  n 1;.  }..  /* L
11e30 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
11e40 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
11e50 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65  able, checking e
11e60 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69 74  ach to see if it
11e70 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20   makes.  ** the 
11e80 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
11e90 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74  er redundant. It
11ea0 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a   does so if:.  *
11eb0 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20  *.  **   1. The 
11ec0 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66 20  index is itself 
11ed0 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a  UNIQUE, and.  **
11ee0 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f  .  **   2. All o
11ef0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
11f00 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 65   the index are e
11f10 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74 68  ither part of th
11f20 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a  e pDistinct.  **
11f30 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65        list, or e
11f40 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  lse the WHERE cl
11f50 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ause contains a 
11f60 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
11f70 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20   "col=X",.  **  
11f80 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20 61      where X is a
11f90 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e   constant value.
11fa0 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
11fb0 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a  equences of the.
11fc0 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72    **      compar
11fd0 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d  ison and select-
11fe0 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  list expressions
11ff0 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73   must match thos
12000 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  e of the index..
12010 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41    **.  **   3. A
12020 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65  ll of those inde
12030 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68  x columns for wh
12040 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c  ich the WHERE cl
12050 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20  ause does not.  
12060 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20  **      contain 
12070 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61  a "col=X" term a
12080 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20  re subject to a 
12090 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
120a0 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  int..  */.  for(
120b0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
120c0 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
120d0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
120e0 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
120f0 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e  r==OE_None ) con
12100 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
12110 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
12120 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
12130 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78   int iCol = pIdx
12140 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
12150 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e 64       if( 0==find
12160 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c  Term(pWC, iBase,
12170 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73 6b   iCol, ~(Bitmask
12180 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29  )0, WO_EQ, pIdx)
12190 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
121a0 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49 6e  iIdxCol = findIn
121b0 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70  dexCol(pParse, p
121c0 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c  Distinct, iBase,
121d0 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 20   pIdx, i);.     
121e0 20 20 20 69 66 28 20 69 49 64 78 43 6f 6c 3c 30     if( iIdxCol<0
121f0 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   || pTab->aCol[p
12200 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
12210 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a  ].notNull==0 ){.
12220 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
12230 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12240 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
12250 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i==pIdx->nColum
12260 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  n ){.      /* Th
12270 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73  is index implies
12280 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e   that the DISTIN
12290 43 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  CT qualifier is 
122a0 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20  redundant. */.  
122b0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
122c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
122d0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 46  n 0;.}../* .** F
122e0 69 6e 64 20 28 61 6e 20 61 70 70 72 6f 78 69 6d  ind (an approxim
122f0 61 74 65 29 20 73 75 6d 20 6f 66 20 74 77 6f 20  ate) sum of two 
12300 57 68 65 72 65 43 6f 73 74 73 2e 20 20 54 68 69  WhereCosts.  Thi
12310 73 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  s computation is
12320 0a 2a 2a 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65  .** not a simple
12330 20 22 2b 22 20 6f 70 65 72 61 74 6f 72 20 62 65   "+" operator be
12340 63 61 75 73 65 20 57 68 65 72 65 43 6f 73 74 20  cause WhereCost 
12350 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6c  is stored as a l
12360 6f 67 61 72 69 74 68 6d 69 63 0a 2a 2a 20 76 61  ogarithmic.** va
12370 6c 75 65 2e 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  lue..** .*/.stat
12380 69 63 20 57 68 65 72 65 43 6f 73 74 20 77 68 65  ic WhereCost whe
12390 72 65 43 6f 73 74 41 64 64 28 57 68 65 72 65 43  reCostAdd(WhereC
123a0 6f 73 74 20 61 2c 20 57 68 65 72 65 43 6f 73 74  ost a, WhereCost
123b0 20 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f   b){.  static co
123c0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
123d0 72 20 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 31  r x[] = {.     1
123e0 30 2c 20 31 30 2c 20 20 20 20 20 20 20 20 20 20  0, 10,          
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12400 2a 20 30 2c 31 20 2a 2f 0a 20 20 20 20 20 20 39  * 0,1 */.      9
12410 2c 20 39 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 9,            
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12430 20 32 2c 33 20 2a 2f 0a 20 20 20 20 20 20 38 2c   2,3 */.      8,
12440 20 38 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   8,             
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12460 34 2c 35 20 2a 2f 0a 20 20 20 20 20 20 37 2c 20  4,5 */.      7, 
12470 37 2c 20 37 2c 20 20 20 20 20 20 20 20 20 20 20  7, 7,           
12480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36              /* 6
12490 2c 37 2c 38 20 2a 2f 0a 20 20 20 20 20 20 36 2c  ,7,8 */.      6,
124a0 20 36 2c 20 36 2c 20 20 20 20 20 20 20 20 20 20   6, 6,          
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
124c0 39 2c 31 30 2c 31 31 20 2a 2f 0a 20 20 20 20 20  9,10,11 */.     
124d0 20 35 2c 20 35 2c 20 35 2c 20 20 20 20 20 20 20   5, 5, 5,       
124e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124f0 2f 2a 20 31 32 2d 31 34 20 2a 2f 0a 20 20 20 20  /* 12-14 */.    
12500 20 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 20 20    4, 4, 4, 4,   
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12520 20 2f 2a 20 31 35 2d 31 38 20 2a 2f 0a 20 20 20   /* 15-18 */.   
12530 20 20 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20 33     3, 3, 3, 3, 3
12540 2c 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 3,            
12550 20 20 2f 2a 20 31 39 2d 32 34 20 2a 2f 0a 20 20    /* 19-24 */.  
12560 20 20 20 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20      2, 2, 2, 2, 
12570 32 2c 20 32 2c 20 32 2c 20 20 20 20 20 20 20 20  2, 2, 2,        
12580 20 20 20 2f 2a 20 32 35 2d 33 31 20 2a 2f 0a 20     /* 25-31 */. 
12590 20 7d 3b 0a 20 20 69 66 28 20 61 3e 3d 62 20 29   };.  if( a>=b )
125a0 7b 0a 20 20 20 20 69 66 28 20 61 3e 62 2b 34 39  {.    if( a>b+49
125b0 20 29 20 72 65 74 75 72 6e 20 61 3b 0a 20 20 20   ) return a;.   
125c0 20 69 66 28 20 61 3e 62 2b 33 31 20 29 20 72 65   if( a>b+31 ) re
125d0 74 75 72 6e 20 61 2b 31 3b 0a 20 20 20 20 72 65  turn a+1;.    re
125e0 74 75 72 6e 20 61 2b 78 5b 61 2d 62 5d 3b 0a 20  turn a+x[a-b];. 
125f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
12600 62 3e 61 2b 34 39 20 29 20 72 65 74 75 72 6e 20  b>a+49 ) return 
12610 62 3b 0a 20 20 20 20 69 66 28 20 62 3e 61 2b 33  b;.    if( b>a+3
12620 31 20 29 20 72 65 74 75 72 6e 20 62 2b 31 3b 0a  1 ) return b+1;.
12630 20 20 20 20 72 65 74 75 72 6e 20 62 2b 78 5b 62      return b+x[b
12640 2d 61 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  -a];.  }.}../*.*
12650 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 69 6e 74  * Convert an int
12660 65 67 65 72 20 69 6e 74 6f 20 61 20 57 68 65 72  eger into a Wher
12670 65 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65 72  eCost.  In other
12680 20 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65 20   words, compute 
12690 61 0a 2a 2a 20 67 6f 6f 64 20 61 70 70 72 6f 78  a.** good approx
126a0 69 6d 61 74 61 74 69 6f 6e 20 66 6f 72 20 31 30  imatation for 10
126b0 2a 6c 6f 67 32 28 78 29 2e 0a 2a 2f 0a 73 74 61  *log2(x)..*/.sta
126c0 74 69 63 20 57 68 65 72 65 43 6f 73 74 20 77 68  tic WhereCost wh
126d0 65 72 65 43 6f 73 74 28 74 52 6f 77 63 6e 74 20  ereCost(tRowcnt 
126e0 78 29 7b 0a 20 20 73 74 61 74 69 63 20 57 68 65  x){.  static Whe
126f0 72 65 43 6f 73 74 20 61 5b 5d 20 3d 20 7b 20 30  reCost a[] = { 0
12700 2c 20 32 2c 20 33 2c 20 35 2c 20 36 2c 20 37 2c  , 2, 3, 5, 6, 7,
12710 20 38 2c 20 39 20 7d 3b 0a 20 20 57 68 65 72 65   8, 9 };.  Where
12720 43 6f 73 74 20 79 20 3d 20 34 30 3b 0a 20 20 69  Cost y = 40;.  i
12730 66 28 20 78 3c 38 20 29 7b 0a 20 20 20 20 69 66  f( x<8 ){.    if
12740 28 20 78 3c 32 20 29 20 72 65 74 75 72 6e 20 30  ( x<2 ) return 0
12750 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3c 38  ;.    while( x<8
12760 20 29 7b 20 20 79 20 2d 3d 20 31 30 3b 20 78 20   ){  y -= 10; x 
12770 3c 3c 3d 20 31 3b 20 7d 0a 20 20 7d 65 6c 73 65  <<= 1; }.  }else
12780 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3e 32  {.    while( x>2
12790 35 35 20 29 7b 20 79 20 2b 3d 20 34 30 3b 20 78  55 ){ y += 40; x
127a0 20 3e 3e 3d 20 34 3b 20 7d 0a 20 20 20 20 77 68   >>= 4; }.    wh
127b0 69 6c 65 28 20 78 3e 31 35 20 29 7b 20 20 79 20  ile( x>15 ){  y 
127c0 2b 3d 20 31 30 3b 20 78 20 3e 3e 3d 20 31 3b 20  += 10; x >>= 1; 
127d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  }.  }.  return a
127e0 5b 78 26 37 5d 20 2b 20 79 20 2d 20 31 30 3b 0a  [x&7] + y - 10;.
127f0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
12800 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12810 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  BLE./*.** Conver
12820 74 20 61 20 64 6f 75 62 6c 65 20 28 61 73 20 72  t a double (as r
12830 65 63 65 69 76 65 64 20 66 72 6f 6d 20 78 42 65  eceived from xBe
12840 73 74 49 6e 64 65 78 20 6f 66 20 61 20 76 69 72  stIndex of a vir
12850 74 75 61 6c 20 74 61 62 6c 65 29 0a 2a 2a 20 69  tual table).** i
12860 6e 74 6f 20 61 20 57 68 65 72 65 43 6f 73 74 2e  nto a WhereCost.
12870 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
12880 2c 20 63 6f 6d 70 75 74 65 20 61 6e 20 61 70 70  , compute an app
12890 72 6f 78 69 6d 61 74 69 6f 6e 20 66 6f 72 0a 2a  roximation for.*
128a0 2a 20 31 30 2a 6c 6f 67 32 28 78 29 2e 0a 2a 2f  * 10*log2(x)..*/
128b0 0a 73 74 61 74 69 63 20 57 68 65 72 65 43 6f 73  .static WhereCos
128c0 74 20 77 68 65 72 65 43 6f 73 74 46 72 6f 6d 44  t whereCostFromD
128d0 6f 75 62 6c 65 28 64 6f 75 62 6c 65 20 78 29 7b  ouble(double x){
128e0 0a 20 20 75 36 34 20 61 3b 0a 20 20 57 68 65 72  .  u64 a;.  Wher
128f0 65 43 6f 73 74 20 65 3b 0a 20 20 61 73 73 65 72  eCost e;.  asser
12900 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
12910 26 26 20 73 69 7a 65 6f 66 28 61 29 3d 3d 38 20  && sizeof(a)==8 
12920 29 3b 0a 20 20 69 66 28 20 78 3c 3d 31 20 29 20  );.  if( x<=1 ) 
12930 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
12940 78 3c 3d 32 30 30 30 30 30 30 30 30 30 20 29 20  x<=2000000000 ) 
12950 72 65 74 75 72 6e 20 77 68 65 72 65 43 6f 73 74  return whereCost
12960 28 28 74 52 6f 77 63 6e 74 29 78 29 3b 0a 20 20  ((tRowcnt)x);.  
12970 6d 65 6d 63 70 79 28 26 61 2c 20 26 78 2c 20 38  memcpy(&a, &x, 8
12980 29 3b 0a 20 20 65 20 3d 20 28 61 3e 3e 35 32 29  );.  e = (a>>52)
12990 20 2d 20 31 30 32 32 3b 0a 20 20 72 65 74 75 72   - 1022;.  retur
129a0 6e 20 65 2a 31 30 3b 0a 7d 0a 23 65 6e 64 69 66  n e*10;.}.#endif
129b0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
129c0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
129d0 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
129e0 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66  the logarithm of
129f0 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65   the input value
12a00 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73   to base 2..*/.s
12a10 74 61 74 69 63 20 57 68 65 72 65 43 6f 73 74 20  tatic WhereCost 
12a20 65 73 74 4c 6f 67 28 57 68 65 72 65 43 6f 73 74  estLog(WhereCost
12a30 20 4e 29 7b 0a 20 20 57 68 65 72 65 43 6f 73 74   N){.  WhereCost
12a40 20 78 20 3d 20 77 68 65 72 65 43 6f 73 74 28 4e   x = whereCost(N
12a50 29 3b 0a 20 20 72 65 74 75 72 6e 20 78 3e 33 33  );.  return x>33
12a60 20 3f 20 78 20 2d 20 33 33 20 3a 20 30 3b 0a 7d   ? x - 33 : 0;.}
12a70 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74  ../*.** Two rout
12a80 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e  ines for printin
12a90 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
12aa0 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
12ab0 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  x_info.** struct
12ac0 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74  ure.  Used for t
12ad0 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
12ae0 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e  ging only.  If n
12af0 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45  either.** SQLITE
12b00 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f  _TEST or SQLITE_
12b10 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e 65  DEBUG are define
12b20 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f  d, then these ro
12b30 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f  utines.** are no
12b40 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  -ops..*/.#if !de
12b50 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12b60 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
12b70 26 26 20 64 65 66 69 6e 65 64 28 57 48 45 52 45  && defined(WHERE
12b80 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73  TRACE_ENABLED).s
12b90 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
12ba0 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69  _IDX_INPUTS(sqli
12bb0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
12bc0 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
12bd0 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
12be0 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
12bf0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
12c00 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
12c10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
12c20 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e  bugPrintf("  con
12c30 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c  straint[%d]: col
12c40 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70  =%d termid=%d op
12c50 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e  =%d usabled=%d\n
12c60 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
12c70 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
12c80 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  nt[i].iColumn,. 
12c90 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
12ca0 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66  aint[i].iTermOff
12cb0 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  set,.       p->a
12cc0 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70  Constraint[i].op
12cd0 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
12ce0 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
12cf0 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  e);.  }.  for(i=
12d00 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79  0; i<p->nOrderBy
12d10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
12d20 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12d30 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63    orderby[%d]: c
12d40 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22  ol=%d desc=%d\n"
12d50 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
12d60 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
12d70 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ].iColumn,.     
12d80 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
12d90 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74  .desc);.  }.}.st
12da0 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
12db0 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69  IDX_OUTPUTS(sqli
12dc0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
12dd0 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
12de0 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
12df0 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
12e00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
12e10 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
12e20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
12e30 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61  bugPrintf("  usa
12e40 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d  ge[%d]: argvIdx=
12e50 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20  %d omit=%d\n",. 
12e60 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
12e70 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
12e80 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
12e90 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
12ea0 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
12eb0 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  omit);.  }.  sql
12ec0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
12ed0 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c  "  idxNum=%d\n",
12ee0 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73   p->idxNum);.  s
12ef0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
12f00 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e  f("  idxStr=%s\n
12f10 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20  ", p->idxStr);. 
12f20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
12f30 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f  ntf("  orderByCo
12f40 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d  nsumed=%d\n", p-
12f50 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
12f60 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
12f70 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d  gPrintf("  estim
12f80 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20  atedCost=%g\n", 
12f90 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  p->estimatedCost
12fa0 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
12fb0 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  ne TRACE_IDX_INP
12fc0 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54  UTS(A).#define T
12fd0 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
12fe0 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  (A).#endif..#ifn
12ff0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13000 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
13010 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
13020 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  E if the WHERE c
13030 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d  lause term pTerm
13040 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68   is of a form wh
13050 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20  ere it.** could 
13060 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
13070 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20  index to access 
13080 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61  pSrc, assuming a
13090 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
130a0 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a   index existed..
130b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
130c0 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
130d0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
130e0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
130f0 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
13100 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20  e term to check 
13110 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
13120 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
13130 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20      /* Table we 
13140 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63  are trying to ac
13150 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  cess */.  Bitmas
13160 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20  k notReady      
13170 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
13180 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70  es in outer loop
13190 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
131a0 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a  .){.  char aff;.
131b0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
131c0 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69  tCursor!=pSrc->i
131d0 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
131e0 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
131f0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
13200 45 51 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  EQ)==0 ) return 
13210 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
13220 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
13230 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65  otReady)!=0 ) re
13240 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54  turn 0;.  if( pT
13250 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
13260 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n<0 ) return 0;.
13270 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54    aff = pSrc->pT
13280 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e  ab->aCol[pTerm->
13290 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66  u.leftColumn].af
132a0 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73  finity;.  if( !s
132b0 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
132c0 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78  ityOk(pTerm->pEx
132d0 70 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72  pr, aff) ) retur
132e0 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  n 0;.  return 1;
132f0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
13300 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13310 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
13320 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
13330 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ode to construct
13340 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
13350 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74  t for an automat
13360 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  ic index.** and 
13370 74 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68  to set up the Wh
13380 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20  ereLevel object 
13390 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74  pLevel so that t
133a0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
133b0 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f  r.** makes use o
133c0 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  f the automatic 
133d0 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
133e0 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41   void constructA
133f0 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20  utomaticIndex(. 
13400 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
13410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13420 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
13430 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
13440 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
13450 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
13460 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
13470 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
13480 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65  m *pSrc,  /* The
13490 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
134a0 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78  m to get the nex
134b0 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74  t index */.  Bit
134c0 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
134d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
134e0 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74   of cursors that
134f0 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
13500 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  le */.  WhereLev
13510 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20  el *pLevel      
13520 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
13530 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29   index here */.)
13540 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b  {.  int nColumn;
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13560 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
13570 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73  umns in the cons
13580 74 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f  tructed index */
13590 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
135a0 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  erm;           /
135b0 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
135c0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
135d0 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
135e0 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20  rm *pWCEnd;     
135f0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
13600 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  WC->a[] */.  int
13610 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
13620 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
13630 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65   of memory neede
13640 64 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20  d for pIdx */.  
13650 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
13660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
13670 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67  bject describing
13680 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69   the transient i
13690 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
136a0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
136b0 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65        /* Prepare
136c0 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
136d0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
136e0 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74  /.  int addrInit
136f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13700 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
13710 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
13720 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a   bypass jump */.
13730 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13750 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
13760 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65   indexed */.  Ke
13770 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b  yInfo *pKeyinfo;
13780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
13790 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
137a0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20   the index */   
137b0 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
137c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
137d0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64  * Top of the ind
137e0 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a  ex fill loop */.
137f0 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13810 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
13820 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72  g an index recor
13830 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13850 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75     /* Column cou
13860 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  nter */.  int i;
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13880 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
13890 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d  unter */.  int m
138a0 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  xBitCol;        
138b0 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
138c0 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63  m column in pSrc
138d0 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43  ->colUsed */.  C
138e0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
138f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
13900 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
13910 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   to on a column 
13920 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
13930 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
13940 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a   /* The Loop obj
13950 65 63 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ect */.  Bitmask
13960 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20   idxCols;       
13970 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f       /* Bitmap o
13980 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66  f columns used f
13990 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20  or indexing */. 
139a0 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f   Bitmask extraCo
139b0 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ls;          /* 
139c0 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69  Bitmap of additi
139d0 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  onal columns */.
139e0 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67    u8 sentWarning
139f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
13a00 20 54 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e   True if a warnn
13a10 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73 73  ing has been iss
13a20 75 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e  ued */..  /* Gen
13a30 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b  erate code to sk
13a40 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61  ip over the crea
13a50 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c  tion and initial
13a60 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  ization of the. 
13a70 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e   ** transient in
13a80 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73  dex on 2nd and s
13a90 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
13aa0 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ions of the loop
13ab0 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73  . */.  v = pPars
13ac0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
13ad0 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64  rt( v!=0 );.  ad
13ae0 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  drInit = sqlite3
13af0 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
13b00 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
13b10 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
13b20 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
13b30 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
13b40 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65  dex.  ** and use
13b50 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45  d to match WHERE
13b60 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
13b70 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d 6e  nts */.  nColumn
13b80 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d   = 0;.  pTable =
13b90 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70   pSrc->pTab;.  p
13ba0 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
13bb0 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70  pWC->nTerm];.  p
13bc0 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
13bd0 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73  WLoop;.  idxCols
13be0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
13bf0 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
13c00 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
13c10 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
13c20 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
13c30 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
13c40 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
13c50 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
13c60 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
13c70 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
13c80 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
13c90 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
13ca0 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
13cb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
13cc0 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
13cd0 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
13ce0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
13cf0 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67  if( !sentWarning
13d00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13d10 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
13d20 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58  ARNING_AUTOINDEX
13d30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61  ,.            "a
13d40 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f  utomatic index o
13d50 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c  n %s(%s)", pTabl
13d60 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  e->zName,.      
13d70 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
13d80 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b  ol[iCol].zName);
13d90 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61 72  .        sentWar
13da0 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  ning = 1;.      
13db0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78  }.      if( (idx
13dc0 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30  Cols & cMask)==0
13dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
13de0 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
13df0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f  pParse->db, pLoo
13e00 70 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 29 20 29 20  p, nColumn+1) ) 
13e10 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
13e20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 43  pLoop->aLTerm[nC
13e30 6f 6c 75 6d 6e 2b 2b 5d 20 3d 20 70 54 65 72 6d  olumn++] = pTerm
13e40 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
13e50 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
13e60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
13e70 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3e  assert( nColumn>
13e80 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e  0 );.  pLoop->u.
13e90 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f  btree.nEq = pLoo
13ea0 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 43 6f 6c  p->nLTerm = nCol
13eb0 75 6d 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  umn;.  pLoop->ws
13ec0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
13ed0 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f  LUMN_EQ | WHERE_
13ee0 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45  IDX_ONLY | WHERE
13ef0 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20  _INDEXED.       
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
13f10 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
13f20 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
13f30 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69  e number of addi
13f40 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
13f50 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20  eeded to create 
13f60 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20  a.  ** covering 
13f70 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72  index.  A "cover
13f80 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e  ing index" is an
13f90 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
13fa0 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f  ains all.  ** co
13fb0 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e  lumns that are n
13fc0 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65  eeded by the que
13fd0 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65  ry.  With a cove
13fe0 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a  ring index, the.
13ff0 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
14000 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20  ble never needs 
14010 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20  to be accessed. 
14020 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63   Automatic indic
14030 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
14040 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
14050 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64   because the ind
14060 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  ex will not be u
14070 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20  pdated if the.  
14080 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
14090 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68  e changes and th
140a0 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
140b0 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65  e cannot both be
140c0 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68   used.  ** if th
140d0 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e  ey go out of syn
140e0 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43  c..  */.  extraC
140f0 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  ols = pSrc->colU
14100 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20  sed & (~idxCols 
14110 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  | MASKBIT(BMS-1)
14120 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20  );.  mxBitCol = 
14130 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d  (pTable->nCol >=
14140 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20   BMS-1) ? BMS-1 
14150 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a  : pTable->nCol;.
14160 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
14170 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
14180 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
14190 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
141a0 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
141b0 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
141c0 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
141d0 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
141e0 29 20 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20  ) ) nColumn++;. 
141f0 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
14200 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
14210 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e  (BMS-1) ){.    n
14220 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65  Column += pTable
14230 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
14240 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77  ;.  }.  pLoop->w
14250 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
14260 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52  COLUMN_EQ | WHER
14270 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f  E_IDX_ONLY;..  /
14280 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
14290 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20  Index object to 
142a0 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e  describe this in
142b0 64 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d  dex */.  nByte =
142c0 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a   sizeof(Index);.
142d0 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
142e0 6d 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20  mn*sizeof(int); 
142f0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43      /* Index.aiC
14300 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65  olumn */.  nByte
14310 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65   += nColumn*size
14320 6f 66 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20  of(char*);   /* 
14330 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a  Index.azColl */.
14340 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
14350 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mn;             
14360 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
14370 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64  rtOrder */.  pId
14380 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  x = sqlite3DbMal
14390 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
143a0 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  db, nByte);.  if
143b0 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75  ( pIdx==0 ) retu
143c0 72 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62  rn;.  pLoop->u.b
143d0 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49  tree.pIndex = pI
143e0 64 78 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f  dx;.  pIdx->azCo
143f0 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49  ll = (char**)&pI
14400 64 78 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61  dx[1];.  pIdx->a
14410 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29  iColumn = (int*)
14420 26 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43  &pIdx->azColl[nC
14430 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e  olumn];.  pIdx->
14440 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
14450 2a 29 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  *)&pIdx->aiColum
14460 6e 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49  n[nColumn];.  pI
14470 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74  dx->zName = "aut
14480 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78  o-index";.  pIdx
14490 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c  ->nColumn = nCol
144a0 75 6d 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61  umn;.  pIdx->pTa
144b0 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ble = pTable;.  
144c0 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73  n = 0;.  idxCols
144d0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
144e0 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
144f0 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
14500 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
14510 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
14520 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
14530 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
14540 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
14550 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
14560 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
14570 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
14580 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
14590 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
145a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
145b0 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
145c0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
145d0 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
145e0 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
145f0 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
14600 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
14610 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
14620 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
14630 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  cMask;.        p
14640 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
14650 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
14660 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
14670 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
14680 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
14690 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
146a0 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
146b0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  t);.        pIdx
146c0 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c  ->azColl[n] = AL
146d0 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43  WAYS(pColl) ? pC
146e0 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49  oll->zName : "BI
146f0 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e  NARY";.        n
14700 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
14710 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
14720 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75  (u32)n==pLoop->u
14730 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20  .btree.nEq );.. 
14740 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e   /* Add addition
14750 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
14760 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75  d to make the au
14770 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e  tomatic index in
14780 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69  to.  ** a coveri
14790 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f  ng index */.  fo
147a0 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f  r(i=0; i<mxBitCo
147b0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
147c0 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53   extraCols & MAS
147d0 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20  KBIT(i) ){.     
147e0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
147f0 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
14800 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
14810 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
14820 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
14830 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
14840 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
14850 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  -1) ){.    for(i
14860 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65  =BMS-1; i<pTable
14870 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
14880 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
14890 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
148a0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
148b0 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
148c0 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
148d0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e  }.  assert( n==n
148e0 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20  Column );..  /* 
148f0 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d  Create the autom
14900 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  atic index */.  
14910 70 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyinfo = sqlit
14920 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
14930 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
14940 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
14950 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  iIdxCur>=0 );.  
14960 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
14970 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
14980 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14990 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
149a0 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65  Autoindex, pLeve
149b0 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f 6c  l->iIdxCur, nCol
149c0 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20  umn+1, 0,.      
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
149e0 68 61 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20 50  har*)pKeyinfo, P
149f0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
14a00 46 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  F);.  VdbeCommen
14a10 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20  t((v, "for %s", 
14a20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b  pTable->zName));
14a30 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20  ..  /* Fill the 
14a40 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
14a50 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  with content */.
14a60 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
14a70 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14a80 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76   OP_Rewind, pLev
14a90 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20  el->iTabCur);.  
14aa0 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
14ab0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
14ac0 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
14ad0 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
14ae0 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70  (pParse, pIdx, p
14af0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
14b00 72 65 67 52 65 63 6f 72 64 2c 20 31 2c 20 30 29  regRecord, 1, 0)
14b10 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14b20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
14b30 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  nsert, pLevel->i
14b40 49 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72  IdxCur, regRecor
14b50 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
14b60 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
14b70 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
14b80 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  T);.  sqlite3Vdb
14b90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
14ba0 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  xt, pLevel->iTab
14bb0 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Cur, addrTop+1);
14bc0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
14bd0 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
14be0 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
14bf0 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65  INDEX);.  sqlite
14c00 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14c10 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
14c20 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
14c30 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
14c40 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  cord);.  .  /* J
14c50 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
14c60 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
14c70 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
14c80 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
14c90 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
14ca0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
14cb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
14cc0 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
14cd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14ce0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
14cf0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
14d00 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
14d10 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
14d20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
14d30 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
14d40 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
14d50 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
14d60 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
14d70 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
14d80 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
14d90 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
14da0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
14db0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
14dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
14dd0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
14de0 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
14df0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
14e00 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  e,.  WhereClause
14e10 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20   *pWC,.  struct 
14e20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
14e30 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
14e40 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
14e50 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
14e60 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
14e70 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
14e80 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
14e90 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
14ea0 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
14eb0 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
14ec0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
14ed0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
14ee0 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
14ef0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
14f00 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
14f10 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
14f20 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
14f30 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
14f40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
14f50 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
14f60 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
14f70 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
14f80 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
14f90 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
14fa0 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
14fb0 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
14fc0 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
14fd0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
14fe0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
14ff0 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
15000 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
15010 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
15020 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
15030 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
15040 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
15050 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
15060 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
15070 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
15080 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
15090 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
150a0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
150b0 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
150c0 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LL) ) continue;.
150d0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
150e0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
150f0 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
15100 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d      nTerm++;.  }
15110 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52  ..  /* If the OR
15120 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
15130 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75  ntains only colu
15140 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  mns in the curre
15150 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  nt .  ** virtual
15160 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f   table then allo
15170 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
15180 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74  he aOrderBy part
15190 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
151a0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
151b0 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a  structure..  */.
151c0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
151d0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
151e0 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f  {.    int n = pO
151f0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
15200 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
15210 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
15220 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
15230 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
15240 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
15250 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
15260 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
15270 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
15280 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
15290 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20     if( i==n){.  
152a0 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e      nOrderBy = n
152b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
152c0 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
152d0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
152e0 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f  o structure.  */
152f0 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71  .  pIdxInfo = sq
15300 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
15310 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
15320 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a  zeof(*pIdxInfo).
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15340 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69             + (si
15350 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20  zeof(*pIdxCons) 
15360 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65  + sizeof(*pUsage
15370 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  ))*nTerm.       
15380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15390 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49      + sizeof(*pI
153a0 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65  dxOrderBy)*nOrde
153b0 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64  rBy );.  if( pId
153c0 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
153d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
153e0 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20  pParse, "out of 
153f0 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65  memory");.    re
15400 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
15410 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
15420 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
15430 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
15440 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f  nfo structure co
15450 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79  ntains.  ** many
15460 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65   fields that are
15470 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74   declared "const
15480 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65  " to prevent xBe
15490 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a  stIndex from.  *
154a0 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
154b0 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
154c0 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
154d0 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
154e0 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   ** initialize t
154f0 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a  hose fields..  *
15500 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28  /.  pIdxCons = (
15510 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
15520 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
15530 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20  )&pIdxInfo[1];. 
15540 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28   pIdxOrderBy = (
15550 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
15560 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70  ndex_orderby*)&p
15570 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a  IdxCons[nTerm];.
15580 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75    pUsage = (stru
15590 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
155a0 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
155b0 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b  e*)&pIdxOrderBy[
155c0 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69  nOrderBy];.  *(i
155d0 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
155e0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65  Constraint = nTe
155f0 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  rm;.  *(int*)&pI
15600 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
15610 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a   = nOrderBy;.  *
15620 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
15630 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
15640 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
15650 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
15660 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74  Cons;.  *(struct
15670 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
15680 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e  rderby**)&pIdxIn
15690 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70  fo->aOrderBy = p
156a0 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  IdxOrderBy;.  *(
156b0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
156c0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
156d0 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66  usage**)&pIdxInf
156e0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
156f0 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
15700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15730 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b           pUsage;
15740 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70  ..  for(i=j=0, p
15750 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
15760 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
15770 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38  pTerm++){.    u8
15780 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65   op;.    if( pTe
15790 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
157a0 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
157b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
157c0 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
157d0 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65  fTwo(pTerm->eOpe
157e0 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49  rator & ~WO_EQUI
157f0 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  V) );.    testca
15800 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
15810 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
15820 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
15830 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
15840 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
15850 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
15860 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e  erator & (WO_ISN
15870 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ULL) ) continue;
15880 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
15890 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
158a0 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
158b0 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
158c0 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d  .iColumn = pTerm
158d0 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
158e0 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
158f0 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b  iTermOffset = i;
15900 0a 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54  .    op = (u8)pT
15910 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
15920 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   WO_ALL;.    if(
15930 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20   op==WO_IN ) op 
15940 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64  = WO_EQ;.    pId
15950 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70  xCons[j].op = op
15960 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  ;.    /* The dir
15970 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69  ect assignment i
15980 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  n the previous l
15990 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ine is possible 
159a0 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20  only because.   
159b0 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20   ** the WO_ and 
159c0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
159d0 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61  STRAINT_ codes a
159e0 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54  re identical.  T
159f0 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  he.    ** follow
15a00 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69  ing asserts veri
15a10 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  fy this fact. */
15a20 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
15a30 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  EQ==SQLITE_INDEX
15a40 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29  _CONSTRAINT_EQ )
15a50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
15a60 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LT==SQLITE_INDE
15a70 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20  X_CONSTRAINT_LT 
15a80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
15a90 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LE==SQLITE_IND
15aa0 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45  EX_CONSTRAINT_LE
15ab0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15ac0 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GT==SQLITE_IN
15ad0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
15ae0 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
15af0 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_GE==SQLITE_I
15b00 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
15b10 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GE );.    assert
15b20 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49  ( WO_MATCH==SQLI
15b30 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
15b40 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20  INT_MATCH );.   
15b50 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
15b60 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
15b70 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57  IN|WO_EQ|WO_LT|W
15b80 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
15b90 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20  |WO_MATCH) );.  
15ba0 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72    j++;.  }.  for
15bb0 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
15bc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
15bd0 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
15be0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
15bf0 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
15c00 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  i].iColumn = pEx
15c10 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
15c20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
15c30 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d  desc = pOrderBy-
15c40 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
15c50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
15c60 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  IdxInfo;.}../*.*
15c70 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65  * The table obje
15c80 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73  ct reference pas
15c90 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
15ca0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
15cb0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  is function.** m
15cc0 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20  ust represent a 
15cd0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54  virtual table. T
15ce0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  his function inv
15cf0 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e  okes the xBestIn
15d00 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  dex().** method 
15d10 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
15d20 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71  able with the sq
15d30 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
15d40 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
15d50 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20  comes in as the 
15d60 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  3rd argument to 
15d70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
15d80 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
15d90 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20   occurs, pParse 
15da0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
15db0 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  h an error messa
15dc0 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d  ge and a.** non-
15dd0 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65  zero value is re
15de0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
15df0 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
15e00 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
15e10 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
15e20 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
15e30 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c  o structure is l
15e40 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a  eft populated..*
15e50 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
15e60 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  not an error is 
15e70 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20  returned, it is 
15e80 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
15e90 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
15ea0 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
15eb0 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72  y free p->idxStr
15ec0 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65   if p->needToFre
15ed0 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65  eIdxStr indicate
15ee0 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  s.** that this i
15ef0 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
15f00 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65  tatic int vtabBe
15f10 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  stIndex(Parse *p
15f20 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
15f30 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
15f40 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71  x_info *p){.  sq
15f50 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
15f60 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  b = sqlite3GetVT
15f70 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
15f80 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20   pTab)->pVtab;. 
15f90 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
15fa0 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  ;..  TRACE_IDX_I
15fb0 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d  NPUTS(p);.  rc =
15fc0 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
15fd0 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61  >xBestIndex(pVta
15fe0 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49  b, p);.  TRACE_I
15ff0 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a  DX_OUTPUTS(p);..
16000 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16010 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
16020 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
16030 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
16040 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
16050 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
16060 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72   if( !pVtab->zEr
16070 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
16080 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
16090 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69  arse, "%s", sqli
160a0 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
160b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
160c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
160d0 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70  (pParse, "%s", p
160e0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
160f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
16100 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
16110 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
16120 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
16130 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
16140 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
16150 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  +){.    if( !p->
16160 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
16170 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e  sable && p->aCon
16180 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
16190 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20  argvIndex>0 ){. 
161a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
161b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
161c0 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25          "table %
161d0 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65  s: xBestIndex re
161e0 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69  turned an invali
161f0 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a  d plan", pTab->z
16200 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
16210 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ..  return pPars
16220 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69  e->nErr;.}.#endi
16230 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
16240 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
16250 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23 69 66  LTABLE) */...#if
16260 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
16270 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
16280 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
16290 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
162a0 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79  a particular key
162b0 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20   among all keys 
162c0 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  in an.** index. 
162d0 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
162e0 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66  ts in aStat as f
162f0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
16300 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45   aStat[0]      E
16310 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
16320 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61  ws less than pVa
16330 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d  l.**    aStat[1]
16340 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
16350 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20  r of rows equal 
16360 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65  to pVal.**.** Re
16370 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
16380 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74  n success..*/.st
16390 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4b  atic void whereK
163a0 65 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65  eyStats(.  Parse
163b0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
163c0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
163d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
163e0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
163f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16400 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69  * Index to consi
16410 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f  der domain of */
16420 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
16430 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f  d *pRec,       /
16440 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75  * Vector of valu
16450 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a  es to consider *
16460 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c  /.  int roundUp,
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16480 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74  /* Round up if t
16490 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e  rue.  Round down
164a0 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74   if false */.  t
164b0 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20  Rowcnt *aStat   
164c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
164d0 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e  T: stats written
164e0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
164f0 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70  dexSample *aSamp
16500 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70  le = pIdx->aSamp
16510 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20  le;.  int iCol; 
16520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16530 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65    /* Index of re
16540 71 75 69 72 65 64 20 73 74 61 74 73 20 69 6e 20  quired stats in 
16550 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20  anEq[] etc. */. 
16560 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20   int iMin = 0;  
16570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16580 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  Smallest sample 
16590 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a  not yet tested *
165a0 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 64 78  /.  int i = pIdx
165b0 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20 20 20 20 20  ->nSample;      
165c0 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70  /* Smallest samp
165d0 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f  le larger than o
165e0 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20  r equal to pRec 
165f0 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20  */.  int iTest; 
16600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16610 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20   /* Next sample 
16620 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74  to test */.  int
16630 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20   res;           
16640 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
16650 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
16660 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20   operation */.. 
16670 20 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30   assert( pRec!=0
16680 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
16690 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
166a0 20 20 69 66 28 20 70 52 65 63 3d 3d 30 20 29 20    if( pRec==0 ) 
166b0 72 65 74 75 72 6e 3b 0a 20 20 69 43 6f 6c 20 3d  return;.  iCol =
166c0 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 2d 20   pRec->nField - 
166d0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  1;.  assert( pId
166e0 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  x->nSample>0 );.
166f0 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e    assert( pRec->
16700 6e 46 69 65 6c 64 3e 30 20 26 26 20 69 43 6f 6c  nField>0 && iCol
16710 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f  <pIdx->nSampleCo
16720 6c 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  l );.  do{.    i
16730 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 29 2f  Test = (iMin+i)/
16740 32 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  2;.    res = sql
16750 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
16760 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 54  mpare(aSample[iT
16770 65 73 74 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  est].n, aSample[
16780 69 54 65 73 74 5d 2e 70 2c 20 70 52 65 63 29 3b  iTest].p, pRec);
16790 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
167a0 7b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69  {.      iMin = i
167b0 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  Test+1;.    }els
167c0 65 7b 0a 20 20 20 20 20 20 69 20 3d 20 69 54 65  e{.      i = iTe
167d0 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  st;.    }.  }whi
167e0 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c  le( res && iMin<
167f0 69 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  i );..#ifdef SQL
16800 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
16810 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
16820 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63  ert statements c
16830 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69  heck that the bi
16840 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65  nary search code
16850 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e  .  ** above foun
16860 64 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77  d the right answ
16870 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73  er. This block s
16880 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65  erves no purpose
16890 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e   other.  ** than
168a0 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61   to invoke the a
168b0 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66  sserts.  */.  if
168c0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
168d0 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69  /* If (res==0) i
168e0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 73 61 6d  s true, then sam
168f0 70 6c 65 20 24 69 20 6d 75 73 74 20 62 65 20 65  ple $i must be e
16900 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a  qual to pRec */.
16910 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49      assert( i<pI
16920 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20  dx->nSample );. 
16930 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71     assert( 0==sq
16940 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
16950 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
16960 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
16970 70 2c 20 70 52 65 63 29 0a 20 20 20 20 20 20 20  p, pRec).       
16980 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
16990 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
169a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
169b0 20 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63   Otherwise, pRec
169c0 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72   must be smaller
169d0 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20   than sample $i 
169e0 61 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a  and larger than.
169f0 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24      ** sample ($
16a00 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73  i-1).  */.    as
16a10 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e  sert( i==pIdx->n
16a20 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20  Sample .        
16a30 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52   || sqlite3VdbeR
16a40 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
16a50 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
16a60 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30  le[i].p, pRec)>0
16a70 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61  .         || pPa
16a80 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
16a90 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73  ailed );.    ass
16aa0 65 72 74 28 20 69 3d 3d 30 0a 20 20 20 20 20 20  ert( i==0.      
16ab0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62     || sqlite3Vdb
16ac0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
16ad0 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61  Sample[i-1].n, a
16ae0 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70  Sample[i-1].p, p
16af0 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20  Rec)<0.         
16b00 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
16b10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
16b20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64   }.#endif /* ifd
16b30 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
16b40 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  */..  /* At this
16b50 20 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b   point, aSample[
16b60 69 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20  i] is the first 
16b70 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67  sample that is g
16b80 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a  reater than.  **
16b90 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56 61   or equal to pVa
16ba0 6c 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49 64  l.  Or if i==pId
16bb0 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e  x->nSample, then
16bc0 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72 65   all samples are
16bd0 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20   less.  ** than 
16be0 70 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c  pVal.  If aSampl
16bf0 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e  e[i]==pVal, then
16c00 20 72 65 73 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20   res==0..  */.  
16c10 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
16c20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61    aStat[0] = aSa
16c30 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
16c40 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d  l];.    aStat[1]
16c50 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
16c60 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73  Eq[iCol];.  }els
16c70 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  e{.    tRowcnt i
16c80 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20 69  Lower, iUpper, i
16c90 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  Gap;.    if( i==
16ca0 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
16cb0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70  r = 0;.      iUp
16cc0 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d  per = aSample[0]
16cd0 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
16ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55   }else{.      iU
16cf0 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e  pper = i>=pIdx->
16d00 6e 53 61 6d 70 6c 65 20 3f 20 70 49 64 78 2d 3e  nSample ? pIdx->
16d10 61 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 61 53  aiRowEst[0] : aS
16d20 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43  ample[i].anLt[iC
16d30 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65  ol];.      iLowe
16d40 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  r = aSample[i-1]
16d50 2e 61 6e 45 71 5b 69 43 6f 6c 5d 20 2b 20 61 53  .anEq[iCol] + aS
16d60 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 4c 74 5b  ample[i-1].anLt[
16d70 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  iCol];.    }.   
16d80 20 61 53 74 61 74 5b 31 5d 20 3d 20 28 70 49 64   aStat[1] = (pId
16d90 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 69 43 6f 6c 20  x->nColumn>iCol 
16da0 3f 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69  ? pIdx->aAvgEq[i
16db0 43 6f 6c 5d 20 3a 20 31 29 3b 0a 20 20 20 20 69  Col] : 1);.    i
16dc0 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65  f( iLower>=iUppe
16dd0 72 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20  r ){.      iGap 
16de0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
16df0 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 55 70        iGap = iUp
16e00 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20  per - iLower;.  
16e10 20 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e    }.    if( roun
16e20 64 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61  dUp ){.      iGa
16e30 70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a  p = (iGap*2)/3;.
16e40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16e50 20 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a   iGap = iGap/3;.
16e60 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b      }.    aStat[
16e70 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47  0] = iLower + iG
16e80 61 70 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  ap;.  }.}.#endif
16e90 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
16ea0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
16eb0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
16ec0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
16ed0 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
16ee0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
16ef0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73  that will be vis
16f00 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e  ited.** by scann
16f10 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72  ing an index for
16f20 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75   a range of valu
16f30 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61  es. The range ma
16f40 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a  y have an upper.
16f50 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65  ** bound, a lowe
16f60 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68  r bound, or both
16f70 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  . The WHERE clau
16f80 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65  se terms that se
16f90 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61  t the upper.** a
16fa0 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20  nd lower bounds 
16fb0 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20  are represented 
16fc0 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  by pLower and pU
16fd0 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c  pper respectivel
16fe0 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  y. For.** exampl
16ff0 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  e, assuming that
17000 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74   index p is on t
17010 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  1(a):.**.**   ..
17020 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
17030 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
17040 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
17050 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f            |_____
17060 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20  |   |_____|.**  
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17080 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
17090 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
170a0 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20          pLower  
170b0 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49    pUpper.**.** I
170c0 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  f either of the 
170d0 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62  upper or lower b
170e0 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73  ound is not pres
170f0 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69  ent, then NULL i
17100 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70  s passed in.** p
17110 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72  lace of the corr
17120 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54  esponding WhereT
17130 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  erm..**.** The v
17140 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65  alue in (pBuilde
17150 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
17160 2e 6e 45 71 29 20 69 73 20 74 68 65 20 69 6e 64  .nEq) is the ind
17170 65 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a  ex of the index.
17180 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63  ** column subjec
17190 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63  t to the range c
171a0 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65  onstraint. Or, e
171b0 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65  quivalently, the
171c0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71   number of.** eq
171d0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
171e0 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20  ts optimized by 
171f0 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64  the proposed ind
17200 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61  ex scan. For exa
17210 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e  mple,.** assumin
17220 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20  g index p is on 
17230 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68  t1(a, b), and th
17240 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a  e SQL query is:.
17250 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
17260 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20   t1 WHERE a = ? 
17270 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20  AND b > ? AND b 
17280 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
17290 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f  en nEq is set to
172a0 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65   1 (as the range
172b0 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75   restricted colu
172c0 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65  mn, b, is the se
172d0 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  cond .** left-mo
172e0 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
172f0 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20   index). Or, if 
17300 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  the query is:.**
17310 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
17320 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
17330 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D a < ? ....**.*
17340 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65  * then nEq is se
17350 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68  t to 0..**.** Wh
17360 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
17370 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f   is called, *pnO
17380 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
17390 20 77 68 65 72 65 43 6f 73 74 28 29 20 6f 66 20   whereCost() of 
173a0 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
173b0 20 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 69   rows that the i
173c0 6e 64 65 78 20 73 63 61 6e 20 69 73 20 65 78 70  ndex scan is exp
173d0 65 63 74 65 64 20 74 6f 20 76 69 73 69 74 20 77  ected to visit w
173e0 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69  ithout .** consi
173f0 64 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65  dering the range
17400 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66   constraints. If
17410 20 6e 45 71 20 69 73 20 30 2c 20 74 68 69 73 20   nEq is 0, this 
17420 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
17430 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65   .** rows in the
17440 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67   index. Assuming
17450 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
17460 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75  , *pnOut is adju
17470 73 74 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a  sted (reduced).*
17480 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  * to account for
17490 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 74 72   the range contr
174a0 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64  aints pLower and
174b0 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20   pUpper..** .** 
174c0 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  In the absence o
174d0 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41  f sqlite_stat4 A
174e0 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20  NALYZE data, or 
174f0 69 66 20 73 75 63 68 20 64 61 74 61 20 63 61 6e  if such data can
17500 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20  not be.** used, 
17510 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75  each range inequ
17520 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68  ality reduces th
17530 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62  e search space b
17540 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e  y a factor of 4.
17550 20 0a 2a 2a 20 48 65 6e 63 65 20 61 20 70 61 69   .** Hence a pai
17560 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73  r of constraints
17570 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72   (x>? AND x<?) r
17580 65 64 75 63 65 73 20 74 68 65 20 65 78 70 65 63  educes the expec
17590 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  ted number of.**
175a0 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
175b0 20 61 20 66 61 63 74 6f 72 20 6f 66 20 31 36 2e   a factor of 16.
175c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
175d0 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
175e0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
175f0 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
17600 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
17610 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
17620 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
17630 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
17640 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77   WhereTerm *pLow
17650 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62  er,   /* Lower b
17660 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
17670 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d  e. ex: "x>123" M
17680 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
17690 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70    WhereTerm *pUp
176a0 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20  per,   /* Upper 
176b0 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
176c0 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20  ge. ex: "x<455" 
176d0 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
176e0 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 6e  .  WhereCost *pn
176f0 4f 75 74 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55  Out     /* IN/OU
17700 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  T: Number of row
17710 73 20 76 69 73 69 74 65 64 20 2a 2f 0a 29 7b 0a  s visited */.){.
17720 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17730 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74  E_OK;.  int nOut
17740 20 3d 20 28 69 6e 74 29 2a 70 6e 4f 75 74 3b 0a   = (int)*pnOut;.
17750 20 20 57 68 65 72 65 43 6f 73 74 20 6e 4e 65 77    WhereCost nNew
17760 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
17770 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
17780 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a  _STAT4.  Index *
17790 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
177a0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
177b0 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
177c0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
177d0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20  u.btree.nEq;..  
177e0 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  if( p->nSample>0
177f0 0a 20 20 20 26 26 20 6e 45 71 3d 3d 70 42 75 69  .   && nEq==pBui
17800 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a  lder->nRecValid.
17810 20 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61     && nEq<p->nSa
17820 6d 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70  mpleCol.   && Op
17830 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
17840 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
17850 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29  LITE_Stat3) .  )
17860 7b 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65  {.    UnpackedRe
17870 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
17880 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20  ilder->pRec;.   
17890 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20   tRowcnt a[2];. 
178a0 20 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20     u8 aff;..    
178b0 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77  /* Variable iLow
178c0 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  er will be set t
178d0 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
178e0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
178f0 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20  rows in .    ** 
17900 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61  the index that a
17910 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  re less than the
17920 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
17930 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
17940 20 54 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65   The.    ** lowe
17950 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68  r bound being th
17960 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20  e concatenation 
17970 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68  of $P and $L, wh
17980 65 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20  ere $P is the.  
17990 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20    ** key-prefix 
179a0 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45  formed by the nE
179b0 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64  q values matched
179c0 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71   against the nEq
179d0 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 2a   left-most.    *
179e0 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * columns of the
179f0 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69   index, and $L i
17a00 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  s the value in p
17a10 4c 6f 77 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  Lower..    **.  
17a20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77    ** Or, if pLow
17a30 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c  er is NULL or $L
17a40 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
17a50 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65  cted from it (be
17a60 63 61 75 73 65 20 69 74 0a 20 20 20 20 2a 2a 20  cause it.    ** 
17a70 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20  is not a simple 
17a80 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65  variable or lite
17a90 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20  ral value), the 
17aa0 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  lower bound of t
17ab0 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
17ac0 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20  is $P. Due to a 
17ad0 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79  quirk in the way
17ae0 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
17af0 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20   works, even.   
17b00 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61   ** if $L is ava
17b10 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79  ilable, whereKey
17b20 53 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65  Stats() is calle
17b30 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20  d for both ($P) 
17b40 61 6e 64 20 0a 20 20 20 20 2a 2a 20 28 24 50 3a  and .    ** ($P:
17b50 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67  $L) and the larg
17b60 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65  er of the two re
17b70 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20 75 73  turned values us
17b80 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
17b90 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70  * Similarly, iUp
17ba0 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74  per is to be set
17bb0 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
17bc0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
17bd0 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 6c 65  f rows.    ** le
17be0 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
17bf0 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
17c00 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72  ange query. Wher
17c10 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  e the upper boun
17c20 64 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68  d.    ** is eith
17c30 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24  er ($P) or ($P:$
17c40 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20  U). Again, even 
17c50 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62  if $U is availab
17c60 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a  le, both values.
17c70 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72      ** of iUpper
17c80 20 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f   are requested o
17c90 66 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  f whereKeyStats(
17ca0 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65  ) and the smalle
17cb0 72 20 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  r used..    */. 
17cc0 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
17cd0 72 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  r;.    tRowcnt i
17ce0 55 70 70 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Upper;..    if( 
17cf0 6e 45 71 3d 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  nEq==p->nColumn 
17d00 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
17d10 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
17d20 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  R;.    }else{.  
17d30 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61      aff = p->pTa
17d40 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
17d50 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69  olumn[nEq]].affi
17d60 6e 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nity;.    }.    
17d70 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f  /* Determine iLo
17d80 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75  wer and iUpper u
17d90 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20  sing ($P) only. 
17da0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  */.    if( nEq==
17db0 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
17dc0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70  r = 0;.      iUp
17dd0 70 65 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73  per = p->aiRowEs
17de0 74 5b 30 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t[0];.    }else{
17df0 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  .      /* Note: 
17e00 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20  this call could 
17e10 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61  be optimized awa
17e20 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61  y - since the sa
17e30 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a  me values must .
17e40 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65        ** have be
17e50 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65  en requested whe
17e60 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50  n testing key $P
17e70 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63   in whereEqualSc
17e80 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20  anEst().  */.   
17e90 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73     whereKeyStats
17ea0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
17eb0 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 69  , 0, a);.      i
17ec0 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20  Lower = a[0];.  
17ed0 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30      iUpper = a[0
17ee0 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 7d 0a  ] + a[1];.    }.
17ef0 0a 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69  .    /* If possi
17f00 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20  ble, improve on 
17f10 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d  the iLower estim
17f20 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c  ate using ($P:$L
17f30 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c  ). */.    if( pL
17f40 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e  ower ){.      in
17f50 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20  t bOk;          
17f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
17f70 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78  e if value is ex
17f80 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
17f90 70 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  pr */.      Expr
17fa0 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72   *pExpr = pLower
17fb0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
17fc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
17fd0 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
17fe0 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  r & (WO_GT|WO_GE
17ff0 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ))!=0 );.      r
18000 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
18010 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50  ProbeSetValue(pP
18020 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20  arse, p, &pRec, 
18030 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c  pExpr, aff, nEq,
18040 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 69 66   &bOk);.      if
18050 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18060 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20  && bOk ){.      
18070 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a    tRowcnt iNew;.
18080 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79          whereKey
18090 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
180a0 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
180b0 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30        iNew = a[0
180c0 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f  ] + ((pLower->eO
180d0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 29  perator & WO_GT)
180e0 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20   ? a[1] : 0);.  
180f0 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69        if( iNew>i
18100 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d  Lower ) iLower =
18110 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 6e   iNew;.        n
18120 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Out--;.      }. 
18130 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
18140 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76  possible, improv
18150 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20  e on the iUpper 
18160 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28  estimate using (
18170 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 69  $P:$U). */.    i
18180 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  f( pUpper ){.   
18190 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20     int bOk;     
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
181b0 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20  * True if value 
181c0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
181d0 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20  m pExpr */.     
181e0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
181f0 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
18200 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
18210 72 74 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70  rt( (pUpper->eOp
18220 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
18230 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_LE))!=0 );.  
18240 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18250 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
18260 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
18270 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  Rec, pExpr, aff,
18280 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20   nEq, &bOk);.   
18290 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
182a0 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
182b0 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69         tRowcnt i
182c0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77 68 65  New;.        whe
182d0 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
182e0 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61  e, p, pRec, 1, a
182f0 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 77 20  );.        iNew 
18300 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65  = a[0] + ((pUppe
18310 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  r->eOperator & W
18320 4f 5f 4c 45 29 20 3f 20 61 5b 31 5d 20 3a 20 30  O_LE) ? a[1] : 0
18330 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
18340 4e 65 77 3c 69 55 70 70 65 72 20 29 20 69 55 70  New<iUpper ) iUp
18350 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20  per = iNew;.    
18360 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
18370 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
18380 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
18390 70 52 65 63 3b 0a 20 20 20 20 69 66 28 20 72 63  pRec;.    if( rc
183a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
183b0 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e       if( iUpper>
183c0 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  iLower ){.      
183d0 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 43 6f    nNew = whereCo
183e0 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  st(iUpper - iLow
183f0 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  er);.      }else
18400 7b 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d  {.        nNew =
18410 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   10;        asse
18420 72 74 28 20 31 30 3d 3d 77 68 65 72 65 43 6f 73  rt( 10==whereCos
18430 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a  t(2) );.      }.
18440 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e        if( nNew<n
18450 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  Out ){.        n
18460 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  Out = nNew;.    
18470 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 4f 75 74    }.      *pnOut
18480 20 3d 20 28 57 68 65 72 65 43 6f 73 74 29 6e 4f   = (WhereCost)nO
18490 75 74 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ut;.      WHERET
184a0 52 41 43 45 28 30 78 31 30 30 2c 20 28 22 72 61  RACE(0x100, ("ra
184b0 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73  nge scan regions
184c0 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64  : %u..%u  est=%d
184d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
184e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
184f0 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29  32)iLower, (u32)
18500 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a  iUpper, nOut));.
18510 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18520 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
18530 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
18540 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73  _PARAMETER(pPars
18550 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
18560 41 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72 29  AMETER(pBuilder)
18570 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
18580 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
18590 70 65 72 20 29 3b 0a 20 20 2f 2a 20 54 55 4e 49  per );.  /* TUNI
185a0 4e 47 3a 20 20 45 61 63 68 20 69 6e 65 71 75 61  NG:  Each inequa
185b0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
185c0 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
185d0 63 68 20 73 70 61 63 65 20 34 2d 66 6f 6c 64 2e  ch space 4-fold.
185e0 0a 20 20 2a 2a 20 41 20 42 45 54 57 45 45 4e 20  .  ** A BETWEEN 
185f0 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 72 65 66  operator, theref
18600 6f 72 65 2c 20 72 65 64 75 63 65 73 20 74 68 65  ore, reduces the
18610 20 73 65 61 72 63 68 20 73 70 61 63 65 20 31 36   search space 16
18620 2d 66 6f 6c 64 20 2a 2f 0a 20 20 6e 4e 65 77 20  -fold */.  nNew 
18630 3d 20 6e 4f 75 74 3b 0a 20 20 69 66 28 20 70 4c  = nOut;.  if( pL
18640 6f 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d  ower && (pLower-
18650 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
18660 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
18670 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20 20 20   nNew -= 20;    
18680 20 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d      assert( 20==
18690 77 68 65 72 65 43 6f 73 74 28 34 29 20 29 3b 0a  whereCost(4) );.
186a0 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 7d 0a      nOut--;.  }.
186b0 20 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a    if( pUpper ){.
186c0 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20      nNew -= 20; 
186d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32         assert( 2
186e0 30 3d 3d 77 68 65 72 65 43 6f 73 74 28 34 29 20  0==whereCost(4) 
186f0 29 3b 0a 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20  );.    nOut--;. 
18700 20 7d 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30   }.  if( nNew<10
18710 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20   ) nNew = 10;.  
18720 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20  if( nNew<nOut ) 
18730 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 2a  nOut = nNew;.  *
18740 70 6e 4f 75 74 20 3d 20 28 57 68 65 72 65 43 6f  pnOut = (WhereCo
18750 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72  st)nOut;.  retur
18760 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
18770 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
18780 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
18790 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
187a0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
187b0 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
187c0 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
187d0 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e   an equality con
187e0 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20  straint x=VALUE 
187f0 61 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56  and where that V
18800 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a  ALUE occurs in.*
18810 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20  * the histogram 
18820 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79  data.  This only
18830 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73   works when x is
18840 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a   the left-most.*
18850 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69  * column of an i
18860 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f  ndex and sqlite_
18870 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20  stat3 histogram 
18880 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
18890 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e  e.** for that in
188a0 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72  dex.  When pExpr
188b0 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
188c0 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  s the constraint
188d0 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c   is.** "x IS NUL
188e0 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78  L" instead of "x
188f0 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57  =VALUE"..**.** W
18900 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74  rite the estimat
18910 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74  ed row count int
18920 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74  o *pnRow and ret
18930 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a  urn SQLITE_OK. .
18940 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  ** If unable to 
18950 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65  make an estimate
18960 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75  , leave *pnRow u
18970 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74  nchanged and ret
18980 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
18990 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
189a0 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20  ine can fail if 
189b0 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20  it is unable to 
189c0 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67  load a collating
189d0 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71   sequence.** req
189e0 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67  uired for string
189f0 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20   comparison, or 
18a00 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  if unable to all
18a10 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  ocate memory.** 
18a20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72  for a UTF conver
18a30 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f  sion required fo
18a40 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  r comparison.  T
18a50 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72  he error is stor
18a60 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  ed.** in the pPa
18a70 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
18a80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
18a90 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a  reEqualScanEst(.
18aa0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
18ab0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
18ac0 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
18ad0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
18ae0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
18af0 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45  r *pBuilder,.  E
18b00 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
18b10 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
18b20 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74  n for VALUE in t
18b30 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74  he x=VALUE const
18b40 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63  raint */.  tRowc
18b50 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
18b60 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
18b70 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
18b80 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
18b90 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
18ba0 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
18bb0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
18bc0 6e 45 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nEq = pBuilder->
18bd0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
18be0 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  q;.  UnpackedRec
18bf0 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
18c00 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 75 38  lder->pRec;.  u8
18c10 20 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20   aff;           
18c20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
18c30 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20  n affinity */.  
18c40 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
18c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
18c60 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20  function return 
18c70 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  code */.  tRowcn
18c80 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20  t a[2];         
18c90 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63      /* Statistic
18ca0 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a  s */.  int bOk;.
18cb0 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d  .  assert( nEq>=
18cc0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  1 );.  assert( n
18cd0 45 71 3c 3d 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  Eq<=(p->nColumn+
18ce0 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1) );.  assert( 
18cf0 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b  p->aSample!=0 );
18d00 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53  .  assert( p->nS
18d10 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73  ample>0 );.  ass
18d20 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ert( pBuilder->n
18d30 52 65 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a  RecValid<nEq );.
18d40 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20  .  /* If values 
18d50 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
18d60 65 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73  e for all fields
18d70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
18d80 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f   the left.  ** o
18d90 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65  f this one, no e
18da0 73 74 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d  stimate can be m
18db0 61 64 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ade. Return SQLI
18dc0 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a  TE_NOTFOUND. */.
18dd0 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
18de0 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31  nRecValid<(nEq-1
18df0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
18e00 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
18e10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
18e20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
18e30 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c  on only. The cal
18e40 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74  l to sqlite3Stat
18e50 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29  4ProbeSetValue()
18e60 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c  .  ** below woul
18e70 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  d return the sam
18e80 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69  e value.  */.  i
18e90 66 28 20 6e 45 71 3e 70 2d 3e 6e 43 6f 6c 75 6d  f( nEq>p->nColum
18ea0 6e 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  n ){.    *pnRow 
18eb0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
18ec0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
18ed0 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c    aff = p->pTabl
18ee0 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c  e->aCol[p->aiCol
18ef0 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66 66 69  umn[nEq-1]].affi
18f00 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20 73 71 6c  nity;.  rc = sql
18f10 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
18f20 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70  tValue(pParse, p
18f30 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20  , &pRec, pExpr, 
18f40 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b  aff, nEq-1, &bOk
18f50 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  );.  pBuilder->p
18f60 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66  Rec = pRec;.  if
18f70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18f80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
18f90 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75  f( bOk==0 ) retu
18fa0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
18fb0 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e  ND;.  pBuilder->
18fc0 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b  nRecValid = nEq;
18fd0 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61 74  ..  whereKeyStat
18fe0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
18ff0 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52  c, 0, a);.  WHER
19000 45 54 52 41 43 45 28 30 78 31 30 30 2c 28 22 65  ETRACE(0x100,("e
19010 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67  quality scan reg
19020 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e  ions: %d\n", (in
19030 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52  t)a[1]));.  *pnR
19040 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20  ow = a[1];.  .  
19050 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
19060 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
19070 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
19080 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AT4 */..#ifdef S
19090 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
190a0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
190b0 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
190c0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
190d0 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
190e0 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
190f0 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  an IN constraint
19100 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74   where the right
19110 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
19120 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
19130 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61   is a list of va
19140 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  lues.  Example:.
19150 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45  **.**        WHE
19160 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34  RE x IN (1,2,3,4
19170 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ).**.** Write th
19180 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
19190 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
191a0 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
191b0 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
191c0 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
191d0 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
191e0 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
191f0 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
19200 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
19210 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
19220 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
19230 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
19240 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
19250 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
19260 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
19270 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
19280 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
19290 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
192a0 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
192b0 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
192c0 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
192d0 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
192e0 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
192f0 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
19300 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61  c int whereInSca
19310 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
19320 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
19330 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
19340 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
19350 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
19360 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
19370 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r,.  ExprList *p
19380 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  List,     /* The
19390 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74   value list on t
193a0 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20  he RHS of "x IN 
193b0 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20  (v1,v2,v3,...)" 
193c0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
193d0 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
193e0 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
193f0 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
19400 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
19410 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
19420 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
19430 65 78 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61  ex;.  int nRecVa
19440 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  lid = pBuilder->
19450 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74  nRecValid;.  int
19460 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19470 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
19480 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
19490 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73  */.  tRowcnt nEs
194a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
194b0 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66  Number of rows f
194c0 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  or a single term
194d0 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52   */.  tRowcnt nR
194e0 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a  owEst = 0;    /*
194f0 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66   New estimate of
19500 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
19510 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ows */.  int i; 
19520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19530 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
19540 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
19550 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
19560 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
19570 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c  QLITE_OK && i<pL
19580 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
19590 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e  {.    nEst = p->
195a0 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
195b0 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
195c0 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
195d0 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d  pBuilder, pList-
195e0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45  >a[i].pExpr, &nE
195f0 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74  st);.    nRowEst
19600 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42   += nEst;.    pB
19610 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
19620 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20  d = nRecValid;. 
19630 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
19640 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
19650 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e  f( nRowEst > p->
19660 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52  aiRowEst[0] ) nR
19670 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77  owEst = p->aiRow
19680 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52  Est[0];.    *pnR
19690 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
196a0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
196b0 30 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69  00,("IN row esti
196c0 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c  mate: est=%g\n",
196d0 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a   nRowEst));.  }.
196e0 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64    assert( pBuild
196f0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e  er->nRecValid==n
19700 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65  RecValid );.  re
19710 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
19720 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
19730 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
19740 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61  4 */../*.** Disa
19750 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68  ble a term in th
19760 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
19770 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
19780 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d  disable the term
19790 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f  .** if it contro
197a0 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  ls a LEFT OUTER 
197b0 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20  JOIN and it did 
197c0 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
197d0 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53   the ON.** or US
197e0 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ING clause of th
197f0 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43  at join..**.** C
19800 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d  onsider the term
19810 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68   t2.z='ok' in th
19820 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
19830 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  ies:.**.**   (1)
19840 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
19850 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
19860 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45  ON t1.a=t2.x WHE
19870 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  RE t2.z='ok'.** 
19880 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20    (2)  SELECT * 
19890 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
198a0 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
198b0 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
198c0 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54  **   (3)  SELECT
198d0 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57   * FROM t1, t2 W
198e0 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41  HERE t1.a=t2.x A
198f0 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a  ND t2.z='ok'.**.
19900 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27  ** The t2.z='ok'
19910 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
19920 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75  the in (2) becau
19930 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73  se it originates
19940 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  .** in the ON cl
19950 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20  ause.  The term 
19960 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  is disabled in (
19970 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73  3) because it is
19980 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20   not part.** of 
19990 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
199a0 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20  N.  In (1), the 
199b0 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61  term is not disa
199c0 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61  bled..**.** Disa
199d0 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75  bling a term cau
199e0 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f  ses that term to
199f0 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69   not be tested i
19a00 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  n the inner loop
19a10 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  .** of the join.
19a20 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61    Disabling is a
19a30 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
19a40 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20   When terms are 
19a50 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
19a60 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61  indices, we disa
19a70 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76  ble them to prev
19a80 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65  ent redundant te
19a90 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  sts in the inner
19aa0 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f  .** loop.  We wo
19ab0 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72  uld get the corr
19ac0 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e  ect results if n
19ad0 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72  othing were ever
19ae0 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75   disabled,.** bu
19af0 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75  t joins might ru
19b00 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
19b10 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73  r.  The trick is
19b20 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d   to disable as m
19b30 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e  uch.** as we can
19b40 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69   without disabli
19b50 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66  ng too much.  If
19b60 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20   we disabled in 
19b70 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a  (1), we'd get.**
19b80 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65   the wrong answe
19b90 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  r.  See ticket #
19ba0 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  813..*/.static v
19bb0 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28  oid disableTerm(
19bc0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
19bd0 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70  el, WhereTerm *p
19be0 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
19bf0 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65  rm.      && (pTe
19c00 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
19c10 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20  RM_CODED)==0.   
19c20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69     && (pLevel->i
19c30 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45  LeftJoin==0 || E
19c40 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
19c50 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
19c60 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20  FromJoin)).     
19c70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74   && (pLevel->not
19c80 52 65 61 64 79 20 26 20 70 54 65 72 6d 2d 3e 70  Ready & pTerm->p
19c90 72 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29  rereqAll)==0.  )
19ca0 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  {.    pTerm->wtF
19cb0 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
19cc0 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ED;.    if( pTer
19cd0 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b  m->iParent>=0 ){
19ce0 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
19cf0 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72   *pOther = &pTer
19d00 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d  m->pWC->a[pTerm-
19d10 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20  >iParent];.     
19d20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e   if( (--pOther->
19d30 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20  nChild)==0 ){.  
19d40 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
19d50 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72  m(pLevel, pOther
19d60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19d70 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
19d80 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74  de an OP_Affinit
19d90 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c  y opcode to appl
19da0 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  y the column aff
19db0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66  inity string zAf
19dc0 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65  f.** to the n re
19dd0 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
19de0 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a   at base. .**.**
19df0 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   As an optimizat
19e00 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  ion, SQLITE_AFF_
19e10 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68  NONE entries (wh
19e20 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20  ich are no-ops) 
19e30 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e  at the.** beginn
19e40 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a  ing and end of z
19e50 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  Aff are ignored.
19e60 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73    If all entries
19e70 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20   in zAff are.** 
19e80 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c  SQLITE_AFF_NONE,
19e90 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65   then no code ge
19ea0 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a  ts generated..**
19eb0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19ec0 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63   makes its own c
19ed0 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74  opy of zAff so t
19ee0 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69  hat the caller i
19ef0 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64  s free.** to mod
19f00 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74  ify zAff after t
19f10 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
19f20 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rns..*/.static v
19f30 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66  oid codeApplyAff
19f40 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61  inity(Parse *pPa
19f50 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69  rse, int base, i
19f60 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66  nt n, char *zAff
19f70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
19f80 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
19f90 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20  if( zAff==0 ){. 
19fa0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
19fb0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
19fc0 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
19fd0 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
19fe0 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41   v!=0 );..  /* A
19ff0 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e  djust base and n
1a000 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51   to skip over SQ
1a010 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e  LITE_AFF_NONE en
1a020 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67  tries at the beg
1a030 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20  inning.  ** and 
1a040 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e  end of the affin
1a050 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f  ity string..  */
1a060 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
1a070 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45   zAff[0]==SQLITE
1a080 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
1a090 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b   n--;.    base++
1a0a0 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20  ;.    zAff++;.  
1a0b0 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  }.  while( n>1 &
1a0c0 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c  & zAff[n-1]==SQL
1a0d0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
1a0e0 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20      n--;.  }..  
1a0f0 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41  /* Code the OP_A
1a100 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69  ffinity opcode i
1a110 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68  f there is anyth
1a120 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20  ing left to do. 
1a130 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  */.  if( n>0 ){.
1a140 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a150 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp2(v, OP_Affi
1a160 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  nity, base, n);.
1a170 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1a180 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a  hangeP4(v, -1, z
1a190 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c  Aff, n);.    sql
1a1a0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
1a1b0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
1a1c0 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  se, base, n);.  
1a1d0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
1a1e0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1a1f0 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20  single equality 
1a200 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
1a210 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71  E clause.  An eq
1a220 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63  uality.** term c
1a230 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65  an be either X=e
1a240 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e  xpr or X IN (...
1a250 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68  ).   pTerm is th
1a260 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a  e term to be .**
1a270 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   coded..**.** Th
1a280 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
1a290 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69  for the constrai
1a2a0 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  nt is left in re
1a2b0 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a  gister iReg..**.
1a2c0 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61  ** For a constra
1a2d0 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  int of the form 
1a2e0 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72  X=expr, the expr
1a2f0 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61  ession is evalua
1a300 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72  ted and its.** r
1a310 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e  esult is left on
1a320 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72   the stack.  For
1a330 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20   constraints of 
1a340 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e  the form X IN (.
1a350 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ..).** this rout
1a360 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f  ine sets up a lo
1a370 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65  op that will ite
1a380 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61  rate over all va
1a390 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74  lues of X..*/.st
1a3a0 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75  atic int codeEqu
1a3b0 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72  alityTerm(.  Par
1a3c0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1a3d0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1a3e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
1a3f0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
1a400 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20   /* The term of 
1a410 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1a420 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
1a430 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1a440 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76  evel, /* The lev
1a450 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  el of the FROM c
1a460 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72  lause we are wor
1a470 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74  king on */.  int
1a480 20 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20   iEq,           
1a490 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1a4a0 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77   equality term w
1a4b0 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c  ithin this level
1a4c0 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
1a4d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1a4e0 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72  e for reverse-or
1a4f0 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e  der IN operation
1a500 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67  s */.  int iTarg
1a510 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  et         /* At
1a520 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72  tempt to leave r
1a530 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72  esults in this r
1a540 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
1a550 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
1a560 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20  ->pExpr;.  Vdbe 
1a570 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1a580 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20  be;.  int iReg; 
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5a0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
1a5b0 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ding results */.
1a5c0 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67  .  assert( iTarg
1a5d0 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58  et>0 );.  if( pX
1a5e0 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20  ->op==TK_EQ ){. 
1a5f0 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
1a600 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1a610 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
1a620 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  ht, iTarget);.  
1a630 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70  }else if( pX->op
1a640 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
1a650 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
1a660 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
1a670 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1a680 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23  ull, 0, iReg);.#
1a690 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a6a0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65  IT_SUBQUERY.  }e
1a6b0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79  lse{.    int eTy
1a6c0 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62  pe;.    int iTab
1a6d0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c  ;.    struct InL
1a6e0 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68  oop *pIn;.    Wh
1a6f0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
1a700 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
1a710 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ..    if( (pLoop
1a720 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1a730 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
1a740 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f  =0.      && pLoo
1a750 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1a760 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c  x!=0.      && pL
1a770 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1a780 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
1a790 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  iEq].    ){.    
1a7a0 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d    testcase( iEq=
1a7b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1a7c0 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20  case( bRev );.  
1a7d0 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76      bRev = !bRev
1a7e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1a7f0 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
1a800 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  N );.    iReg = 
1a810 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79  iTarget;.    eTy
1a820 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
1a830 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
1a840 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  pX, 0);.    if( 
1a850 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
1a860 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20  INDEX_DESC ){.  
1a870 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52      testcase( bR
1a880 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76  ev );.      bRev
1a890 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a   = !bRev;.    }.
1a8a0 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69      iTab = pX->i
1a8b0 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
1a8c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a8d0 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
1a8e0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
1a8f0 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
1a900 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1a910 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
1a920 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c  OR)==0 );.    pL
1a930 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
1a940 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20  WHERE_IN_ABLE;. 
1a950 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75     if( pLevel->u
1a960 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20  .in.nIn==0 ){.  
1a970 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
1a980 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
1a990 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1a9a0 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
1a9b0 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20  >u.in.nIn++;.   
1a9c0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
1a9d0 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73  nLoop =.       s
1a9e0 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
1a9f0 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  rFree(pParse->db
1aa00 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
1aa10 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  InLoop,.        
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa30 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65        sizeof(pLe
1aa40 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
1aa50 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e  p[0])*pLevel->u.
1aa60 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e  in.nIn);.    pIn
1aa70 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e   = pLevel->u.in.
1aa80 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  aInLoop;.    if(
1aa90 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49   pIn ){.      pI
1aaa0 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  n += pLevel->u.i
1aab0 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20  n.nIn - 1;.     
1aac0 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61   pIn->iCur = iTa
1aad0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  b;.      if( eTy
1aae0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
1aaf0 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  ID ){.        pI
1ab00 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73  n->addrInTop = s
1ab10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ab20 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
1ab30 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20  ab, iReg);.     
1ab40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ab50 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d  pIn->addrInTop =
1ab60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ab70 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1ab80 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b   iTab, 0, iReg);
1ab90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1aba0 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d  In->eEndLoopOp =
1abb0 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
1abc0 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  : OP_Next;.     
1abd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1abe0 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p1(v, OP_IsNull,
1abf0 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73   iReg);.    }els
1ac00 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
1ac10 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20  >u.in.nIn = 0;. 
1ac20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
1ac30 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1ac40 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
1ac50 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a  return iReg;.}..
1ac60 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1ac70 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
1ac80 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e  aluate all == an
1ac90 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
1aca0 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78   for an.** index
1acb0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1acc0 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61  ple, consider ta
1acd0 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65  ble t1(a,b,c,d,e
1ace0 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69  ,f) with index i
1acf0 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70  1(a,b,c)..** Sup
1ad00 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63  pose the WHERE c
1ad10 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20  lause is this:  
1ad20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31  a==5 AND b IN (1
1ad30 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e  ,2,3) AND c>5 AN
1ad40 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e  D c<10.** The in
1ad50 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20  dex has as many 
1ad60 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74  as three equalit
1ad70 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62  y constraints, b
1ad80 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78  ut in this.** ex
1ad90 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64  ample, the third
1ada0 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e   "c" value is an
1adb0 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f   inequality.  So
1adc0 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f   only two .** co
1add0 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
1ade0 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ded.  This routi
1adf0 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ne will generate
1ae00 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
1ae10 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20  e.** a==5 and b 
1ae20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65  IN (1,2,3).  The
1ae30 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
1ae40 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c  for a and b will
1ae50 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   be stored.** in
1ae60 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
1ae70 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69  isters and the i
1ae80 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
1ae90 74 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65  t register is re
1aea0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  turned..**.** In
1aeb0 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
1aec0 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20  ve nEq==2.  But 
1aed0 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
1aee0 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61  works for any va
1aef0 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e  lue.** of nEq in
1af00 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e  cluding 0.  If n
1af10 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74  Eq==0, this rout
1af20 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20  ine is nearly a 
1af30 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e  no-op..** The on
1af40 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73  ly thing it does
1af50 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   is allocate the
1af60 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65   pLevel->iMem me
1af70 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a  mory cell and.**
1af80 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66   compute the aff
1af90 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a  inity string..**
1afa0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1afb0 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65   always allocate
1afc0 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d  s at least one m
1afd0 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
1afe0 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e  eturns.** the in
1aff0 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f  dex of that memo
1b000 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64  ry cell. The cod
1b010 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20  e that.** calls 
1b020 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
1b030 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72  l use that memor
1b040 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20  y cell to store 
1b050 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a  the termination.
1b060 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20  ** key value of 
1b070 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e  the loop.  If on
1b080 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65  e or more IN ope
1b090 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74  rators appear, t
1b0a0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
1b0b0 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ine allocates an
1b0c0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20   additional nEq 
1b0d0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
1b0e0 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65   internal.** use
1b0f0 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
1b100 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66  eturning, *pzAff
1b110 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1b120 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
1b130 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70  taining a.** cop
1b140 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  y of the column 
1b150 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
1b160 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c  of the index all
1b170 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20  ocated using.** 
1b180 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
1b190 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69  ). Except, entri
1b1a0 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f  es in the copy o
1b1b0 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73  f the string ass
1b1c0 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
1b1d0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1b1e0 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f  ints that use NO
1b1f0 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20  NE affinity are 
1b200 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45  set to.** SQLITE
1b210 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20  _AFF_NONE. This 
1b220 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  is to deal with 
1b230 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20  SQL such as the 
1b240 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
1b250 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1b260 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52  t1(a TEXT PRIMAR
1b270 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20  Y KEY, b);.**   
1b280 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
1b290 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45  t1 AS t2, t1 WHE
1b2a0 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a  RE t1.a = t2.b;.
1b2b0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
1b2c0 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20  mple above, the 
1b2d0 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68  index on t1(a) h
1b2e0 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79  as TEXT affinity
1b2f0 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74  . But since.** t
1b300 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69  he right hand si
1b310 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69  de of the equali
1b320 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74  ty constraint (t
1b330 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66  2.b) has NONE af
1b340 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f  finity,.** no co
1b350 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20  nversion should 
1b360 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66  be attempted bef
1b370 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62  ore using a t2.b
1b380 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f   value as part o
1b390 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65  f.** a key to se
1b3a0 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20  arch the index. 
1b3b0 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  Hence the first 
1b3c0 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75  byte in the retu
1b3d0 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a  rned affinity.**
1b3e0 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20   string in this 
1b3f0 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65  example would be
1b400 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41   set to SQLITE_A
1b410 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74  FF_NONE..*/.stat
1b420 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71  ic int codeAllEq
1b430 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50  ualityTerms(.  P
1b440 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1b450 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1b460 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
1b470 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
1b480 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74     /* Which nest
1b490 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46  ed loop of the F
1b4a0 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e  ROM we are codin
1b4b0 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  g */.  int bRev,
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b4d0 52 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65  Reverse the orde
1b4e0 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  r of IN operator
1b4f0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  s */.  int nExtr
1b500 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  aReg,        /* 
1b510 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
1b520 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  registers to all
1b530 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  ocate */.  char 
1b540 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20  **pzAff         
1b550 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20   /* OUT: Set to 
1b560 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74  point to affinit
1b570 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
1b580 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20   int nEq;       
1b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b5a0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
1b5b0 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
1b5c0 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a  ints to code */.
1b5d0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1b5e0 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
1b5f0 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20  /* The vm under 
1b600 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1b610 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b630 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69  /* The index bei
1b640 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  ng used for this
1b650 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65   loop */.  Where
1b660 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
1b670 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
1b680 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
1b690 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  term */.  WhereL
1b6a0 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
1b6b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1b6c0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
1b6d0 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6f0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1b700 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  er */.  int regB
1b710 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1b720 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
1b730 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
1b740 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nReg;           
1b750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b760 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73  ber of registers
1b770 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
1b780 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20    char *zAff;   
1b790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7a0 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
1b7b0 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ng to return */.
1b7c0 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c  .  /* This modul
1b7d0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
1b7e0 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20   on query plans 
1b7f0 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65  that use an inde
1b800 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20  x. */.  pLoop = 
1b810 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1b820 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
1b830 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1b840 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
1b850 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c  =0 );.  nEq = pL
1b860 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1b870 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70  ;.  pIdx = pLoop
1b880 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1b890 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
1b8a0 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  !=0 );..  /* Fig
1b8b0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
1b8c0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65   memory cells we
1b8d0 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20   will need then 
1b8e0 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20  allocate them.. 
1b8f0 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20   */.  regBase = 
1b900 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
1b910 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70  ;.  nReg = pLoop
1b920 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20  ->u.btree.nEq + 
1b930 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61  nExtraReg;.  pPa
1b940 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
1b950 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c  g;..  zAff = sql
1b960 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
1b970 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33  rse->db, sqlite3
1b980 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
1b990 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66  (v, pIdx));.  if
1b9a0 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70  ( !zAff ){.    p
1b9b0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1b9c0 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d  cFailed = 1;.  }
1b9d0 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
1b9e0 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
1b9f0 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
1ba00 61 73 73 65 72 74 28 20 7a 41 66 66 3d 3d 30 20  assert( zAff==0 
1ba10 7c 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  || (int)strlen(z
1ba20 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 66  Aff)>=nEq );.  f
1ba30 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a  or(j=0; j<nEq; j
1ba40 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b  ++){.    int r1;
1ba50 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
1ba60 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
1ba70 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
1ba80 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  !=0 );.    /* Th
1ba90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65  e following true
1baa0 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74   for indices wit
1bab0 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  h redundant colu
1bac0 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a  mns. .    ** Ex:
1bad0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
1bae0 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53   ON t1(a,b,a); S
1baf0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1bb00 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d  WHERE a=0 AND b=
1bb10 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61  0; */.    testca
1bb20 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  se( (pTerm->wtFl
1bb30 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
1bb40 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )!=0 );.    test
1bb50 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
1bb60 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1bb70 55 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d 20  UAL );.    r1 = 
1bb80 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
1bb90 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
1bba0 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
1bbb0 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
1bbc0 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65   if( r1!=regBase
1bbd0 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  +j ){.      if( 
1bbe0 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nReg==1 ){.     
1bbf0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1bc00 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1bc10 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20   regBase);.     
1bc20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b     regBase = r1;
1bc30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1bc40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1bc50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
1bc60 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65  opy, r1, regBase
1bc70 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
1bc80 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
1bc90 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1bca0 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
1bcb0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1bcc0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1bcd0 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69  & WO_IN );.    i
1bce0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1bcf0 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
1bd00 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a  L|WO_IN))==0 ){.
1bd10 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
1bd20 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  ht = pTerm->pExp
1bd30 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
1bd40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bd50 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52  IsNullJump(v, pR
1bd60 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c  ight, regBase+j,
1bd70 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
1bd80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66  );.      if( zAf
1bd90 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  f ){.        if(
1bda0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
1bdb0 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
1bdc0 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45  zAff[j])==SQLITE
1bdd0 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
1bde0 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d         zAff[j] =
1bdf0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1be00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1be10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1be20 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
1be30 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
1be40 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20   zAff[j]) ){.   
1be50 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d         zAff[j] =
1be60 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1be70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1be80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1be90 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20  *pzAff = zAff;. 
1bea0 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b   return regBase;
1beb0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1bec0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
1bed0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1bee0 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72 20 66  ne is a helper f
1bef0 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52  or explainIndexR
1bf00 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a  ange() below.**.
1bf10 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68  ** pStr holds th
1bf20 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70  e text of an exp
1bf30 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20  ression that we 
1bf40 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20  are building up 
1bf50 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61  one term.** at a
1bf60 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75   time.  This rou
1bf70 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20  tine adds a new 
1bf80 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20  term to the end 
1bf90 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1bfa0 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20  n..** Terms are 
1bfb0 73 65 70 61 72 61 74 65 64 20 62 79 20 41 4e 44  separated by AND
1bfc0 20 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44   so add the "AND
1bfd0 22 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e  " text for secon
1bfe0 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
1bff0 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a  .** terms only..
1c000 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1c010 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
1c020 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53  (.  StrAccum *pS
1c030 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
1c040 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78 70 72  /* The text expr
1c050 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69  ession being bui
1c060 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72  lt */.  int iTer
1c070 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
1c080 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1c090 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73  this term.  Firs
1c0a0 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63  t is zero */.  c
1c0b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
1c0c0 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  mn,        /* Na
1c0d0 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
1c0e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1c0f0 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20   *zOp           
1c100 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1c110 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a   operator */.){.
1c120 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 73 71    if( iTerm ) sq
1c130 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1c140 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20  end(pStr, " AND 
1c150 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", 5);.  sqlite3
1c160 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
1c170 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31  Str, zColumn, -1
1c180 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
1c190 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
1c1a0 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69   zOp, 1);.  sqli
1c1b0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1c1c0 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b  d(pStr, "?", 1);
1c1d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
1c1e0 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69  nt pLevel descri
1c1f0 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66  bes a strategy f
1c200 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c  or scanning tabl
1c210 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a  e pTab. This .**
1c220 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1c230 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1c240 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 63   string buffer c
1c250 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63  ontaining a desc
1c260 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ription.** of th
1c270 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c  e subset of tabl
1c280 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62  e rows scanned b
1c290 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69  y the strategy i
1c2a0 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e  n the form of an
1c2b0 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69  .** SQL expressi
1c2c0 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72  on. Or, if all r
1c2d0 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c  ows are scanned,
1c2e0 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
1c2f0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
1c300 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65  mple, if the que
1c310 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  ry:.**.**   SELE
1c320 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
1c330 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a  RE a=1 AND b>2;.
1c340 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64  **.** is run and
1c350 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64   there is an ind
1c360 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68  ex on (a, b), th
1c370 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1c380 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74   returns a.** st
1c390 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a  ring similar to:
1c3a0 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e  .**.**   "a=? AN
1c3b0 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65  D b>?".**.** The
1c3c0 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
1c3d0 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f  r points to memo
1c3e0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
1c3f0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1c400 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  ()..** It is the
1c410 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1c420 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
1c430 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72   free the buffer
1c440 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e   when it is.** n
1c450 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
1c460 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
1c470 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52  r *explainIndexR
1c480 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62  ange(sqlite3 *db
1c490 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f  , WhereLoop *pLo
1c4a0 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  op, Table *pTab)
1c4b0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
1c4c0 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
1c4d0 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  ee.pIndex;.  int
1c4e0 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
1c4f0 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 69 6e 74  btree.nEq;.  int
1c500 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20   i, j;.  Column 
1c510 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  *aCol = pTab->aC
1c520 6f 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c  ol;.  int *aiCol
1c530 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69  umn = pIndex->ai
1c540 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63  Column;.  StrAcc
1c550 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e  um txt;..  if( n
1c560 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d  Eq==0 && (pLoop-
1c570 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
1c580 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
1c590 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30  E_TOP_LIMIT))==0
1c5a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1c5b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
1c5c0 74 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74  trAccumInit(&txt
1c5d0 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d  , 0, 0, SQLITE_M
1c5e0 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78  AX_LENGTH);.  tx
1c5f0 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c  t.db = db;.  sql
1c600 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1c610 6e 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32  nd(&txt, " (", 2
1c620 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1c630 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  nEq; i++){.    c
1c640 68 61 72 20 2a 7a 20 3d 20 28 69 3d 3d 70 49 6e  har *z = (i==pIn
1c650 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f  dex->nColumn ) ?
1c660 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b   "rowid" : aCol[
1c670 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61  aiColumn[i]].zNa
1c680 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41  me;.    explainA
1c690 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20  ppendTerm(&txt, 
1c6a0 69 2c 20 7a 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a  i, z, "=");.  }.
1c6b0 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20  .  j = i;.  if( 
1c6c0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57  pLoop->wsFlags&W
1c6d0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
1c6e0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
1c6f0 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  (j==pIndex->nCol
1c700 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20  umn ) ? "rowid" 
1c710 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  : aCol[aiColumn[
1c720 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65  j]].zName;.    e
1c730 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
1c740 28 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22  (&txt, i++, z, "
1c750 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  >");.  }.  if( p
1c760 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
1c770 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
1c780 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
1c790 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  j==pIndex->nColu
1c7a0 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a  mn ) ? "rowid" :
1c7b0 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a   aCol[aiColumn[j
1c7c0 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78  ]].zName;.    ex
1c7d0 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1c7e0 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22 29  &txt, i, z, "<")
1c7f0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
1c800 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74  trAccumAppend(&t
1c810 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 72  xt, ")", 1);.  r
1c820 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72  eturn sqlite3Str
1c830 41 63 63 75 6d 46 69 6e 69 73 68 28 26 74 78 74  AccumFinish(&txt
1c840 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1c850 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1c860 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72  o-op unless curr
1c870 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
1c880 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52   an EXPLAIN QUER
1c890 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e  Y PLAN.** comman
1c8a0 64 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 20  d. If the query 
1c8b0 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69  being compiled i
1c8c0 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45  s an EXPLAIN QUE
1c8d0 52 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c  RY PLAN, a singl
1c8e0 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 61  e.** record is a
1c8f0 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  dded to the outp
1c900 75 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  ut to describe t
1c910 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74  he table scan st
1c920 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c  rategy in .** pL
1c930 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
1c940 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53  void explainOneS
1c950 63 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  can(.  Parse *pP
1c960 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
1c970 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
1c980 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
1c990 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
1c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c9b0 54 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73 20  Table list this 
1c9c0 6c 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20 2a  loop refers to *
1c9d0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
1c9e0 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  pLevel,         
1c9f0 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77      /* Scan to w
1ca00 72 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20  rite OP_Explain 
1ca10 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20  opcode for */.  
1ca20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca40 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65  /* Value for "le
1ca50 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f  vel" column of o
1ca60 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69  utput */.  int i
1ca70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
1ca80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1ca90 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20 63  lue for "from" c
1caa0 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20  olumn of output 
1cab0 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
1cac0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
1cad0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
1cae0 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
1caf0 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29  hereBegin() */.)
1cb00 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
1cb10 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
1cb20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1cb30 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
1cb40 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
1cb50 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
1cb60 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1cb70 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
1cb80 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74 72   VM being constr
1cb90 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c  ucted */.    sql
1cba0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1cbb0 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61  e->db;     /* Da
1cbc0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
1cbd0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b  .    char *zMsg;
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbf0 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64     /* Text to ad
1cc00 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20  d to EQP output 
1cc10 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d  */.    int iId =
1cc20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
1cc30 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20 69  Id;  /* Select i
1cc40 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74  d (left-most out
1cc50 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20  put column) */. 
1cc60 20 20 20 69 6e 74 20 69 73 53 65 61 72 63 68 3b     int isSearch;
1cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc80 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 53   /* True for a S
1cc90 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f 72  EARCH. False for
1cca0 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68   SCAN. */.    Wh
1ccb0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20  ereLoop *pLoop; 
1ccc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ccd0 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57  he controlling W
1cce0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
1ccf0 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73  */.    u32 flags
1cd00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cd10 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68       /* Flags th
1cd20 61 74 20 64 65 73 63 72 69 62 65 20 74 68 69 73  at describe this
1cd30 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 70 4c   loop */..    pL
1cd40 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
1cd50 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73 20  Loop;.    flags 
1cd60 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  = pLoop->wsFlags
1cd70 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
1cd80 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29  &WHERE_MULTI_OR)
1cd90 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26   || (wctrlFlags&
1cda0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
1cdb0 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  NLY) ) return;..
1cdc0 20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28      isSearch = (
1cdd0 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d  flags&(WHERE_BTM
1cde0 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
1cdf0 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20  _LIMIT))!=0.    
1ce00 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61          || ((fla
1ce10 67 73 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c  gs&WHERE_VIRTUAL
1ce20 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c  TABLE)==0 && (pL
1ce30 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1ce40 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  >0)).           
1ce50 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26   || (wctrlFlags&
1ce60 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  (WHERE_ORDERBY_M
1ce70 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59  IN|WHERE_ORDERBY
1ce80 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73  _MAX));..    zMs
1ce90 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
1cea0 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73 53  tf(db, "%s", isS
1ceb0 65 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a 22  earch?"SEARCH":"
1cec0 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28 20  SCAN");.    if( 
1ced0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
1cee0 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
1cef0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1cf00 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55 42  b, zMsg, "%s SUB
1cf10 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c  QUERY %d", zMsg,
1cf20 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
1cf30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1cf40 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1cf50 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1cf60 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20 25  Msg, "%s TABLE %
1cf70 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d  s", zMsg, pItem-
1cf80 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a  >zName);.    }..
1cf90 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
1cfa0 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 7a  Alias ){.      z
1cfb0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1cfc0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1cfd0 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67  "%s AS %s", zMsg
1cfe0 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
1cff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d000 28 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  (flags & (WHERE_
1d010 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54 55 41  IPK|WHERE_VIRTUA
1d020 4c 54 41 42 4c 45 29 29 3d 3d 30 0a 20 20 20 20  LTABLE))==0.    
1d030 20 26 26 20 41 4c 57 41 59 53 28 70 4c 6f 6f 70   && ALWAYS(pLoop
1d040 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1d050 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
1d060 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
1d070 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e   explainIndexRan
1d080 67 65 28 64 62 2c 20 70 4c 6f 6f 70 2c 20 70 49  ge(db, pLoop, pI
1d090 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
1d0a0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1d0b0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1d0c0 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
1d0d0 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52    ((flags & WHER
1d0e0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 3f 20  E_AUTO_INDEX) ? 
1d0f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d100 20 20 20 20 22 25 73 20 55 53 49 4e 47 20 41 55      "%s USING AU
1d110 54 4f 4d 41 54 49 43 20 25 73 49 4e 44 45 58 25  TOMATIC %sINDEX%
1d120 2e 30 73 25 73 22 20 3a 0a 20 20 20 20 20 20 20  .0s%s" :.       
1d130 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 20              "%s 
1d140 55 53 49 4e 47 20 25 73 49 4e 44 45 58 20 25 73  USING %sINDEX %s
1d150 25 73 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20  %s"), .         
1d160 20 20 20 20 20 20 7a 4d 73 67 2c 20 28 28 66 6c        zMsg, ((fl
1d170 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
1d180 4f 4e 4c 59 29 20 3f 20 22 43 4f 56 45 52 49 4e  ONLY) ? "COVERIN
1d190 47 20 22 20 3a 20 22 22 29 2c 0a 20 20 20 20 20  G " : ""),.     
1d1a0 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
1d1b0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
1d1c0 3e 7a 4e 61 6d 65 2c 20 7a 57 68 65 72 65 29 3b  >zName, zWhere);
1d1d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
1d1e0 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29  Free(db, zWhere)
1d1f0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1d200 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  (flags & WHERE_I
1d210 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67 73  PK)!=0 && (flags
1d220 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41   & WHERE_CONSTRA
1d230 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  INT)!=0 ){.     
1d240 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1d250 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1d260 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45  , "%s USING INTE
1d270 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
1d280 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20  , zMsg);..      
1d290 69 66 28 20 66 6c 61 67 73 26 28 57 48 45 52 45  if( flags&(WHERE
1d2a0 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
1d2b0 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20  _COLUMN_IN) ){. 
1d2c0 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
1d2d0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1d2e0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
1d2f0 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id=?)", zMsg);. 
1d300 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
1d310 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48  flags&WHERE_BOTH
1d320 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42  _LIMIT)==WHERE_B
1d330 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  OTH_LIMIT ){.   
1d340 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1d350 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1d360 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
1d370 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22  >? AND rowid<?)"
1d380 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
1d390 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57  else if( flags&W
1d3a0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
1d3b0 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
1d3c0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1d3d0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
1d3e0 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29  rowid>?)", zMsg)
1d3f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1d400 28 20 41 4c 57 41 59 53 28 66 6c 61 67 73 26 57  ( ALWAYS(flags&W
1d410 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20  HERE_TOP_LIMIT) 
1d420 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
1d430 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1d440 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1d450 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67  (rowid<?)", zMsg
1d460 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1d470 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d480 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1d490 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 28  E.    else if( (
1d4a0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  flags & WHERE_VI
1d4b0 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
1d4c0 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
1d4d0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1d4e0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52  b, zMsg, "%s VIR
1d4f0 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58  TUAL TABLE INDEX
1d500 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20   %d:%s", zMsg,. 
1d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d520 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
1d530 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e  dxNum, pLoop->u.
1d540 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20  vtab.idxStr);.  
1d550 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7a    }.#endif.    z
1d560 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1d570 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1d580 22 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  "%s", zMsg);.   
1d590 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d5a0 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
1d5b0 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69  , iId, iLevel, i
1d5c0 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  From, zMsg, P4_D
1d5d0 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  YNAMIC);.  }.}.#
1d5e0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78  else.# define ex
1d5f0 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76  plainOneScan(u,v
1d600 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  ,w,x,y,z).#endif
1d610 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1d620 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a  EXPLAIN */.../*.
1d630 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1d640 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
1d650 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20  f the iLevel-th 
1d660 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52  loop in the WHER
1d670 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c  E clause.** impl
1d680 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72  ementation descr
1d690 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a  ibed by pWInfo..
1d6a0 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
1d6b0 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  k codeOneLoopSta
1d6c0 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  rt(.  WhereInfo 
1d6d0 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f  *pWInfo,   /* Co
1d6e0 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69  mplete informati
1d6f0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48 45  on about the WHE
1d700 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
1d710 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
1d720 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76      /* Which lev
1d730 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b  el of pWInfo->a[
1d740 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65  ] should be code
1d750 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  d */.  Bitmask n
1d760 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57  otReady     /* W
1d770 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20  hich tables are 
1d780 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
1d790 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
1d7a0 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
1d7b0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1d7c0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d7e0 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
1d7f0 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
1d800 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20    int addrNxt;  
1d810 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
1d820 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69  to jump to conti
1d830 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
1d840 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69  t IN case */.  i
1d850 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20  nt omitTable;   
1d860 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
1d870 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20  e use the index 
1d880 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  only */.  int bR
1d890 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
1d8a0 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65  * True if we nee
1d8b0 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  d to scan in rev
1d8c0 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  erse order */.  
1d8d0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1d8e0 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72  el;  /* The wher
1d8f0 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f  e level to be co
1d900 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ded */.  WhereLo
1d910 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a  op *pLoop;    /*
1d920 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   The WhereLoop o
1d930 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64 65  bject being code
1d940 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  d */.  WhereClau
1d950 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44  se *pWC;    /* D
1d960 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ecomposition of 
1d970 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52 45  the entire WHERE
1d980 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
1d990 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d9b0 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  A WHERE clause t
1d9c0 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  erm */.  Parse *
1d9d0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
1d9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1d9f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1da00 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
1da10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1da30 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  nection */.  Vdb
1da40 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da60 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 6d  The prepared stm
1da70 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
1da80 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63  tions */.  struc
1da90 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1daa0 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52  pTabItem;  /* FR
1dab0 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62  OM clause term b
1dac0 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
1dad0 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20  int addrBrk;    
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daf0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
1db00 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
1db10 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
1db20 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20  ddrCont;        
1db30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
1db40 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
1db50 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 63 79  nue with next cy
1db60 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f  cle */.  int iRo
1db70 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20  widReg = 0;     
1db80 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73     /* Rowid is s
1db90 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72 65  tored in this re
1dba0 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a  gister, if not z
1dbb0 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ero */.  int iRe
1dbc0 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20  leaseReg = 0;   
1dbd0 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73     /* Temp regis
1dbe0 74 65 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f  ter to free befo
1dbf0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a  re returning */.
1dc00 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
1dc10 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20  fo->pParse;.  v 
1dc20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1dc30 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  .  pWC = &pWInfo
1dc40 2d 3e 73 57 43 3b 0a 20 20 64 62 20 3d 20 70 50  ->sWC;.  db = pP
1dc50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4c 65 76  arse->db;.  pLev
1dc60 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
1dc70 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70  iLevel];.  pLoop
1dc80 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
1dc90 70 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  p;.  pTabItem = 
1dca0 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
1dcb0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
1dcc0 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54  om];.  iCur = pT
1dcd0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
1dce0 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65  .  pLevel->notRe
1dcf0 61 64 79 20 3d 20 6e 6f 74 52 65 61 64 79 20 26  ady = notReady &
1dd00 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66   ~getMask(&pWInf
1dd10 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75  o->sMaskSet, iCu
1dd20 72 29 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 57  r);.  bRev = (pW
1dd30 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69  Info->revMask>>i
1dd40 4c 65 76 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74  Level)&1;.  omit
1dd50 54 61 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e  Table = (pLoop->
1dd60 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1dd70 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20  IDX_ONLY)!=0 .  
1dd80 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
1dd90 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1dda0 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41  & WHERE_FORCE_TA
1ddb0 42 4c 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4e  BLE)==0;.  VdbeN
1ddc0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1ddd0 42 65 67 69 6e 20 4a 6f 69 6e 20 4c 6f 6f 70 20  Begin Join Loop 
1dde0 25 64 22 2c 20 69 4c 65 76 65 6c 29 29 3b 0a 0a  %d", iLevel));..
1ddf0 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65    /* Create labe
1de00 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61  ls for the "brea
1de10 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65  k" and "continue
1de20 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20  " instructions. 
1de30 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72   ** for the curr
1de40 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20  ent loop.  Jump 
1de50 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72  to addrBrk to br
1de60 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  eak out of a loo
1de70 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20  p..  ** Jump to 
1de80 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64  cont to go immed
1de90 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65  iately to the ne
1dea0 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
1deb0 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20  the.  ** loop.. 
1dec0 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68   **.  ** When th
1ded0 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ere is an IN ope
1dee0 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68  rator, we also h
1def0 61 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20  ave a "addrNxt" 
1df00 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20  label that.  ** 
1df10 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75  means to continu
1df20 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
1df30 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61  IN value combina
1df40 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a  tion.  When.  **
1df50 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e   there are no IN
1df60 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68   operators in th
1df70 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  e constraints, t
1df80 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62  he "addrNxt" lab
1df90 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73  el.  ** is the s
1dfa0 61 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22  ame as "addrBrk"
1dfb0 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b  ..  */.  addrBrk
1dfc0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
1dfd0 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
1dfe0 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
1dff0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1e000 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65    addrCont = pLe
1e010 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20  vel->addrCont = 
1e020 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1e030 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  abel(v);..  /* I
1e040 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69  f this is the ri
1e050 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  ght table of a L
1e060 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
1e070 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a  allocate and.  *
1e080 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d  * initialize a m
1e090 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20  emory cell that 
1e0a0 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20  records if this 
1e0b0 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e  table matches an
1e0c0 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68  y.  ** row of th
1e0d0 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  e left table of 
1e0e0 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
1e0f0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72   if( pLevel->iFr
1e100 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65  om>0 && (pTabIte
1e110 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m[0].jointype & 
1e120 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
1e130 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74     pLevel->iLeft
1e140 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Join = ++pParse-
1e150 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
1e160 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e170 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
1e180 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1e190 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
1e1a0 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46  nt((v, "init LEF
1e1b0 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20  T JOIN no-match 
1e1c0 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20  flag"));.  }..  
1e1d0 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20  /* Special case 
1e1e0 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  of a FROM clause
1e1f0 20 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d   subquery implem
1e200 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f  ented as a co-ro
1e210 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70  utine */.  if( p
1e220 54 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f  TabItem->viaCoro
1e230 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74  utine ){.    int
1e240 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62   regYield = pTab
1e250 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
1e260 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1e270 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1e280 65 67 65 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e  eger, pTabItem->
1e290 61 64 64 72 46 69 6c 6c 53 75 62 2d 31 2c 20 72  addrFillSub-1, r
1e2a0 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 4c  egYield);.    pL
1e2b0 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69  evel->p2 =  sqli
1e2c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1e2d0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69   OP_Yield, regYi
1e2e0 65 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  eld);.    VdbeCo
1e2f0 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20  mment((v, "next 
1e300 72 6f 77 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e  row of co-routin
1e310 65 20 25 73 22 2c 20 70 54 61 62 49 74 65 6d 2d  e %s", pTabItem-
1e320 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
1e330 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e340 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
1e350 72 65 67 59 69 65 6c 64 2b 31 2c 20 61 64 64 72  regYield+1, addr
1e360 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Brk);.    pLevel
1e370 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a  ->op = OP_Goto;.
1e380 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
1e390 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1e3a0 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
1e3b0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1e3c0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
1e3d0 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
1e3e0 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 54 68 65   /* Case 1:  The
1e3f0 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74   table is a virt
1e400 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20  ual-table.  Use 
1e410 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20  the VFilter and 
1e420 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20  VNext.    **    
1e430 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20        to access 
1e440 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  the data..    */
1e450 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20  .    int iReg;  
1e460 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72   /* P3 Value for
1e470 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20   OP_VFilter */. 
1e480 20 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f     int addrNotFo
1e490 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  und;.    int nCo
1e4a0 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70  nstraint = pLoop
1e4b0 2d 3e 6e 4c 54 65 72 6d 3b 0a 0a 20 20 20 20 73  ->nLTerm;..    s
1e4c0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1e4d0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
1e4e0 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47   iReg = sqlite3G
1e4f0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
1e500 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b  se, nConstraint+
1e510 32 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74 46  2);.    addrNotF
1e520 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  ound = pLevel->a
1e530 64 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28  ddrBrk;.    for(
1e540 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69  j=0; j<nConstrai
1e550 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; j++){.      
1e560 69 6e 74 20 69 54 61 72 67 65 74 20 3d 20 69 52  int iTarget = iR
1e570 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54  eg+j+2;.      pT
1e580 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
1e590 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  erm[j];.      if
1e5a0 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e  ( pTerm==0 ) con
1e5b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
1e5c0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1e5d0 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  r & WO_IN ){.   
1e5e0 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74       codeEqualit
1e5f0 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
1e600 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20  erm, pLevel, j, 
1e610 62 52 65 76 2c 20 69 54 61 72 67 65 74 29 3b 0a  bRev, iTarget);.
1e620 20 20 20 20 20 20 20 20 61 64 64 72 4e 6f 74 46          addrNotF
1e630 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  ound = pLevel->a
1e640 64 64 72 4e 78 74 3b 0a 20 20 20 20 20 20 7d 65  ddrNxt;.      }e
1e650 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1e660 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1e670 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
1e680 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67  r->pRight, iTarg
1e690 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
1e6a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1e6b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1e6c0 6e 74 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75  nteger, pLoop->u
1e6d0 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52  .vtab.idxNum, iR
1e6e0 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg);.    sqlite3
1e6f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e700 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74  _Integer, nConst
1e710 72 61 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a  raint, iReg+1);.
1e720 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e730 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c  ddOp4(v, OP_VFil
1e740 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 4e  ter, iCur, addrN
1e750 6f 74 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20  otFound, iReg,. 
1e760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e770 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74       pLoop->u.vt
1e780 61 62 2e 69 64 78 53 74 72 2c 0a 20 20 20 20 20  ab.idxStr,.     
1e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7a0 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e   pLoop->u.vtab.n
1e7b0 65 65 64 46 72 65 65 20 3f 20 50 34 5f 4d 50 52  eedFree ? P4_MPR
1e7c0 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43  INTF : P4_STATIC
1e7d0 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  );.    pLoop->u.
1e7e0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
1e7f0 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
1e800 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26  j<nConstraint &&
1e810 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20   j<16; j++){.   
1e820 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75     if( (pLoop->u
1e830 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e  .vtab.omitMask>>
1e840 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20  j)&1 ){.        
1e850 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1e860 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  el, pLoop->aLTer
1e870 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m[j]);.      }. 
1e880 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
1e890 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a  >op = OP_VNext;.
1e8a0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
1e8b0 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
1e8c0 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
1e8d0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1e8e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1e8f0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
1e900 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f  Parse, iReg, nCo
1e910 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
1e920 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1e930 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
1e940 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
1e950 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
1e960 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
1e970 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
1e980 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
1e990 4b 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f  K)!=0.   && (pLo
1e9a0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
1e9b0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57  HERE_COLUMN_IN|W
1e9c0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29  HERE_COLUMN_EQ))
1e9d0 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
1e9e0 43 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e 20  Case 2:  We can 
1e9f0 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e  directly referen
1ea00 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ce a single row 
1ea10 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
1ea20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74           equalit
1ea30 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
1ea40 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
1ea50 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a  ield.  Or.    **
1ea60 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66            we ref
1ea70 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20  erence multiple 
1ea80 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f  rows using a "ro
1ea90 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20  wid IN (...)".  
1eaa0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f    **          co
1eab0 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a  nstruct..    */.
1eac0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
1ead0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d  p->u.btree.nEq==
1eae0 31 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61 73  1 );.    iReleas
1eaf0 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  eReg = sqlite3Ge
1eb00 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
1eb10 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c  ;.    pTerm = pL
1eb20 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a  oop->aLTerm[0];.
1eb30 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1eb40 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
1eb50 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
1eb60 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1eb70 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
1eb80 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1eb90 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1eba0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1ebb0 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67 20  ;.    iRowidReg 
1ebc0 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  = codeEqualityTe
1ebd0 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
1ebe0 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65  , pLevel, 0, bRe
1ebf0 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b  v, iReleaseReg);
1ec00 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70  .    addrNxt = p
1ec10 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
1ec20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ec30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
1ec40 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67  BeInt, iRowidReg
1ec50 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
1ec60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ec70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
1ec80 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74  s, iCur, addrNxt
1ec90 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1eca0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1ecb0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1ecc0 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64 52  (pParse, iRowidR
1ecd0 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  eg, 1);.    sqli
1ece0 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1ecf0 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
1ed00 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
1ed10 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1ed20 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
1ed30 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1ed40 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Noop;.  }else if
1ed50 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1ed60 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d  s & WHERE_IPK)!=
1ed70 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
1ed80 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1ed90 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
1eda0 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  GE)!=0.  ){.    
1edb0 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20 68  /* Case 3:  We h
1edc0 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74  ave an inequalit
1edd0 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
1ede0 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
1edf0 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ield..    */.   
1ee00 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50   int testOp = OP
1ee10 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73  _Noop;.    int s
1ee20 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65  tart;.    int me
1ee30 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20  mEndValue = 0;. 
1ee40 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53     WhereTerm *pS
1ee50 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20  tart, *pEnd;..  
1ee60 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
1ee70 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a 20  ble==0 );.    j 
1ee80 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20  = 0;.    pStart 
1ee90 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20  = pEnd = 0;.    
1eea0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1eeb0 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
1eec0 49 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d 20  IMIT ) pStart = 
1eed0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
1eee0 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f  +];.    if( pLoo
1eef0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1ef00 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70  RE_TOP_LIMIT ) p
1ef10 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  End = pLoop->aLT
1ef20 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73  erm[j++];.    as
1ef30 73 65 72 74 28 20 70 53 74 61 72 74 21 3d 30 20  sert( pStart!=0 
1ef40 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20  || pEnd!=0 );.  
1ef50 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20    if( bRev ){.  
1ef60 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61      pTerm = pSta
1ef70 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74  rt;.      pStart
1ef80 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70   = pEnd;.      p
1ef90 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  End = pTerm;.   
1efa0 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61 72   }.    if( pStar
1efb0 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  t ){.      Expr 
1efc0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
1efd0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
1efe0 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  on that defines 
1eff0 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20  the start bound 
1f000 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c  */.      int r1,
1f010 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f   rTemp;        /
1f020 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72 20  * Registers for 
1f030 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72  holding the star
1f040 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20  t boundary */.. 
1f050 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
1f060 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d  owing constant m
1f070 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20  aps TK_xx codes 
1f080 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69  into correspondi
1f090 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65  ng .      ** see
1f0a0 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64  k opcodes.  It d
1f0b0 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74  epends on a part
1f0c0 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20  icular ordering 
1f0d0 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a  of TK_xx.      *
1f0e0 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  /.      const u8
1f0f0 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20   aMoveOp[] = {. 
1f100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1f110 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74  GT */  OP_SeekGt
1f120 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
1f130 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_LE */  OP_See
1f140 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kLe,.           
1f150 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f  /* TK_LT */  OP_
1f160 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20  SeekLt,.        
1f170 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20     /* TK_GE */  
1f180 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20 20  OP_SeekGe.      
1f190 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  };.      assert(
1f1a0 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20   TK_LE==TK_GT+1 
1f1b0 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  );      /* Make 
1f1c0 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e  sure the orderin
1f1d0 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  g.. */.      ass
1f1e0 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
1f1f0 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20  T+2 );      /*  
1f200 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78  ... of the TK_xx
1f210 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20   values... */.  
1f220 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
1f230 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20  E==TK_GT+3 );   
1f240 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f     /*  ... is co
1f250 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20  rrecct. */..    
1f260 20 20 61 73 73 65 72 74 28 20 28 70 53 74 61 72    assert( (pStar
1f270 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
1f280 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20  M_VNULL)==0 );. 
1f290 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1f2a0 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
1f2b0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1f2c0 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61  .      pX = pSta
1f2d0 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rt->pExpr;.     
1f2e0 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
1f2f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f300 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75  ( pStart->leftCu
1f310 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a  rsor!=iCur ); /*
1f320 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73   transitive cons
1f330 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
1f340 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f350 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f360 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72  , pX->pRight, &r
1f370 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
1f380 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1f390 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70  , aMoveOp[pX->op
1f3a0 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61  -TK_GT], iCur, a
1f3b0 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  ddrBrk, r1);.   
1f3c0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1f3d0 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
1f3e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f3f0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1f400 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a  pParse, r1, 1);.
1f410 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1f420 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1f430 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20 20  se, rTemp);.    
1f440 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1f450 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20  evel, pStart);. 
1f460 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f470 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f480 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
1f490 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
1f4a0 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b   iCur, addrBrk);
1f4b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1f4c0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
1f4d0 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58 20  r *pX;.      pX 
1f4e0 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20  = pEnd->pExpr;. 
1f4f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
1f500 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1f510 72 74 28 20 28 70 45 6e 64 2d 3e 77 74 46 6c 61  rt( (pEnd->wtFla
1f520 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
1f530 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1f540 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 6c 65 66  tcase( pEnd->lef
1f550 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b  tCursor!=iCur );
1f560 20 2f 2a 20 54 72 61 6e 73 69 74 69 76 65 20 63   /* Transitive c
1f570 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
1f580 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
1f590 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1f5a0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1f5b0 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20      memEndValue 
1f5c0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1f5d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f5e0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1f5f0 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45  pX->pRight, memE
1f600 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  ndValue);.      
1f610 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  if( pX->op==TK_L
1f620 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  T || pX->op==TK_
1f630 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  GT ){.        te
1f640 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
1f650 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20  _Le : OP_Ge;.   
1f660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f670 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
1f680 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b  ? OP_Lt : OP_Gt;
1f690 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
1f6a0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1f6b0 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a  l, pEnd);.    }.
1f6c0 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
1f6d0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1f6e0 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65  dr(v);.    pLeve
1f6f0 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f  l->op = bRev ? O
1f700 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
1f710 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
1f720 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
1f730 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b  vel->p2 = start;
1f740 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65  .    assert( pLe
1f750 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20  vel->p5==0 );.  
1f760 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50    if( testOp!=OP
1f770 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69  _Noop ){.      i
1f780 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65  RowidReg = iRele
1f790 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33  aseReg = sqlite3
1f7a0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
1f7b0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1f7c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1f7d0 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69  P_Rowid, iCur, i
1f7e0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1f7f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f800 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1f810 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1f820 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1f830 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1f840 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61  testOp, memEndVa
1f850 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52  lue, addrBrk, iR
1f860 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1f870 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1f880 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46  eP5(v, SQLITE_AF
1f890 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49  F_NUMERIC | SQLI
1f8a0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1f8b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1f8c0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1f8d0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
1f8e0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1f8f0 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20  4: A scan using 
1f900 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  an index..    **
1f910 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f920 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1f930 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72   may contain zer
1f940 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69  o or more equali
1f950 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ty .    **      
1f960 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f     terms ("==" o
1f970 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  r "IN" operators
1f980 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  ) that refer to 
1f990 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20  the N.    **    
1f9a0 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63       left-most c
1f9b0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
1f9c0 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f  dex. It may also
1f9d0 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20   contain.    ** 
1f9e0 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69          inequali
1f9f0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  ty constraints (
1fa00 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20  >, <, >= or <=) 
1fa10 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20  on the indexed. 
1fa20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
1fa30 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69  lumn that immedi
1fa40 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68  ately follows th
1fa50 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20  e N equalities. 
1fa60 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  Only .    **    
1fa70 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d       the right-m
1fa80 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  ost column can b
1fa90 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
1faa0 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a  - the rest must.
1fab0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75      **         u
1fac0 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20  se the "==" and 
1fad0 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20  "IN" operators. 
1fae0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1faf0 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  the .    **     
1fb00 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20      index is on 
1fb10 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68  (x,y,z), then th
1fb20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75  e following clau
1fb30 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20  ses are all .   
1fb40 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69   **         opti
1fb50 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20  mized:.    **.  
1fb60 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1fb70 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  x=5.    **      
1fb80 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
1fb90 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1fba0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31       x=5 AND y<1
1fbb0 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1fbc0 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20      x=5 AND y>5 
1fbd0 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
1fbe0 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1fbf0 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30  ND y=5 AND z<=10
1fc00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1fc10 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20         The z<10 
1fc20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c  term of the foll
1fc30 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20  owing cannot be 
1fc40 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a  used, only.    *
1fc50 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d  *         the x=
1fc60 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20  5 term:.    **. 
1fc70 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1fc80 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20   x=5 AND z<10.  
1fc90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1fca0 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72      N may be zer
1fcb0 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  o if there are i
1fcc0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1fcd0 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20  aints..    **   
1fce0 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61        If there a
1fcf0 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79  re no inequality
1fd00 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
1fd10 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a  en N is at.    *
1fd20 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20  *         least 
1fd30 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  one..    **.    
1fd40 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20  **         This 
1fd50 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65  case is also use
1fd60 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  d when there are
1fd70 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
1fd80 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1fd90 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20  constraints but 
1fda0 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65  an index is sele
1fdb0 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20  cted anyway, in 
1fdc0 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20  order.    **    
1fdd0 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68       to force th
1fde0 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74  e output order t
1fdf0 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20  o conform to an 
1fe00 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f  ORDER BY..    */
1fe10 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f    .    static co
1fe20 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b  nst u8 aStartOp[
1fe30 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20  ] = {.      0,. 
1fe40 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50       0,.      OP
1fe50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20  _Rewind,        
1fe60 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74     /* 2: (!start
1fe70 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1fe80 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65  startEq &&  !bRe
1fe90 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c  v) */.      OP_L
1fea0 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ast,            
1feb0 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63   /* 3: (!start_c
1fec0 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74  onstraints && st
1fed0 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29  artEq &&   bRev)
1fee0 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1fef0 6b 47 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGt,           /
1ff00 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 4: (start_cons
1ff10 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
1ff20 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
1ff30 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
1ff40 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
1ff50 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  5: (start_constr
1ff60 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74  aints  && !start
1ff70 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
1ff80 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c        OP_SeekGe,
1ff90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a             /* 6:
1ffa0 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1ffb0 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
1ffc0 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
1ffd0 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20      OP_SeekLe   
1ffe0 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28           /* 7: (
1fff0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
20000 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26  s  &&  startEq &
20010 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
20020 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  };.    static co
20030 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20  nst u8 aEndOp[] 
20040 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f  = {.      OP_Noo
20050 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
20060 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74  * 0: (!end_const
20070 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20  raints) */.     
20080 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20   OP_IdxGE,      
20090 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64        /* 1: (end
200a0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
200b0 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
200c0 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20 20  OP_IdxLT        
200d0 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f       /* 2: (end_
200e0 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 62  constraints && b
200f0 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
20100 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f     int nEq = pLo
20110 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
20120 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d    /* Number of =
20130 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f  = or IN terms */
20140 0a 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75  .    int isMinQu
20150 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ery = 0;        
20160 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
20170 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53  s an optimized S
20180 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a  ELECT min(x).. *
20190 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61 73  /.    int regBas
201a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
201b0 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73     /* Base regis
201c0 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73  ter holding cons
201d0 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f  traint values */
201e0 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20 20 20  .    int r1;    
201f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20200 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74    /* Temp regist
20210 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  er */.    WhereT
20220 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74  erm *pRangeStart
20230 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61   = 0;  /* Inequa
20240 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
20250 61 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a  at range start *
20260 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
20270 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20  *pRangeEnd = 0; 
20280 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79     /* Inequality
20290 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
202a0 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20  ange end */.    
202b0 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20  int startEq;    
202c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
202d0 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74  True if range st
202e0 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  art uses ==, >= 
202f0 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74  or <= */.    int
20300 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20   endEq;         
20310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
20320 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75  e if range end u
20330 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d  ses ==, >= or <=
20340 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
20350 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20  t_constraints;  
20360 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
20370 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72   range is constr
20380 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  ained */.    int
20390 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20   nConstraint;   
203a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
203b0 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  ber of constrain
203c0 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49  t terms */.    I
203d0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
203e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
203f0 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c  he index we will
20400 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20   be using */.   
20410 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20   int iIdxCur;   
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20430 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
20440 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a   for the index *
20450 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61  /.    int nExtra
20460 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
20470 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20480 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
20490 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e  needed */.    in
204a0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
204b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
204c0 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65  struction opcode
204d0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
204e0 74 61 72 74 41 66 66 3b 20 20 20 20 20 20 20 20  tartAff;        
204f0 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
20500 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61   for start of ra
20510 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  nge constraint *
20520 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64  /.    char *zEnd
20530 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
20540 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66     /* Affinity f
20550 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20  or end of range 
20560 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20  constraint */.. 
20570 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d     pIdx = pLoop-
20580 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
20590 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70  .    iIdxCur = p
205a0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
205b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
205c0 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61  loop satisfies a
205d0 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72   sort order (pOr
205e0 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74  derBy) request t
205f0 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20  hat .    ** was 
20600 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
20610 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65  unction to imple
20620 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d  ment a "SELECT m
20630 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20  in(x) ..." .    
20640 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74  ** query, then t
20650 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
20660 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f  nly allow the lo
20670 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20  op to run for.  
20680 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74    ** a single it
20690 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  eration. This me
206a0 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72  ans that the fir
206b0 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a  st row returned.
206c0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f      ** should no
206d0 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61  t have a NULL va
206e0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78  lue stored in 'x
206f0 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27  '. If column 'x'
20700 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66   is.    ** the f
20710 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74  irst one after t
20720 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20  he nEq equality 
20730 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
20740 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a  he index,.    **
20750 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73   this requires s
20760 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ome special hand
20770 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ling..    */.   
20780 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
20790 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
207a0 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20  RDERBY_MIN)!=0. 
207b0 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
207c0 62 4f 42 53 61 74 21 3d 30 29 0a 20 20 20 20 20  bOBSat!=0).     
207d0 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  && (pIdx->nColum
207e0 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  n>nEq).    ){.  
207f0 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
20800 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
20810 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  1 ); */.      /*
20820 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
20830 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69  y->a[0].pExpr->i
20840 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
20850 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a  Column[nEq] ); *
20860 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65  /.      isMinQue
20870 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45  ry = 1;.      nE
20880 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
20890 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
208a0 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63  any inequality c
208b0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
208c0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e  for the start an
208d0 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66  d end .    ** of
208e0 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20   the range. .   
208f0 20 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b   */.    j = nEq;
20900 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
20910 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
20920 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
20930 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d     pRangeStart =
20940 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
20950 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  ++];.      nExtr
20960 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
20970 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
20980 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
20990 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
209a0 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c    pRangeEnd = pL
209b0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
209c0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
209d0 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
209e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
209f0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
20a00 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ll constraint te
20a10 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20  rms using == or 
20a20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74  IN.    ** and st
20a30 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ore the values o
20a40 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e  f those terms in
20a50 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
20a60 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
20a70 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73  arting at regBas
20a80 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  e..    */.    re
20a90 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45  gBase = codeAllE
20aa0 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61  qualityTerms(pPa
20ab0 72 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c  rse,pLevel,bRev,
20ac0 6e 45 78 74 72 61 52 65 67 2c 26 7a 53 74 61 72  nExtraReg,&zStar
20ad0 74 41 66 66 29 3b 0a 20 20 20 20 7a 45 6e 64 41  tAff);.    zEndA
20ae0 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ff = sqlite3DbSt
20af0 72 44 75 70 28 64 62 2c 20 7a 53 74 61 72 74 41  rDup(db, zStartA
20b00 66 66 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  ff);.    addrNxt
20b10 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
20b20 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  xt;..    /* If w
20b30 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65  e are doing a re
20b40 76 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e  verse order scan
20b50 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67   on an ascending
20b60 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a   index, or.    *
20b70 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65  * a forward orde
20b80 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63  r scan on a desc
20b90 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e  ending index, in
20ba0 74 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20  terchange the . 
20bb0 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20     ** start and 
20bc0 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67  end terms (pRang
20bd0 65 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67  eStart and pRang
20be0 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  eEnd)..    */.  
20bf0 20 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78 2d    if( (nEq<pIdx-
20c00 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 62 52 65 76  >nColumn && bRev
20c10 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  ==(pIdx->aSortOr
20c20 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45  der[nEq]==SQLITE
20c30 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20 7c  _SO_ASC)).     |
20c40 7c 20 28 62 52 65 76 20 26 26 20 70 49 64 78 2d  | (bRev && pIdx-
20c50 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6e 45 71 29 0a 20  >nColumn==nEq). 
20c60 20 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50     ){.      SWAP
20c70 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52  (WhereTerm *, pR
20c80 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53  angeEnd, pRangeS
20c90 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  tart);.    }..  
20ca0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
20cb0 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e  geStart && (pRan
20cc0 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
20cd0 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29  or & WO_LE)!=0 )
20ce0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
20cf0 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28  pRangeStart && (
20d00 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
20d10 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21  erator & WO_GE)!
20d20 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
20d30 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26  se( pRangeEnd &&
20d40 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70   (pRangeEnd->eOp
20d50 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21  erator & WO_LE)!
20d60 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
20d70 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26  se( pRangeEnd &&
20d80 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70   (pRangeEnd->eOp
20d90 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21  erator & WO_GE)!
20da0 3d 30 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45  =0 );.    startE
20db0 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74  q = !pRangeStart
20dc0 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d   || pRangeStart-
20dd0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
20de0 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20  _LE|WO_GE);.    
20df0 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67  endEq =   !pRang
20e00 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e  eEnd || pRangeEn
20e10 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  d->eOperator & (
20e20 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20  WO_LE|WO_GE);.  
20e30 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69    start_constrai
20e40 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72  nts = pRangeStar
20e50 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20  t || nEq>0;..   
20e60 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64   /* Seek the ind
20e70 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  ex cursor to the
20e80 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 61   start of the ra
20e90 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e  nge. */.    nCon
20ea0 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20  straint = nEq;. 
20eb0 20 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61     if( pRangeSta
20ec0 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
20ed0 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
20ee0 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70  eStart->pExpr->p
20ef0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c  Right;.      sql
20f00 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
20f10 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67  rse, pRight, reg
20f20 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
20f30 20 69 66 28 20 28 70 52 61 6e 67 65 53 74 61 72   if( (pRangeStar
20f40 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
20f50 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  M_VNULL)==0 ){. 
20f60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20f70 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70  prCodeIsNullJump
20f80 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  (v, pRight, regB
20f90 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74  ase+nEq, addrNxt
20fa0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20fb0 20 69 66 28 20 7a 53 74 61 72 74 41 66 66 20 29   if( zStartAff )
20fc0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
20fd0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
20fe0 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 53 74  nity(pRight, zSt
20ff0 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51  artAff[nEq])==SQ
21000 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a  LITE_AFF_NONE){.
21010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
21020 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ce the compariso
21030 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f  n is to be perfo
21040 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e  rmed with no con
21050 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20  versions.       
21060 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f     ** applied to
21070 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73   the operands, s
21080 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  et the affinity 
21090 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67  to apply to pRig
210a0 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20  ht to .         
210b0 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   ** SQLITE_AFF_N
210c0 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ONE.  */.       
210d0 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71     zStartAff[nEq
210e0 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
210f0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
21100 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
21110 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
21120 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67  inityChange(pRig
21130 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  ht, zStartAff[nE
21140 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  q]) ){.         
21150 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20   zStartAff[nEq] 
21160 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
21170 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
21180 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f     }  .      nCo
21190 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
211a0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
211b0 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  geStart->wtFlags
211c0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
211d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
211e0 20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20   isMinQuery ){. 
211f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21200 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
21210 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45  l, 0, regBase+nE
21220 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  q);.      nConst
21230 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  raint++;.      s
21240 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20  tartEq = 0;.    
21250 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69    start_constrai
21260 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nts = 1;.    }. 
21270 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
21280 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
21290 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
212a0 74 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  t, zStartAff);. 
212b0 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70     op = aStartOp
212c0 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  [(start_constrai
212d0 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74  nts<<2) + (start
212e0 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a  Eq<<1) + bRev];.
212f0 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d      assert( op!=
21300 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
21310 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  e( op==OP_Rewind
21320 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
21330 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b  ( op==OP_Last );
21340 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
21350 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a  p==OP_SeekGt );.
21360 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
21370 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20  ==OP_SeekGe );. 
21380 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
21390 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20  =OP_SeekLe );.  
213a0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
213b0 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20  OP_SeekLt );.   
213c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
213d0 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64  p4Int(v, op, iId
213e0 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  xCur, addrNxt, r
213f0 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
21400 69 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  int);..    /* Lo
21410 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ad the value for
21420 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
21430 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68  constraint at th
21440 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
21450 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e   ** range (if an
21460 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  y)..    */.    n
21470 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
21480 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
21490 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
214a0 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e  r *pRight = pRan
214b0 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52  geEnd->pExpr->pR
214c0 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
214d0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
214e0 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ve(pParse, regBa
214f0 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20  se+nEq, 1);.    
21500 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
21510 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
21520 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
21530 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67        if( (pRang
21540 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  eEnd->wtFlags & 
21550 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
21560 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21570 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
21580 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72  ump(v, pRight, r
21590 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72  egBase+nEq, addr
215a0 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Nxt);.      }.  
215b0 20 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20      if( zEndAff 
215c0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
215d0 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
215e0 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 45  inity(pRight, zE
215f0 6e 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c  ndAff[nEq])==SQL
21600 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20  ITE_AFF_NONE){. 
21610 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63           /* Sinc
21620 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
21630 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72   is to be perfor
21640 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76  med with no conv
21650 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20  ersions.        
21660 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20    ** applied to 
21670 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65  the operands, se
21680 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
21690 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68  o apply to pRigh
216a0 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20  t to .          
216b0 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
216c0 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  NE.  */.        
216d0 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d    zEndAff[nEq] =
216e0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
216f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21700 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
21710 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
21720 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
21730 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29   zEndAff[nEq]) )
21740 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64  {.          zEnd
21750 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
21760 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
21770 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a      }.      }  .
21780 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41        codeApplyA
21790 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
217a0 72 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20  regBase, nEq+1, 
217b0 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20  zEndAff);.      
217c0 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
217d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
217e0 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67  RangeEnd->wtFlag
217f0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
21800 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
21810 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21820 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
21830 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
21840 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20  , zEndAff);..   
21850 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c   /* Top of the l
21860 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20  oop body */.    
21870 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c  pLevel->p2 = sql
21880 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
21890 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  ddr(v);..    /* 
218a0 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64  Check if the ind
218b0 65 78 20 63 75 72 73 6f 72 20 69 73 20 70 61 73  ex cursor is pas
218c0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
218d0 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f   range. */.    o
218e0 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e  p = aEndOp[(pRan
218f0 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20  geEnd || nEq) * 
21900 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20  (1 + bRev)];.   
21910 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
21920 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65  P_Noop );.    te
21930 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49  stcase( op==OP_I
21940 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74  dxGE );.    test
21950 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
21960 4c 54 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70  LT );.    if( op
21970 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
21980 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21990 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69  dOp4Int(v, op, i
219a0 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  IdxCur, addrNxt,
219b0 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
219c0 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  raint);.      sq
219d0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
219e0 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65 76  5(v, endEq!=bRev
219f0 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20   ?1:0);.    }.. 
21a00 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
21a10 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  re inequality co
21a20 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63 6b  nstraints, check
21a30 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 0a   that the value.
21a40 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61      ** of the ta
21a50 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ble column that 
21a60 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
21a70 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74 20  ontrains is not 
21a80 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20  NULL..    ** If 
21a90 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74  it is, jump to t
21aa0 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
21ab0 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20  n of the loop.. 
21ac0 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73     */.    r1 = s
21ad0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
21ae0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74 65  (pParse);.    te
21af0 73 74 63 61 73 65 28 20 70 4c 6f 6f 70 2d 3e 77  stcase( pLoop->w
21b00 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
21b10 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20  TM_LIMIT );.    
21b20 74 65 73 74 63 61 73 65 28 20 70 4c 6f 6f 70 2d  testcase( pLoop-
21b30 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
21b40 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  _TOP_LIMIT );.  
21b50 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
21b60 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42  Flags & (WHERE_B
21b70 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
21b80 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b  OP_LIMIT))!=0 ){
21b90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21ba0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
21bb0 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
21bc0 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  nEq, r1);.      
21bd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21be0 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
21bf0 72 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20  r1, addrCont);. 
21c00 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
21c10 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
21c20 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20  Parse, r1);..   
21c30 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62   /* Seek the tab
21c40 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65  le cursor, if re
21c50 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69  quired */.    di
21c60 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
21c70 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
21c80 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
21c90 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e  pLevel, pRangeEn
21ca0 64 29 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69  d);.    if( !omi
21cb0 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  tTable ){.      
21cc0 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c  iRowidReg = iRel
21cd0 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
21ce0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
21cf0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
21d00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21d10 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
21d20 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  xCur, iRowidReg)
21d30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
21d40 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
21d50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
21d60 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
21d70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21d80 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20  Op2(v, OP_Seek, 
21d90 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
21da0 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73  ;  /* Deferred s
21db0 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  eek */.    }..  
21dc0 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
21dd0 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64  instruction used
21de0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
21df0 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20  e loop. Disable 
21e00 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c  .    ** WHERE cl
21e10 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20  ause terms made 
21e20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65  redundant by the
21e30 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61   index range sca
21e40 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
21e50 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
21e60 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20   & WHERE_ONEROW 
21e70 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
21e80 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  >op = OP_Noop;. 
21e90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65     }else if( bRe
21ea0 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  v ){.      pLeve
21eb0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b  l->op = OP_Prev;
21ec0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21ed0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
21ee0 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  P_Next;.    }.  
21ef0 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
21f00 49 64 78 43 75 72 3b 0a 20 20 20 20 69 66 28 20  IdxCur;.    if( 
21f10 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
21f20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49  & WHERE_CONSTRAI
21f30 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  NT)==0 ){.      
21f40 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c  pLevel->p5 = SQL
21f50 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
21f60 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20  ULLSCAN_STEP;.  
21f70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
21f80 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
21f90 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  5==0 );.    }.  
21fa0 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
21fb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
21fc0 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
21fd0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
21fe0 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
21ff0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
22000 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20  5:  Two or more 
22010 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78  separately index
22020 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
22030 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a  ed by OR.    **.
22040 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
22050 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
22060 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
22070 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a  a,b,c,d);.    **
22080 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
22090 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20  i1 ON t1(a);.   
220a0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
220b0 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a  EX i2 ON t1(b);.
220c0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
220d0 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63  INDEX i3 ON t1(c
220e0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
220f0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
22100 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52   t1 WHERE a=5 OR
22110 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e   b=7 OR (c=11 AN
22120 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20  D d=13).    **. 
22130 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61     ** In the exa
22140 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20  mple, there are 
22150 74 68 72 65 65 20 69 6e 64 65 78 65 64 20 74 65  three indexed te
22160 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
22170 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20   OR..    ** The 
22180 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  top of the loop 
22190 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
221a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
221b0 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20          Null    
221c0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
221d0 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72      # Zero the r
221e0 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20  owset in reg 1. 
221f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
22200 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  n, for each inde
22210 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f  xed term, the fo
22220 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67  llowing. The arg
22230 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a  uments to.    **
22240 20 52 6f 77 53 65 74 54 65 73 74 20 61 72 65 20   RowSetTest are 
22250 73 75 63 68 20 74 68 61 74 20 74 68 65 20 72 6f  such that the ro
22260 77 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  wid of the curre
22270 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74  nt row is insert
22280 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  ed.    ** into t
22290 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74  he RowSet. If it
222a0 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
222b0 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69  ent, control ski
222c0 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f  ps the.    ** Go
222d0 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a  sub opcode and j
222e0 75 6d 70 73 20 73 74 72 61 69 67 68 74 20 74 6f  umps straight to
222f0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
22300 74 65 64 20 62 79 20 57 68 65 72 65 45 6e 64 28  ted by WhereEnd(
22310 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
22320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
22330 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e  hereBegin(<term>
22340 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ).    **        
22350 20 20 52 6f 77 53 65 74 54 65 73 74 20 20 20 20    RowSetTest    
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
22370 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74  Insert rowid int
22380 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20  o rowset.    ** 
22390 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 20           Gosub  
223a0 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20      2 A.    **  
223b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
223c0 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20  reEnd().    **. 
223d0 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20     ** Following 
223e0 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20  the above, code 
223f0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
22400 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20   loop. Label A, 
22410 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a  the target.    *
22420 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61  * of the Gosub a
22430 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74  bove, jumps to t
22440 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72  he instruction r
22450 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 47  ight after the G
22460 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oto..    **.    
22470 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c  **          Null
22480 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
22490 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74          # Zero t
224a0 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67  he rowset in reg
224b0 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   1.    **       
224c0 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20     Goto       B 
224d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
224e0 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e   The loop is fin
224f0 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  ished..    **.  
22500 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c    **       A: <l
22510 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20  oop body>       
22520 20 20 20 20 20 20 20 20 20 20 23 20 52 65 74 75            # Retu
22530 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76 65  rn data, whateve
22540 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
22550 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
22560 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
22570 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63        # Jump bac
22580 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20  k to the Gosub. 
22590 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
225a0 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65     B: <after the
225b0 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20   loop>.    **.  
225c0 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43 6c    */.    WhereCl
225d0 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20  ause *pOrWc;    
225e0 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73 65  /* The OR-clause
225f0 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f   broken out into
22600 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20   subterms */.   
22610 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54 61 62   SrcList *pOrTab
22620 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74  ;       /* Short
22630 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74 20  ened table list 
22640 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e  or OR-clause gen
22650 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49  eration */.    I
22660 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20  ndex *pCov = 0; 
22670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
22680 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e  otential coverin
22690 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c  g index (or NULL
226a0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  ) */.    int iCo
226b0 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  vCur = pParse->n
226c0 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f  Tab++;  /* Curso
226d0 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78  r used for index
226e0 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79 29 20   scans (if any) 
226f0 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67 52  */..    int regR
22700 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
22710 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  ->nMem;         
22720 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75 73    /* Register us
22730 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75 62  ed with OP_Gosub
22740 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
22750 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20  owset = 0;      
22760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22770 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
22780 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20  r RowSet object 
22790 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f  */.    int regRo
227a0 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wid = 0;        
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227c0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
227d0 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20  ding rowid */.  
227e0 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20    int iLoopBody 
227f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
22800 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53  eLabel(v);  /* S
22810 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64  tart of loop bod
22820 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65  y */.    int iRe
22830 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  tInit;          
22840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22850 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
22860 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74 20   regReturn init 
22870 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65 73  */.    int untes
22880 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20 20  tedTerms = 0;   
22890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d            /* Som
228a0 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70  e terms not comp
228b0 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a 2f  letely tested */
228c0 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
228d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
228f0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 45  counter */.    E
22900 78 70 72 20 2a 70 41 6e 64 45 78 70 72 20 3d 20  xpr *pAndExpr = 
22910 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
22920 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20    /* An ".. AND 
22930 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f  (...)" expressio
22940 6e 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70 54 65  n */.   .    pTe
22950 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rm = pLoop->aLTe
22960 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72  rm[0];.    asser
22970 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
22980 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
22990 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
229a0 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _OR );.    asser
229b0 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  t( (pTerm->wtFla
229c0 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  gs & TERM_ORINFO
229d0 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57  )!=0 );.    pOrW
229e0 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f  c = &pTerm->u.pO
229f0 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70  rInfo->wc;.    p
22a00 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52  Level->op = OP_R
22a10 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65  eturn;.    pLeve
22a20 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72  l->p1 = regRetur
22a30 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75  n;..    /* Set u
22a40 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  p a new SrcList 
22a50 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69  in pOrTab contai
22a60 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62  ning the table b
22a70 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20  eing scanned.   
22a80 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70   ** by this loop
22a90 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f   in the a[0] slo
22aa0 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61  t and all notRea
22ab0 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31  dy tables in a[1
22ac0 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a  ..] slots..    *
22ad0 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74  * This becomes t
22ae0 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68  he SrcList in th
22af0 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
22b00 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
22b10 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a  Begin()..    */.
22b20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
22b30 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20  nLevel>1 ){.    
22b40 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b    int nNotReady;
22b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b60 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
22b70 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  f notReady table
22b80 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  s */.      struc
22b90 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
22ba0 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20  origSrc;     /* 
22bb0 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66  Original list of
22bc0 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20   tables */.     
22bd0 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49   nNotReady = pWI
22be0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c  nfo->nLevel - iL
22bf0 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20  evel - 1;.      
22c00 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33  pOrTab = sqlite3
22c10 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62  StackAllocRaw(db
22c20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
22c40 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e  zeof(*pOrTab)+ n
22c50 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28  NotReady*sizeof(
22c60 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a  pOrTab->a[0]));.
22c70 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62        if( pOrTab
22c80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74  ==0 ) return not
22c90 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72  Ready;.      pOr
22ca0 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75  Tab->nAlloc = (u
22cb0 38 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31  8)(nNotReady + 1
22cc0 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d  );.      pOrTab-
22cd0 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e  >nSrc = pOrTab->
22ce0 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65  nAlloc;.      me
22cf0 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20  mcpy(pOrTab->a, 
22d00 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66  pTabItem, sizeof
22d10 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20  (*pTabItem));.  
22d20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57      origSrc = pW
22d30 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
22d40 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31  a;.      for(k=1
22d50 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20  ; k<=nNotReady; 
22d60 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  k++){.        me
22d70 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b  mcpy(&pOrTab->a[
22d80 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65  k], &origSrc[pLe
22d90 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73  vel[k].iFrom], s
22da0 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b  izeof(pOrTab->a[
22db0 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  k]));.      }.  
22dc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
22dd0 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  OrTab = pWInfo->
22de0 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a  pTabList;.    }.
22df0 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
22e00 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65  ze the rowset re
22e10 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69  gister to contai
22e20 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e  n NULL. An SQL N
22e30 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65  ULL is .    ** e
22e40 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20  quivalent to an 
22e50 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20 20  empty rowset..  
22e60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
22e70 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52   initialize regR
22e80 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e  eturn to contain
22e90 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
22ea0 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
22eb0 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74  .    ** immediat
22ec0 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
22ed0 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74  e OP_Return at t
22ee0 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
22ef0 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20   loop. This.    
22f00 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 69  ** is required i
22f10 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72 65 20  n a few obscure 
22f20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20  LEFT JOIN cases 
22f30 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75  where control ju
22f40 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20  mps.    ** over 
22f50 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  the top of the l
22f60 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64  oop into the bod
22f70 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73  y of it. In this
22f80 20 63 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a   case the .    *
22f90 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e  * correct respon
22fa0 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f  se for the end-o
22fb0 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65  f-loop code (the
22fc0 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74   OP_Return) is t
22fd0 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74  o .    ** fall t
22fe0 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
22ff0 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20  xt instruction, 
23000 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65  just as an OP_Ne
23010 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a  xt does if.    *
23020 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75  * called on an u
23030 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72  ninitialized cur
23040 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  sor..    */.    
23050 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
23060 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
23070 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d  DUPLICATES_OK)==
23080 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f  0 ){.      regRo
23090 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  wset = ++pParse-
230a0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
230b0 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
230c0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
230d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
230e0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
230f0 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d  egRowset);.    }
23100 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20  .    iRetInit = 
23110 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23120 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
23130 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a   0, regReturn);.
23140 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
23150 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
23160 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68 65  ause is z of the
23170 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20 78   form:  (x1 OR x
23180 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a  2 OR ...) AND y.
23190 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20      ** Then for 
231a0 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20 65  every term xN, e
231b0 76 61 6c 75 61 74 65 20 61 73 20 74 68 65 20 73  valuate as the s
231c0 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e  ubexpression: xN
231d0 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68   AND z.    ** Th
231e0 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69 6e  at way, terms in
231f0 20 79 20 74 68 61 74 20 61 72 65 20 66 61 63 74   y that are fact
23200 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64 69  ored into the di
23210 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20  sjunction will. 
23220 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64 20     ** be picked 
23230 75 70 20 62 79 20 74 68 65 20 72 65 63 75 72 73  up by the recurs
23240 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ive calls to sql
23250 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
23260 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20   below..    **. 
23270 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20     ** Actually, 
23280 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69  each subexpressi
23290 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20  on is converted 
232a0 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77 68  to "xN AND w" wh
232b0 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a 20  ere w is.    ** 
232c0 74 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e 67  the "interesting
232d0 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74  " terms of z - t
232e0 65 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e 6f  erms that did no
232f0 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
23300 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20  he.    ** ON or 
23310 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
23320 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64  a LEFT JOIN, and
23330 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20   terms that are 
23340 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20 2a  usable as .    *
23350 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  * indices..    *
23360 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 70  *.    ** This op
23370 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f 20  timization also 
23380 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69 66 20  only applies if 
23390 74 68 65 20 28 78 31 20 4f 52 20 78 32 20 4f 52  the (x1 OR x2 OR
233a0 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20 2a   ...) term.    *
233b0 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  * is not contain
233c0 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ed in the ON cla
233d0 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
233e0 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  IN..    ** See t
233f0 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77 77  icket http://www
23400 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
23410 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65 34 0a  info/f2369304e4.
23420 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
23430 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20  WC->nTerm>1 ){. 
23440 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a       int iTerm;.
23450 20 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d 3d        for(iTerm=
23460 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54  0; iTerm<pWC->nT
23470 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20  erm; iTerm++){. 
23480 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
23490 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72  pr = pWC->a[iTer
234a0 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m].pExpr;.      
234b0 20 20 69 66 28 20 26 70 57 43 2d 3e 61 5b 69 54    if( &pWC->a[iT
234c0 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d 20 29 20  erm] == pTerm ) 
234d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
234e0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
234f0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
23500 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74  FromJoin) ) cont
23510 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
23520 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  ( pWC->a[iTerm].
23530 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
23540 4f 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74 69 6e  ORINFO) ) contin
23550 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
23560 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65  (pWC->a[iTerm].e
23570 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
23580 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  L)==0 ) continue
23590 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20  ;.        pExpr 
235a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
235b0 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
235c0 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
235d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
235e0 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72 2c 20  d(db, pAndExpr, 
235f0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
23600 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
23610 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  pr ){.        pA
23620 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ndExpr = sqlite3
23630 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
23640 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45 78 70  _AND, 0, pAndExp
23650 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
23660 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69     }..    for(ii
23670 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54  =0; ii<pOrWc->nT
23680 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  erm; ii++){.    
23690 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
236a0 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61  Term = &pOrWc->a
236b0 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  [ii];.      if( 
236c0 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
236d0 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f  sor==iCur || (pO
236e0 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
236f0 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b   & WO_AND)!=0 ){
23700 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 49 6e  .        WhereIn
23710 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20  fo *pSubWInfo;  
23720 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20          /* Info 
23730 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65  for single OR-te
23740 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  rm scan */.     
23750 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78 70 72     Expr *pOrExpr
23760 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70   = pOrTerm->pExp
23770 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  r;.        if( p
23780 41 6e 64 45 78 70 72 20 26 26 20 21 45 78 70 72  AndExpr && !Expr
23790 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72 45  HasProperty(pOrE
237a0 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
237b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
237c0 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  AndExpr->pLeft =
237d0 20 70 4f 72 45 78 70 72 3b 0a 20 20 20 20 20 20   pOrExpr;.      
237e0 20 20 20 20 70 4f 72 45 78 70 72 20 3d 20 70 41      pOrExpr = pA
237f0 6e 64 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  ndExpr;.        
23800 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  }.        /* Loo
23810 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  p through table 
23820 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74  entries that mat
23830 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e  ch term pOrTerm.
23840 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53 75 62   */.        pSub
23850 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
23860 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
23870 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45 78 70  , pOrTab, pOrExp
23880 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  r, 0, 0,.       
23890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238a0 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
238b0 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45 5f 41  _CLOSE | WHERE_A
238c0 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20  ND_ONLY |.      
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238e0 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41    WHERE_FORCE_TA
238f0 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54  BLE | WHERE_ONET
23900 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43  ABLE_ONLY, iCovC
23910 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ur);.        ass
23920 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 20 7c  ert( pSubWInfo |
23930 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
23940 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
23950 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ed );.        if
23960 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20  ( pSubWInfo ){. 
23970 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4c 6f           WhereLo
23980 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a 20 20  op *pSubLoop;.  
23990 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 4f          explainO
239a0 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20  neScan(.        
239b0 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4f        pParse, pO
239c0 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f  rTab, &pSubWInfo
239d0 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20  ->a[0], iLevel, 
239e0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30  pLevel->iFrom, 0
239f0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
23a00 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 49          if( (pWI
23a10 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
23a20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54  & WHERE_DUPLICAT
23a30 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ES_OK)==0 ){.   
23a40 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65           int iSe
23a50 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d  t = ((ii==pOrWc-
23a60 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29  >nTerm-1)?-1:ii)
23a70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
23a80 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t r;.           
23a90 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   r = sqlite3Expr
23aa0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
23ab0 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  arse, pTabItem->
23ac0 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20  pTab, -1, iCur, 
23ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23af0 20 20 20 20 20 20 20 20 20 20 72 65 67 52 6f 77            regRow
23b00 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  id, 0);.        
23b10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23b20 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52  ddOp4Int(v, OP_R
23b30 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f  owSetTest, regRo
23b40 77 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  wset,.          
23b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23b70 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
23b80 2b 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a 20 20  +2, r, iSet);.  
23b90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23ba0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23bb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
23bc0 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c  b, regReturn, iL
23bd0 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20  oopBody);..     
23be0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62       /* The pSub
23bf0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
23c00 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20  erms flag means 
23c10 74 68 61 74 20 74 68 69 73 20 4f 52 20 74 65 72  that this OR ter
23c20 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  m.          ** c
23c30 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20  ontained one or 
23c40 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72  more AND term fr
23c50 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61  om a notReady ta
23c60 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  ble.  The.      
23c70 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f      ** terms fro
23c80 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74  m the notReady t
23c90 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  able could not b
23ca0 65 20 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c  e tested and wil
23cb0 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  l.          ** n
23cc0 65 65 64 20 74 6f 20 62 65 20 74 65 73 74 65 64  eed to be tested
23cd0 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20   later..        
23ce0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
23cf0 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  f( pSubWInfo->un
23d00 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e  testedTerms ) un
23d10 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b  testedTerms = 1;
23d20 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
23d30 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d  f all of the OR-
23d40 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
23d50 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73  are optimized us
23d60 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 20  ing the same.   
23d70 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c         ** index,
23d80 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
23d90 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74  s opened using t
23da0 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20 6e  he same cursor n
23db0 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20 20  umber.          
23dc0 2a 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c 20  ** by each call 
23dd0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
23de0 65 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20 74  egin() made by t
23df0 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79  his loop, it may
23e00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
23e10 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
23e20 20 74 68 61 74 20 69 6e 64 65 78 20 61 73 20 61   that index as a
23e30 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
23e40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
23e50 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
23e60 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
23e70 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 61 62  3WhereBegin() ab
23e80 6f 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ove resulted in 
23e90 61 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20 20  a scan that.    
23ea0 20 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61 6e        ** uses an
23eb0 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69 73   index, and this
23ec0 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 66   is either the f
23ed0 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  irst OR-connecte
23ee0 64 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20  d term.         
23ef0 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f 72   ** processed or
23f00 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 68   the index is th
23f10 65 20 73 61 6d 65 20 61 73 20 74 68 61 74 20 75  e same as that u
23f20 73 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76 69  sed by all previ
23f30 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
23f40 20 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f 76   terms, set pCov
23f50 20 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61 74   to the candidat
23f60 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
23f70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  . Otherwise, set
23f80 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
23f90 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69  Cov to NULL to i
23fa0 6e 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f 20  ndicate that no 
23fb0 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69  candidate coveri
23fc0 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20  ng index will . 
23fd0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61           ** be a
23fe0 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20  vailable..      
23ff0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
24000 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62   pSubLoop = pSub
24010 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
24020 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  op;.          as
24030 73 65 72 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d  sert( (pSubLoop-
24040 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
24050 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20  _AUTO_INDEX)==0 
24060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
24070 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c   (pSubLoop->wsFl
24080 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
24090 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 20  XED)!=0.        
240a0 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20     && (ii==0 || 
240b0 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  pSubLoop->u.btre
240c0 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a  e.pIndex==pCov).
240d0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
240e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
240f0 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d   pSubWInfo->a[0]
24100 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75  .iIdxCur==iCovCu
24110 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
24120 20 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70   pCov = pSubLoop
24130 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
24140 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
24150 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
24160 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Cov = 0;.       
24170 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
24180 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f  /* Finish the lo
24190 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  op through table
241a0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61   entries that ma
241b0 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d  tch term pOrTerm
241c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
241d0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
241e0 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  SubWInfo);.     
241f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
24200 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75   }.    pLevel->u
24210 2e 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b  .pCovidx = pCov;
24220 0a 20 20 20 20 69 66 28 20 70 43 6f 76 20 29 20  .    if( pCov ) 
24230 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
24240 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69  = iCovCur;.    i
24250 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20  f( pAndExpr ){. 
24260 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70       pAndExpr->p
24270 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Left = 0;.      
24280 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
24290 65 28 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b  e(db, pAndExpr);
242a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
242b0 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
242c0 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69  , iRetInit, sqli
242d0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
242e0 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69  dr(v));.    sqli
242f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
24300 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
24310 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
24320 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
24330 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c  solveLabel(v, iL
24340 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69  oopBody);..    i
24350 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
24360 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74 61  l>1 ) sqlite3Sta
24370 63 6b 46 72 65 65 28 64 62 2c 20 70 4f 72 54 61  ckFree(db, pOrTa
24380 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74  b);.    if( !unt
24390 65 73 74 65 64 54 65 72 6d 73 20 29 20 64 69 73  estedTerms ) dis
243a0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
243b0 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65   pTerm);.  }else
243c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
243d0 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
243e0 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20  ZATION */..  {. 
243f0 20 20 20 2f 2a 20 43 61 73 65 20 36 3a 20 20 54     /* Case 6:  T
24400 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c  here is no usabl
24410 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73  e index.  We mus
24420 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a  t do a complete.
24430 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
24440 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  scan of the enti
24450 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  re table..    */
24460 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
24470 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b  t u8 aStep[] = {
24480 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65   OP_Next, OP_Pre
24490 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20  v };.    static 
244a0 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b  const u8 aStart[
244b0 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c  ] = { OP_Rewind,
244c0 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20   OP_Last };.    
244d0 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20  assert( bRev==0 
244e0 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20  || bRev==1 );.  
244f0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61    pLevel->op = a
24500 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20  Step[bRev];.    
24510 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
24520 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
24530 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  2 = 1 + sqlite3V
24540 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74  dbeAddOp2(v, aSt
24550 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c  art[bRev], iCur,
24560 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70   addrBrk);.    p
24570 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
24580 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
24590 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 7d  LLSCAN_STEP;.  }
245a0 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f  ..  /* Insert co
245b0 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79  de to test every
245c0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74   subexpression t
245d0 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  hat can be compl
245e0 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75  etely.  ** compu
245f0 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 75  ted using the cu
24600 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62  rrent set of tab
24610 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
24620 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
24630 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b  pWC->nTerm; j>0;
24640 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j--, pTerm++){.
24650 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20      Expr *pE;.  
24660 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
24670 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
24680 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
24690 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
246a0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
246b0 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66  _CODED );.    if
246c0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
246d0 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
246e0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
246f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
24700 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
24710 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  ll & pLevel->not
24720 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20  Ready)!=0 ){.   
24730 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49     testcase( pWI
24740 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
24750 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ms==0.          
24760 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
24770 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
24780 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
24790 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  Y)!=0 );.      p
247a0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
247b0 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  erms = 1;.      
247c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
247d0 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e      pE = pTerm->
247e0 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
247f0 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20  t( pE!=0 );.    
24800 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
24810 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61  tJoin && !ExprHa
24820 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
24830 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
24840 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
24850 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
24860 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
24870 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c  e, pE, addrCont,
24880 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
24890 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  LL);.    pTerm->
248a0 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
248b0 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  CODED;.  }..  /*
248c0 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20   Insert code to 
248d0 74 65 73 74 20 66 6f 72 20 69 6d 70 6c 69 65 64  test for implied
248e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 61 73   constraints bas
248f0 65 64 20 6f 6e 20 74 72 61 6e 73 69 74 69 76 69  ed on transitivi
24900 74 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 22  ty.  ** of the "
24910 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  ==" operator..  
24920 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  **.  ** Example:
24930 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
24940 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 22 74  ause contains "t
24950 31 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20 22 74  1.a=t2.b" and "t
24960 32 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20 61 6e  2.b=123".  ** an
24970 64 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20  d we are coding 
24980 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20  the t1 loop and 
24990 74 68 65 20 74 32 20 6c 6f 6f 70 20 68 61 73 20  the t2 loop has 
249a0 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 2c 0a 20  not yet coded,. 
249b0 20 2a 2a 20 74 68 65 6e 20 77 65 20 63 61 6e 6e   ** then we cann
249c0 6f 74 20 75 73 65 20 74 68 65 20 22 74 31 2e 61  ot use the "t1.a
249d0 3d 74 32 2e 62 22 20 63 6f 6e 73 74 72 61 69 6e  =t2.b" constrain
249e0 74 2c 20 62 75 74 20 77 65 20 63 61 6e 20 63 6f  t, but we can co
249f0 64 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d 70 6c  de.  ** the impl
24a00 69 65 64 20 22 74 31 2e 61 3d 31 32 33 22 20 63  ied "t1.a=123" c
24a10 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a  onstraint..  */.
24a20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
24a30 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, j=pWC->nTerm
24a40 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72  ; j>0; j--, pTer
24a50 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
24a60 70 45 2c 20 2a 70 45 41 6c 74 3b 0a 20 20 20 20  pE, *pEAlt;.    
24a70 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b  WhereTerm *pAlt;
24a80 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
24a90 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
24aa0 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
24ab0 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
24ac0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
24ad0 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51  Operator!=(WO_EQ
24ae0 55 49 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e  UIV|WO_EQ) ) con
24af0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
24b00 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
24b10 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
24b20 65 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  e;.    if( pLeve
24b30 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63  l->iLeftJoin ) c
24b40 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20  ontinue;.    pE 
24b50 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
24b60 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
24b70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
24b80 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b   EP_FromJoin) );
24b90 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
24ba0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
24bb0 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65   & pLevel->notRe
24bc0 61 64 79 29 21 3d 30 20 29 3b 0a 20 20 20 20 70  ady)!=0 );.    p
24bd0 41 6c 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  Alt = findTerm(p
24be0 57 43 2c 20 69 43 75 72 2c 20 70 54 65 72 6d 2d  WC, iCur, pTerm-
24bf0 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e  >u.leftColumn, n
24c00 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57  otReady, WO_EQ|W
24c10 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  O_IN, 0);.    if
24c20 28 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74  ( pAlt==0 ) cont
24c30 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 41  inue;.    if( pA
24c40 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  lt->wtFlags & (T
24c50 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
24c60 74 69 6e 75 65 3b 0a 20 20 20 20 74 65 73 74 63  tinue;.    testc
24c70 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72  ase( pAlt->eOper
24c80 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
24c90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41      testcase( pA
24ca0 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  lt->eOperator & 
24cb0 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 56 64 62  WO_IN );.    Vdb
24cc0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
24cd0 20 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69   "begin transiti
24ce0 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29  ve constraint"))
24cf0 3b 0a 20 20 20 20 70 45 41 6c 74 20 3d 20 73 71  ;.    pEAlt = sq
24d00 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52  lite3StackAllocR
24d10 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
24d20 45 41 6c 74 29 29 3b 0a 20 20 20 20 69 66 28 20  EAlt));.    if( 
24d30 70 45 41 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a  pEAlt ){.      *
24d40 70 45 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70  pEAlt = *pAlt->p
24d50 45 78 70 72 3b 0a 20 20 20 20 20 20 70 45 41 6c  Expr;.      pEAl
24d60 74 2d 3e 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70  t->pLeft = pE->p
24d70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Left;.      sqli
24d80 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
24d90 50 61 72 73 65 2c 20 70 45 41 6c 74 2c 20 61 64  Parse, pEAlt, ad
24da0 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a  drCont, SQLITE_J
24db0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
24dc0 20 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72    sqlite3StackFr
24dd0 65 65 28 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20  ee(db, pEAlt);. 
24de0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
24df0 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  or a LEFT OUTER 
24e00 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63  JOIN, generate c
24e10 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ode that will re
24e20 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
24e30 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74  at.  ** at least
24e40 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
24e50 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20  right table has 
24e60 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74  matched the left
24e70 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20   table.  .  */. 
24e80 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
24e90 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c  ftJoin ){.    pL
24ea0 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20  evel->addrFirst 
24eb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
24ec0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
24ed0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24ee0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
24ef0 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  , 1, pLevel->iLe
24f00 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62  ftJoin);.    Vdb
24f10 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
24f20 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68  cord LEFT JOIN h
24f30 69 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  it"));.    sqlit
24f40 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
24f50 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f  (pParse);.    fo
24f60 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
24f70 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72  j=0; j<pWC->nTer
24f80 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; j++, pTerm++)
24f90 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
24fa0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
24fb0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
24fc0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
24fd0 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
24fe0 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29  s & TERM_CODED )
24ff0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
25000 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
25010 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
25020 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
25030 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  e;.      if( (pT
25040 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
25050 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64   pLevel->notRead
25060 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  y)!=0 ){.       
25070 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
25080 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  >untestedTerms )
25090 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
250a0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
250b0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
250c0 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >pExpr );.      
250d0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
250e0 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  se(pParse, pTerm
250f0 2d 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f 6e  ->pExpr, addrCon
25100 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
25110 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65  NULL);.      pTe
25120 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
25130 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d  ERM_CODED;.    }
25140 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
25150 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
25160 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67  rse, iReleaseReg
25170 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 65  );..  return pLe
25180 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d  vel->notReady;.}
25190 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
251a0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a  ACE_ENABLED./*.*
251b0 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c  * Print a WhereL
251c0 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64  oop object for d
251d0 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65  ebugging purpose
251e0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
251f0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
25200 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 53 72  WhereLoop *p, Sr
25210 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 29  cList *pTabList)
25220 7b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28  {.  int nb = 1+(
25230 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37  pTabList->nSrc+7
25240 29 2f 38 3b 0a 20 20 73 74 72 75 63 74 20 53 72  )/8;.  struct Sr
25250 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
25260 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20  m = pTabList->a 
25270 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62  + p->iTab;.  Tab
25280 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d  le *pTab = pItem
25290 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65  ->pTab;.  sqlite
252a0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 63  3DebugPrintf("%c
252b0 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c  %2d.%0*llx.%0*ll
252c0 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20  x", p->cId,.    
252d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252e0 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d   p->iTab, nb, p-
252f0 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70  >maskSelf, nb, p
25300 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73 71 6c  ->prereq);.  sql
25310 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25320 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20  " %12s",.       
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
25340 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49  tem->zAlias ? pI
25350 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54  tem->zAlias : pT
25360 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ab->zName);.  if
25370 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
25380 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
25390 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  LE)==0 ){.    if
253a0 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  ( p->u.btree.pIn
253b0 64 65 78 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  dex ){.      con
253c0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
253d0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
253e0 65 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ex->zName;.     
253f0 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
25400 7a 4e 61 6d 65 20 3d 20 22 69 70 6b 22 3b 0a 20  zName = "ipk";. 
25410 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
25420 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
25430 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29  autoindex_", 17)
25440 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
25450 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74  nt i = sqlite3St
25460 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20  rlen30(zName) - 
25470 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  1;.        while
25480 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20  ( zName[i]!='_' 
25490 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a  ) i--;.        z
254a0 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20  Name += i;.     
254b0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
254c0 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d  DebugPrintf(".%-
254d0 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c  16s %2d", zName,
254e0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29   p->u.btree.nEq)
254f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25500 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
25510 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22 29  rintf("%20s","")
25520 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
25530 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  .    char *z;.  
25540 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e    if( p->u.vtab.
25550 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20  idxStr ){.      
25560 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
25570 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c  ntf("(%d,\"%s\",
25580 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %x)",.          
25590 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
255a0 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61  idxNum, p->u.vta
255b0 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76  b.idxStr, p->u.v
255c0 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20  tab.omitMask);. 
255d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
255e0 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
255f0 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70  ntf("(%d,%x)", p
25600 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
25610 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d   p->u.vtab.omitM
25620 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ask);.    }.    
25630 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
25640 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b  tf(" %-19s", z);
25650 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
25660 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(z);.  }.  sqli
25670 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25680 20 66 20 25 30 34 78 20 4e 20 25 64 22 2c 20 70   f %04x N %d", p
25690 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c  ->wsFlags, p->nL
256a0 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  Term);.  sqlite3
256b0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f  DebugPrintf(" co
256c0 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20  st %d,%d,%d\n", 
256d0 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52  p->rSetup, p->rR
256e0 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 7d 0a  un, p->nOut);.}.
256f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
25700 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72  nvert bulk memor
25710 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57  y into a valid W
25720 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61  hereLoop that ca
25730 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74  n be passed.** t
25740 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  o whereLoopClear
25750 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a   harmlessly..*/.
25760 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
25770 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c  eLoopInit(WhereL
25780 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c  oop *p){.  p->aL
25790 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d  Term = p->aLTerm
257a0 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65  Space;.  p->nLTe
257b0 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53  rm = 0;.  p->nLS
257c0 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
257d0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b  p->aLTermSpace);
257e0 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  .  p->wsFlags = 
257f0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  0;.}../*.** Clea
25800 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  r the WhereLoop.
25810 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20  u union.  Leave 
25820 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d  WhereLoop.pLTerm
25830 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74   intact..*/.stat
25840 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
25850 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69  pClearUnion(sqli
25860 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
25870 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
25880 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
25890 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57  E_VIRTUALTABLE|W
258a0 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
258b0 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
258c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
258d0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
258e0 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65   && p->u.vtab.ne
258f0 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
25900 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
25910 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
25920 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
25930 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
25940 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64      p->u.vtab.id
25950 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xStr = 0;.    }e
25960 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  lse if( (p->wsFl
25970 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
25980 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d  _INDEX)!=0 && p-
25990 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
259a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
259b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
259c0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
259d0 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20  >zColAff);.     
259e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
259f0 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
25a00 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ndex);.      p->
25a10 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
25a20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
25a30 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
25a40 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72  e internal memor
25a50 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72  y used by a Wher
25a60 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
25a70 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
25a80 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74  eLoopClear(sqlit
25a90 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
25aa0 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
25ab0 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
25ac0 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
25ad0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
25ae0 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f  Term);.  whereLo
25af0 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
25b00 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70   p);.  whereLoop
25b10 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Init(p);.}../*.*
25b20 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d  * Increase the m
25b30 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
25b40 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65   for pLoop->aLTe
25b50 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65  rm[] to be at le
25b60 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ast n..*/.static
25b70 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
25b80 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62  size(sqlite3 *db
25b90 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  , WhereLoop *p, 
25ba0 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54  int n){.  WhereT
25bb0 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69  erm **paNew;.  i
25bc0 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20  f( p->nLSlot>=n 
25bd0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
25be0 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26  OK;.  n = (n+7)&
25bf0 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71  ~7;.  paNew = sq
25c00 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
25c10 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  (db, sizeof(p->a
25c20 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20  LTerm[0])*n);.  
25c30 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72  if( paNew==0 ) r
25c40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
25c50 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e  EM;.  memcpy(paN
25c60 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73  ew, p->aLTerm, s
25c70 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
25c80 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a  0])*p->nLSlot);.
25c90 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21    if( p->aLTerm!
25ca0 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20  =p->aLTermSpace 
25cb0 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
25cc0 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a  db, p->aLTerm);.
25cd0 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61    p->aLTerm = pa
25ce0 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74  New;.  p->nLSlot
25cf0 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53   = n;.  return S
25d00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
25d10 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74  ** Transfer cont
25d20 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63  ent from the sec
25d30 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74  ond pLoop into t
25d40 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61  he first..*/.sta
25d50 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
25d60 70 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64  pXfer(sqlite3 *d
25d70 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  b, WhereLoop *pT
25d80 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46  o, WhereLoop *pF
25d90 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f  rom){.  whereLoo
25da0 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20  pClearUnion(db, 
25db0 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72  pTo);.  if( wher
25dc0 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
25dd0 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65  pTo, pFrom->nLTe
25de0 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  rm) ){.    memse
25df0 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69  t(&pTo->u, 0, si
25e00 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20  zeof(pTo->u));. 
25e10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25e20 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
25e30 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c  mcpy(pTo, pFrom,
25e40 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52   WHERE_LOOP_XFER
25e50 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  _SZ);.  memcpy(p
25e60 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f  To->aLTerm, pFro
25e70 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e  m->aLTerm, pTo->
25e80 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54  nLTerm*sizeof(pT
25e90 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a  o->aLTerm[0]));.
25ea0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46    if( pFrom->wsF
25eb0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
25ec0 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
25ed0 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e   pFrom->u.vtab.n
25ee0 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  eedFree = 0;.  }
25ef0 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d  else if( (pFrom-
25f00 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
25f10 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
25f20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e  ){.    pFrom->u.
25f30 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
25f40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
25f50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
25f60 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72  ** Delete a Wher
25f70 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
25f80 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
25f90 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69  eLoopDelete(sqli
25fa0 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
25fb0 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c  op *p){.  whereL
25fc0 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b  oopClear(db, p);
25fd0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
25fe0 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
25ff0 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e  * Free a WhereIn
26000 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a  fo structure.*/.
26010 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
26020 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65  eInfoFree(sqlite
26030 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f  3 *db, WhereInfo
26040 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28   *pWInfo){.  if(
26050 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20   ALWAYS(pWInfo) 
26060 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75  ){.    whereClau
26070 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d  seClear(&pWInfo-
26080 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65  >sWC);.    while
26090 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  ( pWInfo->pLoops
260a0 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c   ){.      WhereL
260b0 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d  oop *p = pWInfo-
260c0 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70  >pLoops;.      p
260d0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20  WInfo->pLoops = 
260e0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
260f0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
26100 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ete(db, p);.    
26110 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
26120 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
26130 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
26140 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20  sert or replace 
26150 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  a WhereLoop entr
26160 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70  y using the temp
26170 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a  late supplied..*
26180 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
26190 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
261a0 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72   might be overwr
261b0 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77  itten if the new
261c0 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20   template.** is 
261d0 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66  better and has f
261e0 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
261f0 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c  s.  Or the templ
26200 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  ate will be igno
26210 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e  red.** and no in
26220 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20  sert will occur 
26230 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  if an existing W
26240 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74  hereLoop is fast
26250 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65  er and has.** fe
26260 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
26270 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61   than the templa
26280 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61  te.  Otherwise a
26290 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69   new WhereLoop i
262a0 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64  s.** added based
262b0 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65   on the template
262c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c  ..**.** If pBuil
262d0 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e  der->pOrSet is n
262e0 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20  ot NULL then we 
262f0 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
26300 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72  only the.** prer
26310 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52  equisites and rR
26320 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74  un and nOut cost
26330 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20  s of the N best 
26340 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20  loops.  That.** 
26350 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67  information is g
26360 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70  athered in the p
26370 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
26380 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70  object.  This sp
26390 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73  ecial.** process
263a0 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
263b0 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61   only for OR cla
263c0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
263d0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d  **.** When accum
263e0 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  ulating multiple
263f0 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75   loops (when pBu
26400 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
26410 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69   NULL) we.** sti
26420 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ll might overwri
26430 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73  te similar loops
26440 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65   with the new te
26450 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a  mplate if the.**
26460 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74   template is bet
26470 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20  ter.  Loops may 
26480 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
26490 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
264a0 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
264b0 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  re met:.**.**   
264c0 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20   (1)  They have 
264d0 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a  the same iTab..*
264e0 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68  *    (2)  They h
264f0 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f  ave the same iSo
26500 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29  rtIdx..**    (3)
26510 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
26520 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72  as same or fewer
26530 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
26540 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  an the current l
26550 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54  oop.**    (4)  T
26560 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20  he template has 
26570 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65  the same or lowe
26580 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20  r cost than the 
26590 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20  current loop.** 
265a0 20 20 20 28 35 29 20 20 54 68 65 20 74 65 6d 70     (5)  The temp
265b0 6c 61 74 65 20 75 73 65 73 20 6d 6f 72 65 20 74  late uses more t
265c0 65 72 6d 73 20 6f 66 20 74 68 65 20 73 61 6d 65  erms of the same
265d0 20 69 6e 64 65 78 20 62 75 74 20 68 61 73 20 6e   index but has n
265e0 6f 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  o additional.** 
265f0 20 20 20 20 20 20 20 20 64 65 70 65 6e 64 65 6e          dependen
26600 63 69 65 73 20 20 20 20 20 20 20 20 20 20 0a 2a  cies          .*
26610 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
26620 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65  reLoopInsert(Whe
26630 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
26640 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f  Builder, WhereLo
26650 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a  op *pTemplate){.
26660 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
26670 50 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65 78 74  Prev, *p, *pNext
26680 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 49 6e 66   = 0;.  WhereInf
26690 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
266a0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
266b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
266c0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
266d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c  ;..  /* If pBuil
266e0 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64  der->pOrSet is d
266f0 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c  efined, then onl
26700 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  y keep track of 
26710 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61  the costs.  ** a
26720 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f  nd prereqs..  */
26730 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d  .  if( pBuilder-
26740 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23 69  >pOrSet!=0 ){.#i
26750 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
26760 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20 3d  BLED.    u16 n =
26770 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
26780 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20  t->n;.    int x 
26790 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65  =.#endif.    whe
267a0 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c  reOrInsert(pBuil
267b0 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65  der->pOrSet, pTe
267c0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20  mplate->prereq, 
267d0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
267e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
267f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26800 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
26810 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45  nOut);.#if WHERE
26820 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
26830 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
26840 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
26850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
26860 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20  bugPrintf(x?"   
26870 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72  or-%d:  ":"   or
26880 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20  -X:  ", n);.    
26890 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
268a0 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e  (pTemplate, pWIn
268b0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20  fo->pTabList);. 
268c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
268d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
268e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72  ;.  }..  /* Sear
268f0 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ch for an existi
26900 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  ng WhereLoop to 
26910 6f 76 65 72 77 72 69 74 65 2c 20 6f 72 20 77 68  overwrite, or wh
26920 69 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a 20 70  ich takes.  ** p
26930 72 69 6f 72 69 74 79 20 6f 76 65 72 20 70 54 65  riority over pTe
26940 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 66  mplate..  */.  f
26950 6f 72 28 70 70 50 72 65 76 3d 26 70 57 49 6e 66  or(ppPrev=&pWInf
26960 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70  o->pLoops, p=*pp
26970 50 72 65 76 3b 20 70 3b 20 70 70 50 72 65 76 3d  Prev; p; ppPrev=
26980 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70  &p->pNextLoop, p
26990 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69  =*ppPrev){.    i
269a0 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
269b0 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70  plate->iTab || p
269c0 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d  ->iSortIdx!=pTem
269d0 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20  plate->iSortIdx 
269e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65  ){.      /* If e
269f0 69 74 68 65 72 20 74 68 65 20 69 54 61 62 20 6f  ither the iTab o
26a00 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65  r iSortIdx value
26a10 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c  s for two WhereL
26a20 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72 65 6e  oop are differen
26a30 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  t.      ** then 
26a40 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73  those WhereLoops
26a50 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73   need to be cons
26a60 69 64 65 72 65 64 20 73 65 70 61 72 61 74 65 6c  idered separatel
26a70 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20  y.  Neither is. 
26a80 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64       ** a candid
26a90 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74  ate to replace t
26aa0 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20  he other. */.   
26ab0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
26ac0 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65   }.    /* In the
26ad0 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
26ae0 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65  ntation, the rSe
26af0 74 75 70 20 76 61 6c 75 65 20 69 73 20 65 69 74  tup value is eit
26b00 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20  her zero.    ** 
26b10 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62  or the cost of b
26b20 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d  uilding an autom
26b30 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67  atic index (Nlog
26b40 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e  N) and the NlogN
26b50 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73  .    ** is the s
26b60 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62  ame for compatib
26b70 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a  le WhereLoops. *
26b80 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
26b90 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54  >rSetup==0 || pT
26ba0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d  emplate->rSetup=
26bb0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
26bc0 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75       || p->rSetu
26bd0 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p==pTemplate->rS
26be0 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  etup );..    /* 
26bf0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
26c00 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72  e() always gener
26c10 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73  ates and inserts
26c20 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
26c30 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65  ndex.    ** case
26c40 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63   first.  Hence c
26c50 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64  ompatible candid
26c60 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e  ate WhereLoops n
26c70 65 76 65 72 20 68 61 76 65 20 61 20 6c 61 72 67  ever have a larg
26c80 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70  er.    ** rSetup
26c90 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55  . Call this SETU
26ca0 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20  P-INVARIANT */. 
26cb0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
26cc0 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  etup>=pTemplate-
26cd0 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20  >rSetup );..    
26ce0 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26  if( (p->prereq &
26cf0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
26d00 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20  eq)==p->prereq. 
26d10 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70      && p->rSetup
26d20 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  <=pTemplate->rSe
26d30 74 75 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72  tup.     && p->r
26d40 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run<=pTemplate->
26d50 72 52 75 6e 0a 20 20 20 20 20 26 26 20 70 2d 3e  rRun.     && p->
26d60 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  nOut<=pTemplate-
26d70 3e 6e 4f 75 74 0a 20 20 20 20 29 7b 0a 20 20 20  >nOut.    ){.   
26d80 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
26d90 68 20 74 61 6b 65 6e 20 77 68 65 6e 20 70 20 69  h taken when p i
26da0 73 20 65 71 75 61 6c 20 6f 72 20 62 65 74 74 65  s equal or bette
26db0 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  r than pTemplate
26dc0 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c   in .      ** al
26dd0 6c 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64 65  l of (1) depende
26de0 6e 63 69 65 73 20 28 32 29 20 73 65 74 75 70 2d  ncies (2) setup-
26df0 63 6f 73 74 2c 20 28 33 29 20 72 75 6e 2d 63 6f  cost, (3) run-co
26e00 73 74 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  st, and.      **
26e10 20 28 34 29 20 6e 75 6d 62 65 72 20 6f 66 20 6f   (4) number of o
26e20 75 74 70 75 74 20 72 6f 77 73 2e 20 2a 2f 0a 20  utput rows. */. 
26e30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
26e40 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74  rSetup==pTemplat
26e50 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 20 20 20  e->rSetup );.   
26e60 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71     if( p->prereq
26e70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  ==pTemplate->pre
26e80 72 65 71 0a 20 20 20 20 20 20 20 26 26 20 70 2d  req.       && p-
26e90 3e 6e 4c 54 65 72 6d 3c 70 54 65 6d 70 6c 61 74  >nLTerm<pTemplat
26ea0 65 2d 3e 6e 4c 54 65 72 6d 0a 20 20 20 20 20 20  e->nLTerm.      
26eb0 20 26 26 20 28 70 2d 3e 77 73 46 6c 61 67 73 20   && (p->wsFlags 
26ec0 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46  & pTemplate->wsF
26ed0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
26ee0 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
26ef0 26 26 20 28 70 2d 3e 75 2e 62 74 72 65 65 2e 70  && (p->u.btree.p
26f00 49 6e 64 65 78 3d 3d 70 54 65 6d 70 6c 61 74 65  Index==pTemplate
26f10 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
26f20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54  .          || pT
26f30 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2b 70 2d  emplate->rRun+p-
26f40 3e 6e 4c 54 65 72 6d 3c 3d 70 2d 3e 72 52 75 6e  >nLTerm<=p->rRun
26f50 2b 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65  +pTemplate->nLTe
26f60 72 6d 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  rm).      ){.   
26f70 20 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74       /* Overwrit
26f80 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  e an existing Wh
26f90 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20  ereLoop with an 
26fa0 73 69 6d 69 6c 61 72 20 6f 6e 65 20 74 68 61 74  similar one that
26fb0 20 75 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a   uses.        **
26fc0 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 74   more terms of t
26fd0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
26fe0 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
26ff0 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  NextLoop;.      
27000 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
27010 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
27020 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 6e 6f   pTemplate is no
27030 74 20 68 65 6c 70 66 75 6c 2e 0a 20 20 20 20 20  t helpful..     
27040 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 77 69 74     ** Return wit
27050 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 6f 72  hout changing or
27060 20 61 64 64 69 6e 67 20 61 6e 79 74 68 69 6e 67   adding anything
27070 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
27080 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
27090 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  _noop;.      }. 
270a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d     }.    if( (p-
270b0 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
270c0 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54  ate->prereq)==pT
270d0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a  emplate->prereq.
270e0 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e       && p->rRun>
270f0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e  =pTemplate->rRun
27100 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74  .     && p->nOut
27110 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  >=pTemplate->nOu
27120 74 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  t.    ){.      /
27130 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65  * Overwrite an e
27140 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
27150 70 20 77 69 74 68 20 61 20 62 65 74 74 65 72 20  p with a better 
27160 6f 6e 65 3a 20 6f 6e 65 20 74 68 61 74 20 69 73  one: one that is
27170 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72  .      ** better
27180 20 61 74 20 6f 6e 65 20 6f 66 20 28 31 29 20 64   at one of (1) d
27190 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 28 32 29  ependencies, (2)
271a0 20 73 65 74 75 70 2d 63 6f 73 74 2c 20 28 33 29   setup-cost, (3)
271b0 20 72 75 6e 2d 63 6f 73 74 0a 20 20 20 20 20 20   run-cost.      
271c0 2a 2a 20 6f 72 20 28 34 29 20 6e 75 6d 62 65 72  ** or (4) number
271d0 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2c   of output rows,
271e0 20 61 6e 64 20 69 73 20 6e 6f 20 77 6f 72 73 65   and is no worse
271f0 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 6f 73 65   in any of those
27200 0a 20 20 20 20 20 20 2a 2a 20 63 61 74 65 67 6f  .      ** catego
27210 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ries. */.      a
27220 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
27230 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
27240 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d  tup ); /* SETUP-
27250 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20  INVARIANT above 
27260 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  */.      pNext =
27270 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
27280 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27290 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  }.  }..  /* If w
272a0 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
272b0 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  nt it means that
272c0 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75   either p[] shou
272d0 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ld be overwritte
272e0 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d  n.  ** with pTem
272f0 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65  plate[] if p[] e
27300 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d  xists, or if p==
27310 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61  NULL then alloca
27320 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68  te a new.  ** Wh
27330 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65  ereLoop and inse
27340 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20  rt it..  */.#if 
27350 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
27360 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
27370 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
27380 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30   ){.    if( p!=0
27390 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
273a0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
273b0 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20  s-del:  ");.    
273c0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
273d0 28 70 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  (p, pWInfo->pTab
273e0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
273f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
27400 6e 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22  ntf("ins-new:  "
27410 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  );.    whereLoop
27420 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
27430 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
27440 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  t);.  }.#endif. 
27450 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
27460 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
27470 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
27480 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a  of(WhereLoop));.
27490 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
274a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
274b0 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  EM;.    whereLoo
274c0 70 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20  pInit(p);.  }.  
274d0 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62  whereLoopXfer(db
274e0 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  , p, pTemplate);
274f0 0a 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20  .  p->pNextLoop 
27500 3d 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70 50 72  = pNext;.  *ppPr
27510 65 76 20 3d 20 70 3b 0a 20 20 69 66 28 20 28 70  ev = p;.  if( (p
27520 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
27530 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
27540 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  =0 ){.    Index 
27550 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62  *pIndex = p->u.b
27560 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
27570 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70   if( pIndex && p
27580 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29  Index->tnum==0 )
27590 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  {.      p->u.btr
275a0 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
275b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
275c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
275d0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
275e0 74 68 65 20 69 6e 73 65 72 74 20 69 73 20 61 20  the insert is a 
275f0 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65 4c 6f  no-op */.whereLo
27600 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a 0a 23  opInsert_noop:.#
27610 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
27620 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
27630 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
27640 30 78 38 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  0x8 ){.    sqlit
27650 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69  e3DebugPrintf("i
27660 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20  ns-noop: ");.   
27670 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
27680 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66  pTemplate, pWInf
27690 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  o->pTabList);.  
276a0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
276b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 7d  n SQLITE_OK;  .}
276c0 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
276d0 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75  he WhereLoop.nOu
276e0 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72 64  t value downward
276f0 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
27700 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
27710 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
27720 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  t reference the 
27730 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20 61  loop but which a
27740 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20 61  re not used by a
27750 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  n.** index..**.*
27760 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * In the current
27770 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c   implementation,
27780 20 74 68 65 20 66 69 72 73 74 20 65 78 74 72 61   the first extra
27790 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
277a0 72 6d 20 72 65 64 75 63 65 73 0a 2a 2a 20 74 68  rm reduces.** th
277b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
277c0 75 74 20 72 6f 77 73 20 62 79 20 61 20 66 61 63  ut rows by a fac
277d0 74 6f 72 20 6f 66 20 31 30 20 61 6e 64 20 65 61  tor of 10 and ea
277e0 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 74 65  ch additional te
277f0 72 6d 0a 2a 2a 20 72 65 64 75 63 65 73 20 74 68  rm.** reduces th
27800 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
27810 75 74 20 72 6f 77 73 20 62 79 20 73 71 72 74 28  ut rows by sqrt(
27820 32 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  2)..*/.static vo
27830 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70  id whereLoopOutp
27840 75 74 41 64 6a 75 73 74 28 57 68 65 72 65 43 6c  utAdjust(WhereCl
27850 61 75 73 65 20 2a 70 57 43 2c 20 57 68 65 72 65  ause *pWC, Where
27860 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 69 6e 74  Loop *pLoop, int
27870 20 69 43 75 72 29 7b 0a 20 20 57 68 65 72 65 54   iCur){.  WhereT
27880 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b  erm *pTerm, *pX;
27890 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c  .  Bitmask notAl
278a0 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d  lowed = ~(pLoop-
278b0 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d  >prereq|pLoop->m
278c0 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20  askSelf);.  int 
278d0 69 2c 20 6a 3b 0a 0a 20 20 69 66 28 20 21 4f 70  i, j;..  if( !Op
278e0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
278f0 64 28 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  d(pWC->pWInfo->p
27900 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
27910 45 5f 41 64 6a 75 73 74 4f 75 74 45 73 74 29 20  E_AdjustOutEst) 
27920 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
27930 20 7d 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e   }.  for(i=pWC->
27940 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43  nTerm, pTerm=pWC
27950 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
27960 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
27970 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
27980 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
27990 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
279a0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
279b0 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e  reqAll & pLoop->
279c0 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63  maskSelf)==0 ) c
279d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
279e0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
279f0 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29  ll & notAllowed)
27a00 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
27a10 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d      for(j=pLoop-
27a20 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
27a30 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20   j--){.      pX 
27a40 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
27a50 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  j];.      if( pX
27a60 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
27a70 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69  .      if( pX->i
27a80 50 61 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70  Parent>=0 && (&p
27a90 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e  WC->a[pX->iParen
27aa0 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65  t])==pTerm ) bre
27ab0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
27ac0 28 20 6a 3c 30 20 29 20 70 4c 6f 6f 70 2d 3e 6e  ( j<0 ) pLoop->n
27ad0 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72  Out += pTerm->tr
27ae0 75 74 68 50 72 6f 62 3b 0a 20 20 7d 0a 7d 0a 0a  uthProb;.  }.}..
27af0 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f  /*.** We have so
27b00 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75   far matched pBu
27b10 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
27b20 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f  tree.nEq terms o
27b30 66 20 74 68 65 20 69 6e 64 65 78 20 70 49 6e 64  f the index pInd
27b40 65 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 61  ex..** Try to ma
27b50 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a  tch one more..**
27b60 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74  .** If pProbe->t
27b70 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  num==0, that mea
27b80 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66  ns pIndex is a f
27b90 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66  ake index used f
27ba0 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  or the.** INTEGE
27bb0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
27bc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
27bd0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
27be0 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dex(.  WhereLoop
27bf0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
27c00 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  r,     /* The Wh
27c10 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20  ereLoop factory 
27c20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
27c30 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
27c40 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
27c50 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  use term being a
27c60 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64  nalyzed */.  Ind
27c70 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20  ex *pProbe,     
27c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27c90 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63  An index on pSrc
27ca0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
27cb0 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20  nInMul          
27cc0 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d        /* log(Num
27cd0 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
27ce0 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a  s due to IN) */.
27cf0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
27d00 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
27d10 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57  r->pWInfo;  /* W
27d20 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e  HERE analyse con
27d30 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
27d40 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
27d50 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
27d60 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
27d70 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
27d80 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
27d90 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
27da0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
27db0 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
27dc0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
27dd0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
27de0 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
27df0 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
27e00 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
27e10 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
27e20 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
27e30 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
27e40 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
27e50 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
27e60 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
27e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
27e80 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
27e90 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
27ea0 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
27eb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27ec0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
27ed0 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
27ee0 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64  .  Bitmask saved
27ef0 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20  _prereq;        
27f00 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
27f10 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72  alue of pNew->pr
27f20 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  ereq */.  u16 sa
27f30 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20  ved_nLTerm;     
27f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
27f50 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
27f60 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20  New->nLTerm */. 
27f70 20 69 6e 74 20 73 61 76 65 64 5f 6e 45 71 3b 20   int saved_nEq; 
27f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f90 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
27fa0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
27fb0 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 33 32  ree.nEq */.  u32
27fc0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20   saved_wsFlags; 
27fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27fe0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
27ff0 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  f pNew->wsFlags 
28000 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 73  */.  WhereCost s
28010 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20  aved_nOut;      
28020 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
28030 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
28040 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nOut */.  int iC
28050 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
28060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
28070 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
28080 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
28090 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
280a0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
280b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
280c0 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  e */.  WhereCost
280d0 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20 20 20   nRowEst;       
280e0 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61         /* Estima
280f0 74 65 64 20 69 6e 64 65 78 20 73 65 6c 65 63 74  ted index select
28100 69 76 69 74 79 20 2a 2f 0a 20 20 57 68 65 72 65  ivity */.  Where
28110 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  Cost rLogSize;  
28120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
28130 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65  garithm of table
28140 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65   size */.  Where
28150 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20  Term *pTop = 0, 
28160 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f  *pBtm = 0; /* To
28170 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e  p and bottom ran
28180 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ge constraints *
28190 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  /..  pNew = pBui
281a0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66  lder->pNew;.  if
281b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
281c0 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
281d0 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73  TE_NOMEM;..  ass
281e0 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c  ert( (pNew->wsFl
281f0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
28200 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a  UALTABLE)==0 );.
28210 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
28220 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
28230 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29  _TOP_LIMIT)==0 )
28240 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73  ;.  if( pNew->ws
28250 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
28260 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f  M_LIMIT ){.    o
28270 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f  pMask = WO_LT|WO
28280 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _LE;.  }else if(
28290 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30   pProbe->tnum<=0
282a0 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74   || (pSrc->joint
282b0 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
282c0 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  0 ){.    opMask 
282d0 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  = WO_EQ|WO_IN|WO
282e0 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
282f0 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WO_LE;.  }else{.
28300 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
28310 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  EQ|WO_IN|WO_ISNU
28320 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  LL|WO_GT|WO_GE|W
28330 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a  O_LT|WO_LE;.  }.
28340 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55    if( pProbe->bU
28350 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73  nordered ) opMas
28360 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f  k &= ~(WO_GT|WO_
28370 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b  GE|WO_LT|WO_LE);
28380 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
28390 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70  ->u.btree.nEq<=p
283a0 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Probe->nColumn )
283b0 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e  ;.  if( pNew->u.
283c0 62 74 72 65 65 2e 6e 45 71 20 3c 20 70 50 72 6f  btree.nEq < pPro
283d0 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  be->nColumn ){. 
283e0 20 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65     iCol = pProbe
283f0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d  ->aiColumn[pNew-
28400 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 20  >u.btree.nEq];. 
28410 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 77 68 65     nRowEst = whe
28420 72 65 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e 61  reCost(pProbe->a
28430 69 52 6f 77 45 73 74 5b 70 4e 65 77 2d 3e 75 2e  iRowEst[pNew->u.
28440 62 74 72 65 65 2e 6e 45 71 2b 31 5d 29 3b 0a 20  btree.nEq+1]);. 
28450 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 3d 3d     if( nRowEst==
28460 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45  0 && pProbe->onE
28470 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20  rror==OE_None ) 
28480 6e 52 6f 77 45 73 74 20 3d 20 31 3b 0a 20 20 7d  nRowEst = 1;.  }
28490 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  else{.    iCol =
284a0 20 2d 31 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74   -1;.    nRowEst
284b0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 65 72   = 0;.  }.  pTer
284c0 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  m = whereScanIni
284d0 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65  t(&scan, pBuilde
284e0 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43  r->pWC, pSrc->iC
284f0 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20  ursor, iCol,.   
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28510 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72       opMask, pPr
28520 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45  obe);.  saved_nE
28530 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  q = pNew->u.btre
28540 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e  e.nEq;.  saved_n
28550 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c  LTerm = pNew->nL
28560 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73  Term;.  saved_ws
28570 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73  Flags = pNew->ws
28580 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70  Flags;.  saved_p
28590 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72  rereq = pNew->pr
285a0 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f  ereq;.  saved_nO
285b0 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b  ut = pNew->nOut;
285c0 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20  .  pNew->rSetup 
285d0 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  = 0;.  rLogSize 
285e0 3d 20 65 73 74 4c 6f 67 28 77 68 65 72 65 43 6f  = estLog(whereCo
285f0 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77  st(pProbe->aiRow
28600 45 73 74 5b 30 5d 29 29 3b 0a 20 20 66 6f 72 28  Est[0]));.  for(
28610 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
28620 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65  && pTerm!=0; pTe
28630 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65  rm = whereScanNe
28640 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20  xt(&scan)){.    
28650 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66  int nIn = 0;.#if
28660 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
28670 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
28680 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c  .    int nRecVal
28690 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e  id = pBuilder->n
286a0 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66  RecValid;.#endif
286b0 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
286c0 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
286d0 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d  SNULL || (pTerm-
286e0 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e  >wtFlags&TERM_VN
286f0 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26  ULL)!=0).     &&
28700 20 28 69 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63   (iCol<0 || pSrc
28710 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ->pTab->aCol[iCo
28720 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20  l].notNull).    
28730 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
28740 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20  e; /* ignore IS 
28750 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74  [NOT] NULL const
28760 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55  raints on NOT NU
28770 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
28780 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72    }.    if( pTer
28790 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
287a0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
287b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
287c0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
287d0 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20  Out==saved_nOut 
287e0 29 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73  );..    pNew->ws
287f0 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
28800 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d  Flags;.    pNew-
28810 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
28820 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e  aved_nEq;.    pN
28830 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76  ew->nLTerm = sav
28840 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69  ed_nLTerm;.    i
28850 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
28860 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
28870 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62  w->nLTerm+1) ) b
28880 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a  reak; /* OOM */.
28890 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
288a0 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
288b0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e   = pTerm;.    pN
288c0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61  ew->prereq = (sa
288d0 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65  ved_prereq | pTe
288e0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29  rm->prereqRight)
288f0 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   & ~pNew->maskSe
28900 6c 66 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52  lf;.    pNew->rR
28910 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 3b 20 2f  un = rLogSize; /
28920 2a 20 42 61 73 65 6c 69 6e 65 20 63 6f 73 74 20  * Baseline cost 
28930 69 73 20 6c 6f 67 32 28 4e 29 2e 20 20 41 64 6a  is log2(N).  Adj
28940 75 73 74 6d 65 6e 74 73 20 62 65 6c 6f 77 20 2a  ustments below *
28950 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  /.    if( pTerm-
28960 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
28970 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  IN ){.      Expr
28980 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
28990 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  >pExpr;.      pN
289a0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
289b0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a  HERE_COLUMN_IN;.
289c0 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
289d0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
289e0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
289f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
28a00 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
28a10 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53  :  TUNING: the S
28a20 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35  ELECT returns 25
28a30 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20   rows */.       
28a40 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65   nIn = 46;  asse
28a50 72 74 28 20 34 36 3d 3d 77 68 65 72 65 43 6f 73  rt( 46==whereCos
28a60 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d  t(25) );.      }
28a70 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
28a80 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26  pExpr->x.pList &
28a90 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
28aa0 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
28ab0 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61      /* "x IN (va
28ac0 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
28ad0 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  " */.        nIn
28ae0 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70 45 78   = whereCost(pEx
28af0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
28b00 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
28b10 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d     pNew->rRun +=
28b20 20 6e 49 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77   nIn;.      pNew
28b30 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
28b40 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
28b50 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49  t = nRowEst + nI
28b60 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20  nMul + nIn;.    
28b70 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
28b80 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
28b90 5f 45 51 29 20 29 7b 0a 20 20 20 20 20 20 61 73  _EQ) ){.      as
28ba0 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
28bb0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
28bc0 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f  LUMN_NULL|WHERE_
28bd0 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 30 0a 20  COLUMN_IN))!=0. 
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bf0 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30 20 29 3b   || nInMul==0 );
28c00 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
28c10 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
28c20 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69  LUMN_EQ;.      i
28c30 66 28 20 69 43 6f 6c 3c 30 20 20 0a 20 20 20 20  f( iCol<0  .    
28c40 20 20 20 7c 7c 20 28 70 50 72 6f 62 65 2d 3e 6f     || (pProbe->o
28c50 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
28c60 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20  && nInMul==0.   
28c70 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d          && pNew-
28c80 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50  >u.btree.nEq==pP
28c90 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 29  robe->nColumn-1)
28ca0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
28cb0 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
28cc0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
28cd0 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 7c  _COLUMN_IN)==0 |
28ce0 7c 20 69 43 6f 6c 3c 30 20 29 3b 0a 20 20 20 20  | iCol<0 );.    
28cf0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
28d00 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f  s |= WHERE_ONERO
28d10 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  W;.      }.     
28d20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
28d30 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77  Eq++;.      pNew
28d40 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74  ->nOut = nRowEst
28d50 20 2b 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20 7d   + nInMul;.    }
28d60 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
28d70 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
28d80 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ISNULL) ){.     
28d90 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
28da0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  = WHERE_COLUMN_N
28db0 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ULL;.      pNew-
28dc0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
28dd0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
28de0 20 49 53 20 4e 55 4c 4c 20 73 65 6c 65 63 74 73   IS NULL selects
28df0 20 32 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20   2 rows */.     
28e00 20 6e 49 6e 20 3d 20 31 30 3b 20 20 61 73 73 65   nIn = 10;  asse
28e10 72 74 28 20 31 30 3d 3d 77 68 65 72 65 43 6f 73  rt( 10==whereCos
28e20 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20 70 4e  t(2) );.      pN
28e30 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45  ew->nOut = nRowE
28e40 73 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49  st + nInMul + nI
28e50 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  n;.    }else if(
28e60 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
28e70 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  r & (WO_GT|WO_GE
28e80 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
28e90 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
28ea0 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 20 29 3b  rator & WO_GT );
28eb0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28ec0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
28ed0 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20  r & WO_GE );.   
28ee0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
28ef0 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
28f00 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d  _RANGE|WHERE_BTM
28f10 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 42  _LIMIT;.      pB
28f20 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  tm = pTerm;.    
28f30 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20    pTop = 0;.    
28f40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
28f50 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
28f60 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57  rator & (WO_LT|W
28f70 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74  O_LE) );.      t
28f80 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
28f90 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
28fa0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
28fb0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
28fc0 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b  rator & WO_LE );
28fd0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
28fe0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
28ff0 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
29000 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _TOP_LIMIT;.    
29010 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a    pTop = pTerm;.
29020 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e        pBtm = (pN
29030 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
29040 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d  ERE_BTM_LIMIT)!=
29050 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 ?.            
29060 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
29070 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
29080 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d  rm-2] : 0;.    }
29090 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  .    if( pNew->w
290a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
290b0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
290c0 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e       /* Adjust n
290d0 4f 75 74 20 61 6e 64 20 72 52 75 6e 20 66 6f 72  Out and rRun for
290e0 20 53 54 41 54 33 20 72 61 6e 67 65 20 76 61 6c   STAT3 range val
290f0 75 65 73 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ues */.      ass
29100 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
29110 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
29120 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53       whereRangeS
29130 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
29140 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70  Builder, pBtm, p
29150 54 6f 70 2c 20 26 70 4e 65 77 2d 3e 6e 4f 75 74  Top, &pNew->nOut
29160 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
29170 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
29180 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
29190 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a   if( nInMul==0 .
291a0 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
291b0 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 26 26  nSample .     &&
291c0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
291d0 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d  Eq<=pProbe->nSam
291e0 70 6c 65 43 6f 6c 0a 20 20 20 20 20 26 26 20 4f  pleCol.     && O
291f0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
29200 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 74  ed(db, SQLITE_St
29210 61 74 33 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  at3) .    ){.   
29220 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
29230 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
29240 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75       tRowcnt nOu
29250 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
29260 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
29270 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
29280 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20  SNULL))!=0 ){.  
29290 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
292a0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
292b0 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
292c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
292d0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
292e0 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
292f0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
29300 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
29310 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
29320 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e  Expr->pRight, &n
29330 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Out);.      }els
29340 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f  e if( (pTerm->eO
29350 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
29360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
29370 20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72    !ExprHasProper
29380 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
29390 53 65 6c 65 63 74 29 20 20 29 7b 0a 20 20 20 20  Select)  ){.    
293a0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e      rc = whereIn
293b0 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
293c0 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d  pBuilder, pExpr-
293d0 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29  >x.pList, &nOut)
293e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
293f0 61 73 73 65 72 74 28 20 6e 4f 75 74 3d 3d 30 20  assert( nOut==0 
29400 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
29410 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f   );.      if( nO
29420 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f  ut ){.        nO
29430 75 74 20 3d 20 77 68 65 72 65 43 6f 73 74 28 6e  ut = whereCost(n
29440 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Out);.        pN
29450 65 77 2d 3e 6e 4f 75 74 20 3d 20 4d 49 4e 28 6e  ew->nOut = MIN(n
29460 4f 75 74 2c 20 73 61 76 65 64 5f 6e 4f 75 74 29  Out, saved_nOut)
29470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29480 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
29490 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
294a0 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c  (WHERE_IDX_ONLY|
294b0 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29  WHERE_IPK))==0 )
294c0 7b 0a 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20  {.      /* Each 
294d0 72 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61 20 73  row involves a s
294e0 74 65 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78  tep of the index
294f0 2c 20 74 68 65 6e 20 61 20 62 69 6e 61 72 79 20  , then a binary 
29500 73 65 61 72 63 68 20 6f 66 0a 20 20 20 20 20 20  search of.      
29510 2a 2a 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  ** the main tabl
29520 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  e */.      pNew-
29530 3e 72 52 75 6e 20 3d 20 20 77 68 65 72 65 43 6f  >rRun =  whereCo
29540 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e  stAdd(pNew->rRun
29550 2c 20 72 4c 6f 67 53 69 7a 65 3e 32 37 20 3f 20  , rLogSize>27 ? 
29560 72 4c 6f 67 53 69 7a 65 2d 31 37 20 3a 20 31 30  rLogSize-17 : 10
29570 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
29580 53 74 65 70 20 63 6f 73 74 20 66 6f 72 20 65 61  Step cost for ea
29590 63 68 20 6f 75 74 70 75 74 20 72 6f 77 20 2a 2f  ch output row */
295a0 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
295b0 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 70  = whereCostAdd(p
295c0 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d  New->rRun, pNew-
295d0 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 77 68 65 72  >nOut);.    wher
295e0 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
295f0 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c  t(pBuilder->pWC,
29600 20 70 4e 65 77 2c 20 70 53 72 63 2d 3e 69 43 75   pNew, pSrc->iCu
29610 72 73 6f 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  rsor);.    rc = 
29620 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
29630 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
29640 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e  .    if( (pNew->
29650 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
29660 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20  TOP_LIMIT)==0.  
29670 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74     && pNew->u.bt
29680 72 65 65 2e 6e 45 71 3c 28 70 50 72 6f 62 65 2d  ree.nEq<(pProbe-
29690 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 28 70 50 72 6f  >nColumn + (pPro
296a0 62 65 2d 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a 20  be->zName!=0)). 
296b0 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72     ){.      wher
296c0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
296d0 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
296e0 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75  c, pProbe, nInMu
296f0 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  l+nIn);.    }.  
29700 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
29710 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65  aved_nOut;.#ifde
29720 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
29730 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
29740 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65     pBuilder->nRe
29750 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c  cValid = nRecVal
29760 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  id;.#endif.  }. 
29770 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
29780 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20  saved_prereq;.  
29790 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
297a0 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
297b0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
297c0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
297d0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
297e0 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65  aved_nOut;.  pNe
297f0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
29800 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75  d_nLTerm;.  retu
29810 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29820 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69  Return True if i
29830 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
29840 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20  at pIndex might 
29850 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20  be useful in.** 
29860 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
29870 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
29880 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a   in pBuilder..**
29890 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65  .** Return False
298a0 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65   if pBuilder doe
298b0 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
298c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
298d0 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20   or.** if there 
298e0 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49  is no way for pI
298f0 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75  ndex to be usefu
29900 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  l in implementin
29910 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20  g that.** ORDER 
29920 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  BY clause..*/.st
29930 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69  atic int indexMi
29940 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
29950 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  By(.  WhereLoopB
29960 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
29970 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ,.  Index *pInde
29980 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  x,.  int iCursor
29990 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
299a0 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  pOB;.  int ii, j
299b0 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  j;..  if( pIndex
299c0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72  ->bUnordered ) r
299d0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
299e0 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pOB = pBuilder->
299f0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
29a00 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
29a10 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
29a20 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  pOB->nExpr; ii++
29a30 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
29a40 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
29a50 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d  SkipCollate(pOB-
29a60 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20  >a[ii].pExpr);. 
29a70 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
29a80 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
29a90 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
29aa0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
29ab0 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
29ac0 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e  for(jj=0; jj<pIn
29ad0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 6a  dex->nColumn; jj
29ae0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
29af0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d   pExpr->iColumn=
29b00 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  =pIndex->aiColum
29b10 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31  n[jj] ) return 1
29b20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29b30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
29b40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
29b50 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20  a bitmask where 
29b60 31 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  1s indicate that
29b70 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
29b80 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  ng column of.** 
29b90 74 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65  the table is use
29ba0 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20  d by an index.  
29bb0 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36  Only the first 6
29bc0 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f  3 columns are co
29bd0 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61  nsidered..*/.sta
29be0 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75  tic Bitmask colu
29bf0 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78  mnsInIndex(Index
29c00 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61   *pIdx){.  Bitma
29c10 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sk m = 0;.  int 
29c20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d  j;.  for(j=pIdx-
29c30 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30  >nColumn-1; j>=0
29c40 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; j--){.    int 
29c50 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
29c60 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72  mn[j];.    asser
29c70 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 74  t( x>=0 );.    t
29c80 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
29c90 31 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  1 );.    testcas
29ca0 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  e( x==BMS-2 );. 
29cb0 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
29cc0 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29   m |= MASKBIT(x)
29cd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
29ce0 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f  ;.}../* Check to
29cf0 20 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61   see if a partia
29d00 6c 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61  l index with pPa
29d10 72 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e  rtIndexWhere can
29d20 20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74   be used.** in t
29d30 68 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79  he current query
29d40 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
29d50 66 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20  f it can be and 
29d60 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f  false if not..*/
29d70 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
29d80 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
29d90 64 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68  dex(int iTab, Wh
29da0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
29db0 45 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20  Expr *pWhere){. 
29dc0 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54   int i;.  WhereT
29dd0 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f  erm *pTerm;.  fo
29de0 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  r(i=0, pTerm=pWC
29df0 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
29e00 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
29e10 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
29e20 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
29e30 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70  (pTerm->pExpr, p
29e40 57 68 65 72 65 2c 20 69 54 61 62 29 20 29 20 72  Where, iTab) ) r
29e50 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
29e60 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
29e70 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
29e80 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
29e90 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f  a single table o
29ea0 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65  f the join where
29eb0 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73   the table.** is
29ec0 20 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75   idenfied by pBu
29ed0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61  ilder->pNew->iTa
29ee0 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69  b.  That table i
29ef0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
29f00 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74  be.** a b-tree t
29f10 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74  able, not a virt
29f20 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ual table..*/.st
29f30 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
29f40 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68  opAddBtree(.  Wh
29f50 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
29f60 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45  pBuilder, /* WHE
29f70 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d  RE clause inform
29f80 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ation */.  Bitma
29f90 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20  sk mExtra       
29fa0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
29fb0 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f  prerequesites fo
29fc0 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62  r using this tab
29fd0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  le */.){.  Where
29fe0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
29ff0 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
2a000 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74  analysis context
2a010 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
2a020 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  obe;            
2a030 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65    /* An index we
2a040 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
2a050 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20  */.  Index sPk; 
2a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a070 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78   /* A fake index
2a080 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
2a090 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
2a0a0 20 74 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73   tRowcnt aiRowEs
2a0b0 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20  tPk[2];      /* 
2a0c0 54 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76  The aiRowEst[] v
2a0d0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
2a0e0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
2a0f0 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b  aiColumnPk = -1;
2a100 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
2a110 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66  Column[] value f
2a120 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
2a130 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
2a140 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
2a150 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
2a160 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
2a170 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2a180 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src;  /* The FRO
2a190 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74  M clause btree t
2a1a0 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  erm to add */.  
2a1b0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a1d0 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
2a1e0 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
2a1f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a200 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ;         /* Ret
2a210 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
2a220 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20  t iSortIdx = 1; 
2a230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2a240 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ex number */.  i
2a250 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20  nt b;           
2a260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
2a270 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f  boolean value */
2a280 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 53 69  .  WhereCost rSi
2a290 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
2a2a0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
2a2b0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
2a2c0 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 4c 6f  .  WhereCost rLo
2a2d0 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f  gSize;         /
2a2e0 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  * Logarithm of t
2a2f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
2a300 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
2a310 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
2a320 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  *pWC;           
2a330 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48  /* The parsed WH
2a340 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2a350 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
2a360 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e  er->pNew;.  pWIn
2a370 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
2a380 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73  WInfo;.  pTabLis
2a390 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
2a3a0 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70  List;.  pSrc = p
2a3b0 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
2a3c0 77 2d 3e 69 54 61 62 3b 0a 20 20 70 57 43 20 3d  w->iTab;.  pWC =
2a3d0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
2a3e0 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72    assert( !IsVir
2a3f0 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
2a400 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d   );..  if( pSrc-
2a410 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f  >pIndex ){.    /
2a420 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20  * An INDEXED BY 
2a430 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73  clause specifies
2a440 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
2a450 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  dex to use */.  
2a460 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
2a470 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65  >pIndex;.  }else
2a480 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69  {.    /* There i
2a490 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20  s no INDEXED BY 
2a4a0 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20  clause.  Create 
2a4b0 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a  a fake Index obj
2a4c0 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20  ect in local.   
2a4d0 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b   ** variable sPk
2a4e0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68   to represent th
2a4f0 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20  e rowid primary 
2a500 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  key index.  Make
2a510 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b   this.    ** fak
2a520 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72 73  e index the firs
2a530 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20  t in a chain of 
2a540 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69  Index objects wi
2a550 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65  th all of the re
2a560 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  al.    ** indice
2a570 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20  s to follow */. 
2a580 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74     Index *pFirst
2a590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a5a0 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72     /* First of r
2a5b0 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74  eal indices on t
2a5c0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
2a5d0 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20  memset(&sPk, 0, 
2a5e0 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a  sizeof(Index));.
2a5f0 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20      sPk.nColumn 
2a600 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43  = 1;.    sPk.aiC
2a610 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d  olumn = &aiColum
2a620 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52  nPk;.    sPk.aiR
2a630 6f 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74  owEst = aiRowEst
2a640 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72  Pk;.    sPk.onEr
2a650 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65  ror = OE_Replace
2a660 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65  ;.    sPk.pTable
2a670 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
2a680 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d     aiRowEstPk[0]
2a690 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e   = pSrc->pTab->n
2a6a0 52 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f  RowEst;.    aiRo
2a6b0 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20  wEstPk[1] = 1;. 
2a6c0 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63     pFirst = pSrc
2a6d0 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
2a6e0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f      if( pSrc->no
2a6f0 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20  tIndexed==0 ){. 
2a700 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c       /* The real
2a710 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20   indices of the 
2a720 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63  table are only c
2a730 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65  onsidered if the
2a740 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e  .      ** NOT IN
2a750 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20  DEXED qualifier 
2a760 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
2a770 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2a780 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65  */.      sPk.pNe
2a790 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20  xt = pFirst;.   
2a7a0 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20   }.    pProbe = 
2a7b0 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a  &sPk;.  }.  rSiz
2a7c0 65 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70 53  e = whereCost(pS
2a7d0 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73  rc->pTab->nRowEs
2a7e0 74 29 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  t);.  rLogSize =
2a7f0 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
2a800 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2a810 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
2a820 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61  NDEX.  /* Automa
2a830 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  tic indexes */. 
2a840 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e   if( !pBuilder->
2a850 70 4f 72 53 65 74 0a 20 20 20 26 26 20 28 70 57  pOrSet.   && (pW
2a860 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
2a870 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2a880 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20  _AutoIndex)!=0. 
2a890 20 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65    && pSrc->pInde
2a8a0 78 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63  x==0.   && !pSrc
2a8b0 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20  ->viaCoroutine. 
2a8c0 20 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49    && !pSrc->notI
2a8d0 6e 64 65 78 65 64 0a 20 20 20 26 26 20 21 70 53  ndexed.   && !pS
2a8e0 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  rc->isCorrelated
2a8f0 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e  .  ){.    /* Gen
2a900 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78  erate auto-index
2a910 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20   WhereLoops */. 
2a920 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
2a930 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65  erm;.    WhereTe
2a940 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43  rm *pWCEnd = pWC
2a950 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
2a960 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
2a970 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49  pWC->a; rc==SQLI
2a980 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70  TE_OK && pTerm<p
2a990 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
2a9a0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
2a9b0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
2a9c0 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
2a9d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2a9e0 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
2a9f0 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
2aa00 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  rc, 0) ){.      
2aa10 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
2aa20 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nEq = 1;.       
2aa30 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70   pNew->u.btree.p
2aa40 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
2aa50 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
2aa60 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 1;.        pNe
2aa70 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
2aa80 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Term;.        /*
2aa90 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d   TUNING: One-tim
2aaa0 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75  e cost for compu
2aab0 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74  ting the automat
2aac0 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ic index is.    
2aad0 20 20 20 20 2a 2a 20 61 70 70 72 6f 78 69 6d 61      ** approxima
2aae0 74 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32 28 4e 29  tely 7*N*log2(N)
2aaf0 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
2ab00 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
2ab10 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
2ab20 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
2ab30 65 78 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  exed. */.       
2ab40 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2ab50 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65  rLogSize + rSize
2ab60 20 2b 20 32 38 3b 20 20 61 73 73 65 72 74 28 20   + 28;  assert( 
2ab70 32 38 3d 3d 77 68 65 72 65 43 6f 73 74 28 37 29  28==whereCost(7)
2ab80 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   );.        /* T
2ab90 55 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65  UNING: Each inde
2aba0 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20  x lookup yields 
2abb0 32 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  20 rows in the t
2abc0 61 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20  able.  This.    
2abd0 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74      ** is more t
2abe0 68 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75  han the usual gu
2abf0 65 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20  ess of 10 rows, 
2ac00 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f  since we have no
2ac10 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20   way.        ** 
2ac20 6f 66 20 6b 6e 6f 77 6e 69 6e 67 20 68 6f 77 20  of knowning how 
2ac30 73 65 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e  selective the in
2ac40 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74  dex will ultimat
2ac50 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c  ely be.  It woul
2ac60 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  d.        ** not
2ac70 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65   be unreasonable
2ac80 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61   to make this va
2ac90 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e  lue much larger.
2aca0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
2acb0 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73  ->nOut = 43;  as
2acc0 73 65 72 74 28 20 34 33 3d 3d 77 68 65 72 65 43  sert( 43==whereC
2acd0 6f 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20  ost(20) );.     
2ace0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2acf0 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 4c 6f  whereCostAdd(rLo
2ad00 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74  gSize,pNew->nOut
2ad10 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
2ad20 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
2ad30 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20  _AUTO_INDEX;.   
2ad40 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
2ad50 71 20 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65  q = mExtra | pTe
2ad60 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
2ad70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
2ad80 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
2ad90 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
2ada0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2adb0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2adc0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
2add0 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20  _INDEX */..  /* 
2ade0 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
2adf0 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72  dices.  */.  for
2ae00 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
2ae10 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f   && pProbe; pPro
2ae20 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74  be=pProbe->pNext
2ae30 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20  , iSortIdx++){. 
2ae40 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70     if( pProbe->p
2ae50 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a  PartIdxWhere!=0.
2ae60 20 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73       && !whereUs
2ae70 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78  ablePartialIndex
2ae80 28 70 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57 43  (pNew->iTab, pWC
2ae90 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  , pProbe->pPartI
2aea0 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20  dxWhere) ){.    
2aeb0 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
2aec0 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e  Partial index in
2aed0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
2aee0 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20  this query */.  
2aef0 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e    }.    pNew->u.
2af00 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20  btree.nEq = 0;. 
2af10 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
2af20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
2af30 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20  SortIdx = 0;.   
2af40 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2af50 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  0;.    pNew->pre
2af60 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20  req = mExtra;.  
2af70 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
2af80 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Size;.    pNew->
2af90 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
2afa0 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d   pProbe;.    b =
2afb0 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
2afc0 69 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c  ithOrderBy(pBuil
2afd0 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72  der, pProbe, pSr
2afe0 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  c->iCursor);.   
2aff0 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f   /* The ONEPASS_
2b000 44 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65  DESIRED flags ne
2b010 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74  ver occurs toget
2b020 68 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42  her with ORDER B
2b030 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  Y */.    assert(
2b040 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
2b050 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2b060 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
2b070 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20   || b==0 );.    
2b080 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
2b090 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  <=0 ){.      /* 
2b0a0 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  Integer primary 
2b0b0 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  key index */.   
2b0c0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2b0d0 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20   = WHERE_IPK;.. 
2b0e0 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62       /* Full tab
2b0f0 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  le scan */.     
2b100 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
2b110 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
2b120 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e   0;.      /* TUN
2b130 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c  ING: Cost of ful
2b140 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20  l table scan is 
2b150 33 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e  3*(N + log2(N)).
2b160 0a 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68  .      **  +  Th
2b170 65 20 65 78 74 72 61 20 33 20 66 61 63 74 6f 72  e extra 3 factor
2b180 20 69 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65   is to encourage
2b190 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65   the use of inde
2b1a0 78 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20  xed lookups.    
2b1b0 20 20 2a 2a 20 20 20 20 20 6f 76 65 72 20 66 75    **     over fu
2b1c0 6c 6c 20 73 63 61 6e 73 2e 20 20 41 20 73 6d 61  ll scans.  A sma
2b1d0 6c 6c 65 72 20 63 6f 6e 73 74 61 6e 74 20 32 20  ller constant 2 
2b1e0 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65  is used for cove
2b1f0 72 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 20 20  ring.      **   
2b200 20 20 69 6e 64 65 78 20 73 63 61 6e 73 20 73 6f    index scans so
2b210 20 74 68 61 74 20 61 20 63 6f 76 65 72 69 6e 67   that a covering
2b220 20 69 6e 64 65 78 20 73 63 61 6e 20 77 69 6c 6c   index scan will
2b230 20 62 65 20 66 61 76 6f 72 65 64 20 6f 76 65 72   be favored over
2b240 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 61 20  .      **     a 
2b250 74 61 62 6c 65 20 73 63 61 6e 2e 20 2a 2f 0a 20  table scan. */. 
2b260 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2b270 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72  = whereCostAdd(r
2b280 53 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b  Size,rLogSize) +
2b290 20 31 36 3b 0a 20 20 20 20 20 20 77 68 65 72 65   16;.      where
2b2a0 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
2b2b0 28 70 57 43 2c 20 70 4e 65 77 2c 20 70 53 72 63  (pWC, pNew, pSrc
2b2c0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2b2d0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2b2e0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
2b2f0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e   pNew);.      pN
2b300 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
2b310 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2b320 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
2b330 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  e{.      Bitmask
2b340 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73   m = pSrc->colUs
2b350 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49  ed & ~columnsInI
2b360 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20  ndex(pProbe);.  
2b370 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
2b380 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48  s = (m==0) ? (WH
2b390 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45  ERE_IDX_ONLY|WHE
2b3a0 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48  RE_INDEXED) : WH
2b3b0 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 0a 20 20  ERE_INDEXED;..  
2b3c0 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e      /* Full scan
2b3d0 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20   via index */.  
2b3e0 20 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20      if( b.      
2b3f0 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20   || ( m==0.     
2b400 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62      && pProbe->b
2b410 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
2b420 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
2b430 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2b440 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2b450 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20  IRED)==0.       
2b460 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62    && sqlite3Glob
2b470 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73  alConfig.bUseCis
2b480 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74  .         && Opt
2b490 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
2b4a0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
2b4b0 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65  >db, SQLITE_Cove
2b4c0 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20  rIdxScan).      
2b4d0 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20      ).      ){. 
2b4e0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f         pNew->iSo
2b4f0 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72  rtIdx = b ? iSor
2b500 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20  tIdx : 0;.      
2b510 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20    if( m==0 ){.  
2b520 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
2b530 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 63 6f 76  G: Cost of a cov
2b540 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e  ering index scan
2b550 20 69 73 20 32 2a 28 4e 20 2b 20 6c 6f 67 32 28   is 2*(N + log2(
2b560 4e 29 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  N))..          *
2b570 2a 20 20 2b 20 20 54 68 65 20 65 78 74 72 61 20  *  +  The extra 
2b580 32 20 66 61 63 74 6f 72 20 69 73 20 74 6f 20 65  2 factor is to e
2b590 6e 63 6f 75 72 61 67 65 20 74 68 65 20 75 73 65  ncourage the use
2b5a0 20 6f 66 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b   of indexed look
2b5b0 75 70 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ups.          **
2b5c0 20 20 20 20 20 6f 76 65 72 20 69 6e 64 65 78 20       over index 
2b5d0 73 63 61 6e 73 2e 20 20 41 20 74 61 62 6c 65 20  scans.  A table 
2b5e0 73 63 61 6e 20 75 73 65 73 20 61 20 66 61 63 74  scan uses a fact
2b5f0 6f 72 20 6f 66 20 33 20 73 6f 20 74 68 61 74 0a  or of 3 so that.
2b600 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20            **    
2b610 20 69 6e 64 65 78 20 73 63 61 6e 73 20 61 72 65   index scans are
2b620 20 66 61 76 6f 72 65 64 20 6f 76 65 72 20 74 61   favored over ta
2b630 62 6c 65 20 73 63 61 6e 73 2e 0a 20 20 20 20 20  ble scans..     
2b640 20 20 20 20 20 2a 2a 20 20 2b 20 20 49 66 20 74       **  +  If t
2b650 68 69 73 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  his covering ind
2b660 65 78 20 6d 69 67 68 74 20 61 6c 73 6f 20 68 65  ex might also he
2b670 6c 70 20 73 61 74 69 73 66 79 20 74 68 65 20 4f  lp satisfy the O
2b680 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 20 20  RDER BY.        
2b690 20 20 2a 2a 20 20 20 20 20 63 6c 61 75 73 65 2c    **     clause,
2b6a0 20 74 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69   then the cost i
2b6b0 73 20 66 75 64 67 65 64 20 64 6f 77 6e 20 73 6c  s fudged down sl
2b6c0 69 67 68 74 6c 79 20 73 6f 20 74 68 61 74 20 74  ightly so that t
2b6d0 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
2b6e0 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 66 61       index is fa
2b6f0 76 6f 72 65 64 20 61 62 6f 76 65 20 6f 74 68 65  vored above othe
2b700 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 68  r indices that h
2b710 61 76 65 20 6e 6f 20 68 6f 70 65 20 6f 66 0a 20  ave no hope of. 
2b720 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20           **     
2b730 68 65 6c 70 69 6e 67 20 77 69 74 68 20 74 68 65  helping with the
2b740 20 4f 52 44 45 52 20 42 59 2e 20 2a 2f 0a 20 20   ORDER BY. */.  
2b750 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
2b760 75 6e 20 3d 20 31 30 20 2b 20 77 68 65 72 65 43  un = 10 + whereC
2b770 6f 73 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f  ostAdd(rSize,rLo
2b780 67 53 69 7a 65 29 20 2d 20 62 3b 0a 20 20 20 20  gSize) - b;.    
2b790 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b7a0 20 20 20 20 20 61 73 73 65 72 74 28 20 62 21 3d       assert( b!=
2b7b0 30 20 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ); .          
2b7c0 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
2b7d0 6f 66 20 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f  of scanning a no
2b7e0 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
2b7f0 20 69 73 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e   is (N+1)*log2(N
2b800 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77  ).          ** w
2b810 68 69 63 68 20 77 65 20 77 69 6c 6c 20 73 69 6d  hich we will sim
2b820 70 6c 69 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a  plify to just N*
2b830 6c 6f 67 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20  log2(N) */.     
2b840 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2b850 3d 20 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69  = rSize + rLogSi
2b860 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ze;.        }.  
2b870 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
2b880 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
2b890 20 70 4e 65 77 2c 20 70 53 72 63 2d 3e 69 43 75   pNew, pSrc->iCu
2b8a0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 72  rsor);.        r
2b8b0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2b8c0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2b8d0 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ew);.        pNe
2b8e0 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
2b8f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2b900 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
2b910 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
2b920 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
2b930 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
2b940 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
2b950 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0);.#ifdef SQLIT
2b960 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
2b970 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69  R_STAT4.    sqli
2b980 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72 65  te3Stat4ProbeFre
2b990 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  e(pBuilder->pRec
2b9a0 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  );.    pBuilder-
2b9b0 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a  >nRecValid = 0;.
2b9c0 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52      pBuilder->pR
2b9d0 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ec = 0;.#endif..
2b9e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2b9f0 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42  was an INDEXED B
2ba00 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f  Y clause, then o
2ba10 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64  nly that one ind
2ba20 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ex is.    ** con
2ba30 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20  sidered. */.    
2ba40 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  if( pSrc->pIndex
2ba50 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
2ba60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
2ba70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ba80 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
2ba90 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
2baa0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
2bab0 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  or a table of th
2bac0 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65  e join identifie
2bad0 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72  d by.** pBuilder
2bae0 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
2baf0 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
2bb00 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  ranteed to be a 
2bb10 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
2bb20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
2bb30 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
2bb40 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
2bb50 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 20 20  lder *pBuilder  
2bb60 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
2bb70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
2bb80 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
2bb90 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
2bba0 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
2bbb0 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
2bbc0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
2bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bbe0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
2bbf0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
2bc00 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
2bc10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
2bc20 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2bc30 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2bc40 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  tem *pSrc;   /* 
2bc50 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
2bc60 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
2bc70 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
2bc80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2bc90 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
2bca0 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
2bcb0 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
2bcc0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
2bcd0 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
2bce0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
2bcf0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
2bd00 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
2bd10 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2bd20 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
2bd30 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65 72  int iTerm, mxTer
2bd40 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  m;.  int nConstr
2bd50 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e  aint;.  int seen
2bd60 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  In = 0;         
2bd70 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2bd80 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  an IN operator i
2bd90 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  s seen */.  int 
2bda0 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20  seenVar = 0;    
2bdb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2bdc0 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61   if a non-consta
2bdd0 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  nt constraint is
2bde0 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   seen */.  int i
2bdf0 50 68 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  Phase;          
2be00 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f          /* 0: co
2be10 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63  nst w/o IN, 1: c
2be20 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20  onst, 2: no IN, 
2be30 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72   2: IN */.  Wher
2be40 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69  eLoop *pNew;.  i
2be50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2be60 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  K;..  pWInfo = p
2be70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
2be80 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
2be90 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  fo->pParse;.  db
2bea0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2beb0 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
2bec0 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70  >pWC;.  pNew = p
2bed0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
2bee0 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d   pSrc = &pWInfo-
2bef0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65  >pTabList->a[pNe
2bf00 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61 62  w->iTab];.  pTab
2bf10 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
2bf20 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75   assert( IsVirtu
2bf30 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70 49  al(pTab) );.  pI
2bf40 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74  dxInfo = allocat
2bf50 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73  eIndexInfo(pPars
2bf60 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70 42  e, pWC, pSrc, pB
2bf70 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79  uilder->pOrderBy
2bf80 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  );.  if( pIdxInf
2bf90 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  o==0 ) return SQ
2bfa0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e  LITE_NOMEM;.  pN
2bfb0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a  ew->prereq = 0;.
2bfc0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
2bfd0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c   0;.  pNew->wsFl
2bfe0 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54  ags = WHERE_VIRT
2bff0 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77  UALTABLE;.  pNew
2c000 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
2c010 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
2c020 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 55 73  dFree = 0;.  pUs
2c030 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  age = pIdxInfo->
2c040 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
2c050 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ;.  nConstraint 
2c060 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  = pIdxInfo->nCon
2c070 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77  straint;.  if( w
2c080 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
2c090 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72  b, pNew, nConstr
2c0a0 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  aint) ){.    sql
2c0b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2c0c0 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65  IdxInfo);.    re
2c0d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2c0e0 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50  M;.  }..  for(iP
2c0f0 68 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d  hase=0; iPhase<=
2c100 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20  3; iPhase++){.  
2c110 20 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26 26    if( !seenIn &&
2c120 20 28 69 50 68 61 73 65 26 31 29 21 3d 30 20 29   (iPhase&1)!=0 )
2c130 7b 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b 2b  {.      iPhase++
2c140 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 68 61  ;.      if( iPha
2c150 73 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20 20  se>3 ) break;.  
2c160 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65    }.    if( !see
2c170 6e 56 61 72 20 26 26 20 69 50 68 61 73 65 3e 31  nVar && iPhase>1
2c180 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49   ) break;.    pI
2c190 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
2c1a0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
2c1b0 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
2c1c0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
2c1d0 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  int;.    for(i=0
2c1e0 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  ; i<pIdxInfo->nC
2c1f0 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
2c200 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
2c210 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d     j = pIdxCons-
2c220 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
2c230 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
2c240 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77  ->a[j];.      sw
2c250 69 74 63 68 28 20 69 50 68 61 73 65 20 29 7b 0a  itch( iPhase ){.
2c260 20 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20          case 0: 
2c270 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20     /* Constants 
2c280 77 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72 61  without IN opera
2c290 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tor */.         
2c2a0 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
2c2b0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2c2c0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
2c2d0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21  erator & WO_IN)!
2c2e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c2f0 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20    seenIn = 1;.  
2c300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c310 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
2c320 72 65 72 65 71 52 69 67 68 74 21 3d 30 20 29 7b  rereqRight!=0 ){
2c330 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
2c340 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  nVar = 1;.      
2c350 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
2c360 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
2c370 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20  & WO_IN)==0 ){. 
2c380 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43             pIdxC
2c390 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b  ons->usable = 1;
2c3a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c3b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2c3c0 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20 20        case 1:   
2c3d0 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69   /* Constants wi
2c3e0 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  th IN operators 
2c3f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
2c400 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20  ert( seenIn );. 
2c410 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
2c420 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65  s->usable = (pTe
2c430 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d  rm->prereqRight=
2c440 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  =0);.          b
2c450 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
2c460 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69  se 2:    /* Vari
2c470 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e  ables without IN
2c480 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
2c490 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b  sert( seenVar );
2c4a0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
2c4b0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
2c4c0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
2c4d0 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20  & WO_IN)==0;.   
2c4e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2c4f0 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20        default:  
2c500 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69   /* Variables wi
2c510 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  th IN */.       
2c520 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56     assert( seenV
2c530 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a  ar && seenIn );.
2c540 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2c550 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a  ns->usable = 1;.
2c560 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2c570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c580 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65     memset(pUsage
2c590 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61  , 0, sizeof(pUsa
2c5a0 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d  ge[0])*pIdxInfo-
2c5b0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20  >nConstraint);. 
2c5c0 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d     if( pIdxInfo-
2c5d0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2c5e0 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
2c5f0 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74  (pIdxInfo->idxSt
2c600 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f  r);.    pIdxInfo
2c610 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  ->idxStr = 0;.  
2c620 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
2c630 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  um = 0;.    pIdx
2c640 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
2c650 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
2c660 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
2c670 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
2c680 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
2c690 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c  imatedCost = SQL
2c6a0 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64  ITE_BIG_DBL / (d
2c6b0 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 72 63 20  ouble)2;.    rc 
2c6c0 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28  = vtabBestIndex(
2c6d0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49  pParse, pTab, pI
2c6e0 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28  dxInfo);.    if(
2c6f0 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65   rc ) goto where
2c700 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74  LoopAddVtab_exit
2c710 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d  ;.    pIdxCons =
2c720 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
2c730 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
2c740 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
2c750 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  aConstraint;.   
2c760 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
2c770 30 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20  0;.    mxTerm = 
2c780 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
2c790 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43  pNew->nLSlot>=nC
2c7a0 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20  onstraint );.   
2c7b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
2c7c0 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e  straint; i++) pN
2c7d0 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20  ew->aLTerm[i] = 
2c7e0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  0;.    pNew->u.v
2c7f0 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30  tab.omitMask = 0
2c800 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2c810 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
2c820 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
2c830 20 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d        if( (iTerm
2c840 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67   = pUsage[i].arg
2c850 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29  vIndex - 1)>=0 )
2c860 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49  {.        j = pI
2c870 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
2c880 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  set;.        if(
2c890 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61   iTerm>=nConstra
2c8a0 69 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  int.         || 
2c8b0 6a 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  j<0.         || 
2c8c0 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20  j>=pWC->nTerm.  
2c8d0 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e         || pNew->
2c8e0 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30  aLTerm[iTerm]!=0
2c8f0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2c900 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c910 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
2c920 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2c930 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78  sg(pParse, "%s.x
2c940 42 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66  BestIndex() malf
2c950 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e  unction", pTab->
2c960 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2c970 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70    goto whereLoop
2c980 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20  AddVtab_exit;.  
2c990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c9a0 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
2c9b0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29  =nConstraint-1 )
2c9c0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2c9d0 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20  se( j==0 );.    
2c9e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
2c9f0 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b  =pWC->nTerm-1 );
2ca00 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
2ca10 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
2ca20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
2ca30 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  q |= pTerm->prer
2ca40 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
2ca50 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70   assert( iTerm<p
2ca60 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
2ca70 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
2ca80 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65  erm[iTerm] = pTe
2ca90 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
2caa0 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d  iTerm>mxTerm ) m
2cab0 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20  xTerm = iTerm;. 
2cac0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2cad0 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20   iTerm==15 );.  
2cae0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2caf0 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20  iTerm==16 );.   
2cb00 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31       if( iTerm<1
2cb10 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f  6 && pUsage[i].o
2cb20 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74  mit ) pNew->u.vt
2cb30 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31  ab.omitMask |= 1
2cb40 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  <<iTerm;.       
2cb50 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
2cb60 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21  erator & WO_IN)!
2cb70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2cb80 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d  if( pUsage[i].om
2cb90 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
2cba0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
2cbb0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e  ttempt to use an
2cbc0 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69   IN constraint i
2cbd0 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
2cbe0 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
2cbf0 2a 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65  ** says that the
2cc00 20 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63   equivalent EQ c
2cc10 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
2cc20 20 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74   be safely omitt
2cc30 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
2cc40 2a 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65  ** If we do atte
2cc50 6d 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20  mpt to use such 
2cc60 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f  a constraint, so
2cc70 6d 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65  me rows might be
2cc80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2cc90 72 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20  repeated in the 
2cca0 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20  output. */.     
2ccb0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2ccc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ccd0 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c      /* A virtual
2cce0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63   table that is c
2ccf0 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e  onstrained by an
2cd00 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e   IN clause may n
2cd10 6f 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ot.          ** 
2cd20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45  consume the ORDE
2cd30 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61  R BY clause beca
2cd40 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65  use (1) the orde
2cd50 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20  r of IN terms.  
2cd60 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
2cd70 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65  t necessarily re
2cd80 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64  lated to the ord
2cd90 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72  er of output ter
2cda0 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ms and.         
2cdb0 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65   ** (2) Multiple
2cdc0 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20   outputs from a 
2cdd0 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20  single IN value 
2cde0 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20  will not merge. 
2cdf0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65           ** toge
2ce00 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ther.  */.      
2ce10 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
2ce20 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
2ce30 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
2ce40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2ce50 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  f( i>=nConstrain
2ce60 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t ){.      pNew-
2ce70 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d  >nLTerm = mxTerm
2ce80 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
2ce90 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d  ( pNew->nLTerm<=
2cea0 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a  pNew->nLSlot );.
2ceb0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
2cec0 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78  ab.idxNum = pIdx
2ced0 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20  Info->idxNum;.  
2cee0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2cef0 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78  .needFree = pIdx
2cf00 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
2cf10 49 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49  IdxStr;.      pI
2cf20 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
2cf30 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
2cf40 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2cf50 2e 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e  .idxStr = pIdxIn
2cf60 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20  fo->idxStr;.    
2cf70 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
2cf80 73 4f 72 64 65 72 65 64 20 3d 20 28 75 38 29 28  sOrdered = (u8)(
2cf90 28 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65  (pIdxInfo->nOrde
2cfa0 72 42 79 21 3d 30 29 0a 20 20 20 20 20 20 20 20  rBy!=0).        
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2cfd0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
2cfe0 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20  yConsumed);.    
2cff0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
2d000 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
2d010 72 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74  rRun = whereCost
2d020 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49  FromDouble(pIdxI
2d030 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
2d040 73 74 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  st);.      /* TU
2d050 4e 49 4e 47 3a 20 45 76 65 72 79 20 76 69 72 74  NING: Every virt
2d060 75 61 6c 20 74 61 62 6c 65 20 71 75 65 72 79 20  ual table query 
2d070 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20  returns 25 rows 
2d080 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  */.      pNew->n
2d090 4f 75 74 20 3d 20 34 36 3b 20 20 61 73 73 65 72  Out = 46;  asser
2d0a0 74 28 20 34 36 3d 3d 77 68 65 72 65 43 6f 73 74  t( 46==whereCost
2d0b0 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 77 68  (25) );.      wh
2d0c0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
2d0d0 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
2d0e0 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75       if( pNew->u
2d0f0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29  .vtab.needFree )
2d100 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2d110 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76  3_free(pNew->u.v
2d120 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
2d130 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
2d140 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
2d150 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d160 7d 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64  }  ..whereLoopAd
2d170 64 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66  dVtab_exit:.  if
2d180 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
2d190 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73  ToFreeIdxStr ) s
2d1a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78  qlite3_free(pIdx
2d1b0 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20  Info->idxStr);. 
2d1c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2d1d0 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
2d1e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
2d1f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2d200 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
2d210 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68  */../*.** Add Wh
2d220 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20  ereLoop entries 
2d230 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72  to handle OR ter
2d240 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  ms.  This works 
2d250 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74  for either.** bt
2d260 72 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20  rees or virtual 
2d270 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
2d280 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
2d290 64 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42 75  ddOr(WhereLoopBu
2d2a0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
2d2b0 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 29   Bitmask mExtra)
2d2c0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
2d2d0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
2d2e0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72  ->pWInfo;.  Wher
2d2f0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20  eClause *pWC;.  
2d300 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
2d310 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
2d320 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20  erm, *pWCEnd;.  
2d330 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2d340 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a  OK;.  int iCur;.
2d350 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65    WhereClause te
2d360 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  mpWC;.  WhereLoo
2d370 70 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69  pBuilder sSubBui
2d380 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74  ld;.  WhereOrSet
2d390 20 73 53 75 6d 2c 20 73 43 75 72 2c 20 73 50 72   sSum, sCur, sPr
2d3a0 65 76 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  ev;.  struct Src
2d3b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2d3c0 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75  ;.  .  pWC = pBu
2d3d0 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66  ilder->pWC;.  if
2d3e0 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
2d3f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44  lags & WHERE_AND
2d400 5f 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53  _ONLY ) return S
2d410 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45  QLITE_OK;.  pWCE
2d420 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
2d430 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77  C->nTerm;.  pNew
2d440 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
2d450 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75  w;.  memset(&sSu
2d460 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75  m, 0, sizeof(sSu
2d470 6d 29 29 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72  m));..  for(pTer
2d480 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
2d490 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51  pWCEnd && rc==SQ
2d4a0 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b  LITE_OK; pTerm++
2d4b0 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  ){.    if( (pTer
2d4c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2d4d0 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26  O_OR)!=0.     &&
2d4e0 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   (pTerm->u.pOrIn
2d4f0 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20  fo->indexable & 
2d500 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  pNew->maskSelf)!
2d510 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
2d520 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63   WhereClause * c
2d530 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54  onst pOrWC = &pT
2d540 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
2d550 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  wc;.      WhereT
2d560 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  erm * const pOrW
2d570 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61  CEnd = &pOrWC->a
2d580 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  [pOrWC->nTerm];.
2d590 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
2d5a0 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20  *pOrTerm;.      
2d5b0 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20  int once = 1;.  
2d5c0 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
2d5d0 20 20 0a 20 20 20 20 20 20 70 49 74 65 6d 20 3d    .      pItem =
2d5e0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2d5f0 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
2d600 62 3b 0a 20 20 20 20 20 20 69 43 75 72 20 3d 20  b;.      iCur = 
2d610 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
2d620 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 20        sSubBuild 
2d630 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20  = *pBuilder;.   
2d640 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72     sSubBuild.pOr
2d650 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
2d660 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65   sSubBuild.pOrSe
2d670 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20  t = &sCur;..    
2d680 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f    for(pOrTerm=pO
2d690 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c  rWC->a; pOrTerm<
2d6a0 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72  pOrWCEnd; pOrTer
2d6b0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
2d6c0 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
2d6d0 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21  rator & WO_AND)!
2d6e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2d6f0 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
2d700 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64  &pOrTerm->u.pAnd
2d710 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
2d720 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
2d730 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
2d740 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =iCur ){.       
2d750 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f     tempWC.pWInfo
2d760 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a   = pWC->pWInfo;.
2d770 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
2d780 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20  .pOuter = pWC;. 
2d790 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2d7a0 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
2d7b0 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54         tempWC.nT
2d7c0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
2d7d0 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f     tempWC.a = pO
2d7e0 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  rTerm;.         
2d7f0 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
2d800 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20   &tempWC;.      
2d810 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d820 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2d830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
2d840 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 6e 64  Cur.n = 0;.#ifnd
2d850 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2d860 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2d870 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
2d880 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
2d890 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2d8a0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
2d8b0 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64 29  tual(&sSubBuild)
2d8c0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2d8d0 69 3d 30 3b 20 69 3c 73 43 75 72 2e 6e 3b 20 69  i=0; i<sCur.n; i
2d8e0 2b 2b 29 20 73 43 75 72 2e 61 5b 69 5d 2e 70 72  ++) sCur.a[i].pr
2d8f0 65 72 65 71 20 7c 3d 20 6d 45 78 74 72 61 3b 0a  ereq |= mExtra;.
2d900 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
2d910 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
2d920 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
2d930 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
2d940 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74  &sSubBuild, mExt
2d950 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ra);.        }. 
2d960 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
2d970 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
2d980 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20  sCur.n==0 );.   
2d990 20 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d       if( sCur.n=
2d9a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2d9b0 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  sSum.n = 0;.    
2d9c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2d9d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
2d9e0 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nce ){.         
2d9f0 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53   whereOrMove(&sS
2da00 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20  um, &sCur);.    
2da10 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a        once = 0;.
2da20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2da30 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
2da40 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26 73 53  Move(&sPrev, &sS
2da50 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  um);.          s
2da60 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  Sum.n = 0;.     
2da70 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2da80 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20  sPrev.n; i++){. 
2da90 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
2daa0 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b  =0; j<sCur.n; j+
2dab0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2dac0 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28    whereOrInsert(
2dad0 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69  &sSum, sPrev.a[i
2dae0 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e  ].prereq | sCur.
2daf0 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20  a[j].prereq,.   
2db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db10 20 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6f           whereCo
2db20 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
2db30 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d  .rRun, sCur.a[j]
2db40 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20  .rRun),.        
2db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db60 20 20 20 20 77 68 65 72 65 43 6f 73 74 41 64 64      whereCostAdd
2db70 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74  (sPrev.a[i].nOut
2db80 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74  , sCur.a[j].nOut
2db90 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
2dba0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2dbb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2dbc0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
2dbd0 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e  rm = 1;.      pN
2dbe0 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  ew->aLTerm[0] = 
2dbf0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65  pTerm;.      pNe
2dc00 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
2dc10 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20  RE_MULTI_OR;.   
2dc20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
2dc30 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 0;.      pNew-
2dc40 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20  >iSortIdx = 0;. 
2dc50 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65       memset(&pNe
2dc60 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28  w->u, 0, sizeof(
2dc70 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20  pNew->u));.     
2dc80 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
2dc90 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75  LITE_OK && i<sSu
2dca0 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  m.n; i++){.     
2dcb0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 75     /* TUNING: Mu
2dcc0 6c 74 69 70 6c 65 20 62 79 20 33 2e 35 20 66 6f  ltiple by 3.5 fo
2dcd0 72 20 74 68 65 20 73 65 63 6f 6e 64 61 72 79 20  r the secondary 
2dce0 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 2a 2f 0a  table lookup */.
2dcf0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
2dd00 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  un = sSum.a[i].r
2dd10 52 75 6e 20 2b 20 31 38 3b 0a 20 20 20 20 20 20  Run + 18;.      
2dd20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
2dd30 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20  Sum.a[i].nOut;. 
2dd40 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
2dd50 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  req = sSum.a[i].
2dd60 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20  prereq;.        
2dd70 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
2dd80 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
2dd90 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
2dda0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2ddb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
2ddc0 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
2ddd0 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20  objects for all 
2dde0 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69  tables .*/.stati
2ddf0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
2de00 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42  ddAll(WhereLoopB
2de10 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
2de20 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
2de30 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
2de40 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74  r->pWInfo;.  Bit
2de50 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b  mask mExtra = 0;
2de60 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f  .  Bitmask mPrio
2de70 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61  r = 0;.  int iTa
2de80 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  b;.  SrcList *pT
2de90 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
2dea0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  >pTabList;.  str
2deb0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2dec0 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
2ded0 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
2dee0 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69  >pParse->db;.  i
2def0 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57  nt nTabList = pW
2df00 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  Info->nLevel;.  
2df10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2df20 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f  OK;.  u8 priorJo
2df30 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68  inType = 0;.  Wh
2df40 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a  ereLoop *pNew;..
2df50 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74    /* Loop over t
2df60 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
2df70 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74   join, from left
2df80 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70   to right */.  p
2df90 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
2dfa0 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  pNew;.  whereLoo
2dfb0 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66  pInit(pNew);.  f
2dfc0 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d  or(iTab=0, pItem
2dfd0 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54  =pTabList->a; iT
2dfe0 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61  ab<nTabList; iTa
2dff0 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  b++, pItem++){. 
2e000 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20     pNew->iTab = 
2e010 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  iTab;.    pNew->
2e020 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61  maskSelf = getMa
2e030 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
2e040 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
2e050 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
2e060 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  (pItem->jointype
2e070 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20  |priorJoinType) 
2e080 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
2e090 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  OSS))!=0 ){.    
2e0a0 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f    mExtra = mPrio
2e0b0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  r;.    }.    pri
2e0c0 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74  orJoinType = pIt
2e0d0 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
2e0e0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
2e0f0 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  pItem->pTab) ){.
2e100 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2e110 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70  LoopAddVirtual(p
2e120 42 75 69 6c 64 65 72 29 3b 0a 20 20 20 20 7d 65  Builder);.    }e
2e130 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2e140 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
2e150 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74  e(pBuilder, mExt
2e160 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ra);.    }.    i
2e170 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e180 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
2e190 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42  hereLoopAddOr(pB
2e1a0 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
2e1b0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f  .    }.    mPrio
2e1c0 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  r |= pNew->maskS
2e1d0 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20  elf;.    if( rc 
2e1e0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2e1f0 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  led ) break;.  }
2e200 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
2e210 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72  r(db, pNew);.  r
2e220 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2e230 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65  ** Examine a Whe
2e240 72 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65  rePath (with the
2e250 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65   addition of the
2e260 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70   extra WhereLoop
2e270 20 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70   of the 5th.** p
2e280 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65  arameters) to se
2e290 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20  e if it outputs 
2e2a0 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75  rows in the requ
2e2b0 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a  ested ORDER BY.*
2e2c0 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  * (or GROUP BY) 
2e2d0 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e  without requirin
2e2e0 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72  g a separate sor
2e2f0 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65  t operation.  Re
2e300 74 75 72 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20  turn:.** .**    
2e310 30 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73 20  0:  ORDER BY is 
2e320 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2e 20 20  not satisfied.  
2e330 53 6f 72 74 69 6e 67 20 72 65 71 75 69 72 65 64  Sorting required
2e340 0a 2a 2a 20 20 20 20 31 3a 20 20 4f 52 44 45 52  .**    1:  ORDER
2e350 20 42 59 20 69 73 20 73 61 74 69 73 66 69 65 64   BY is satisfied
2e360 2e 20 20 20 20 20 20 4f 6d 69 74 20 73 6f 72 74  .      Omit sort
2e370 69 6e 67 0a 2a 2a 20 20 20 2d 31 3a 20 20 55 6e  ing.**   -1:  Un
2e380 6b 6e 6f 77 6e 20 61 74 20 74 68 69 73 20 74 69  known at this ti
2e390 6d 65 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  me.**.** Note th
2e3a0 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  at processing fo
2e3b0 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  r WHERE_GROUPBY 
2e3c0 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e  and WHERE_DISTIN
2e3d0 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a  CTBY is not as.*
2e3e0 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20  * strict.  With 
2e3f0 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
2e400 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72  TINCT the only r
2e410 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68  equirement is th
2e420 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  at.** equivalent
2e430 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d   rows appear imm
2e440 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e  ediately adjacen
2e450 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72  t to one another
2e460 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61  .  GROUP BY.** a
2e470 6e 64 20 44 49 53 54 49 4e 54 20 64 6f 20 6e 6f  nd DISTINT do no
2e480 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74  t require rows t
2e490 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20  o appear in any 
2e4a0 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
2e4b0 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65   as long.** as e
2e4c0 71 75 69 76 65 6c 65 6e 74 20 72 6f 77 73 20 61  quivelent rows a
2e4d0 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  re grouped toget
2e4e0 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47  her.  Thus for G
2e4f0 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
2e500 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64  INCT.** the pOrd
2e510 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62  erBy terms can b
2e520 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79  e matched in any
2e530 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52   order.  With OR
2e540 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20  DER BY, the .** 
2e550 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d  pOrderBy terms m
2e560 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69  ust be matched i
2e570 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f  n strict left-to
2e580 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f  -right order..*/
2e590 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2e5a0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
2e5b0 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e  derBy(.  WhereIn
2e5c0 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f  fo *pWInfo,    /
2e5d0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
2e5e0 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
2e5f0 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
2e600 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
2e610 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43  UP BY or DISTINC
2e620 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63  T clause to chec
2e630 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  k */.  WherePath
2e640 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20   *pPath,     /* 
2e650 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f  The WherePath to
2e660 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20   check */.  u16 
2e670 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
2e680 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61    /* Might conta
2e690 69 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  in WHERE_GROUPBY
2e6a0 20 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e   or WHERE_DISTIN
2e6b0 43 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c  CTBY */.  u16 nL
2e6c0 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
2e6d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
2e6e0 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61  ries in pPath->a
2e6f0 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  Loop[] */.  Wher
2e700 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20  eLoop *pLast,   
2e710 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68    /* Add this Wh
2e720 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65  ereLoop to the e
2e730 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f  nd of pPath->aLo
2e740 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  op[] */.  Bitmas
2e750 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20  k *pRevMask     
2e760 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20  /* OUT: Mask of 
2e770 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75  WhereLoops to ru
2e780 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
2e790 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65  er */.){.  u8 re
2e7a0 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  vSet;           
2e7b0 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20   /* True if rev 
2e7c0 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38  is known */.  u8
2e7d0 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
2e7e0 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65      /* Composite
2e7f0 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
2e800 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20   u8 revIdx;     
2e810 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2e820 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
2e830 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  u8 isOrderDistin
2e840 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69  ct;   /* All pri
2e850 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72  or WhereLoops ar
2e860 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
2e870 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63   */.  u8 distinc
2e880 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54  tColumns;   /* T
2e890 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20  rue if the loop 
2e8a0 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e  has UNIQUE NOT N
2e8b0 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ULL columns */. 
2e8c0 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20   u8 isMatch;    
2e8d0 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d         /* iColum
2e8e0 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d  n matches a term
2e8f0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
2e900 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36   clause */.  u16
2e910 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   nColumn;       
2e920 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e930 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65  columns in pInde
2e940 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65  x */.  u16 nOrde
2e950 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
2e960 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20  Number terms in 
2e970 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2e980 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  use */.  int iLo
2e990 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  op;            /
2e9a0 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65  * Index of Where
2e9b0 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65  Loop in pPath be
2e9c0 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f  ing processed */
2e9d0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
2e9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2e9f0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
2ea00 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
2ea10 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
2ea20 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e  umber for curren
2ea30 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20  t WhereLoop */. 
2ea40 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
2ea50 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75         /* A colu
2ea60 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e  mn number within
2ea70 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20   table iCur */. 
2ea80 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
2ea90 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e  p = 0; /* Curren
2eaa0 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e  t WhereLoop bein
2eab0 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a  g processed. */.
2eac0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2ead0 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e  rm;     /* A sin
2eae0 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
2eaf0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2eb00 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b    Expr *pOBExpr;
2eb10 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
2eb20 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
2eb30 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2eb40 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e */.  CollSeq *
2eb50 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20  pColl;       /* 
2eb60 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e  COLLATE function
2eb70 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42   from an ORDER B
2eb80 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  Y clause term */
2eb90 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
2eba0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
2ebb0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
2ebc0 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20   with pLoop */. 
2ebd0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2ebe0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
2ebf0 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  b;  /* Database 
2ec00 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
2ec10 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20  Bitmask obSat = 
2ec20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  0;    /* Mask of
2ec30 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
2ec40 73 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72  satisfied so far
2ec50 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
2ec60 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Done;       /* M
2ec70 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52  ask of all ORDER
2ec80 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42   BY terms */.  B
2ec90 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74  itmask orderDist
2eca0 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61  inctMask;  /* Ma
2ecb0 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f  sk of all well-o
2ecc0 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a  rdered loops */.
2ecd0 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b    Bitmask ready;
2ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ecf0 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c   Mask of inner l
2ed00 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  oops */..  /*.  
2ed10 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
2ed20 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d  ereLoop is "one-
2ed30 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72  row" if it gener
2ed40 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  ates no more tha
2ed50 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f  n one.  ** row o
2ed60 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65  f output.  A Whe
2ed70 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f  reLoop is one-ro
2ed80 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  w if all of the 
2ed90 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
2eda0 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c  ue:.  **  (a) Al
2edb0 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
2edc0 6d 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45  match with WHERE
2edd0 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a  _COLUMN_EQ..  **
2ede0 20 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20    (b) The index 
2edf0 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41  is unique.  ** A
2ee00 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74  ny WhereLoop wit
2ee10 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d  h an WHERE_COLUM
2ee20 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20  N_EQ constraint 
2ee30 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20  on the rowid is 
2ee40 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76  one-row..  ** Ev
2ee50 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72  ery one-row Wher
2ee60 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20  eLoop will have 
2ee70 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  the WHERE_ONEROW
2ee80 20 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c   bit set in wsFl
2ee90 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ags..  **.  ** W
2eea0 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
2eeb0 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69  oop is "order-di
2eec0 73 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73  stinct" if the s
2eed0 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72  et of columns fr
2eee0 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65  om.  ** that Whe
2eef0 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20  reLoop that are 
2ef00 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
2ef10 63 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65  clause are diffe
2ef20 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20  rent for every. 
2ef30 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57   ** row of the W
2ef40 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79  hereLoop.  Every
2ef50 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f   one-row WhereLo
2ef60 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  op is automatica
2ef70 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64  lly.  ** order-d
2ef80 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65  istinct.   A Whe
2ef90 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20  reLoop that has 
2efa0 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  no columns in th
2efb0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2efc0 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72  e.  ** is not or
2efd0 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f  der-distinct. To
2efe0 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
2eff0 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20  ct is not quite 
2f000 74 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e  the same as bein
2f010 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69  g.  ** UNIQUE si
2f020 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c  nce a UNIQUE col
2f030 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  umn or index can
2f040 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72   have multiple r
2f050 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61  ows that .  ** a
2f060 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c  re NULL and NULL
2f070 20 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69   values are equi
2f080 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70  valent for the p
2f090 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d  urpose of order-
2f0a0 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54  distinct..  ** T
2f0b0 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69  o be order-disti
2f0c0 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73  nct, the columns
2f0d0 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20   must be UNIQUE 
2f0e0 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20  and NOT NULL..  
2f0f0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  **.  ** The rowi
2f100 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73  d for a table is
2f110 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61   always UNIQUE a
2f120 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77  nd NOT NULL so w
2f130 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a  henever the.  **
2f140 20 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69   rowid appears i
2f150 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
2f160 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65  lause, the corre
2f170 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f  sponding WhereLo
2f180 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d  op is.  ** autom
2f190 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64  atically order-d
2f1a0 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20  istinct..  */.. 
2f1b0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
2f1c0 79 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f  y!=0 );..  /* So
2f1d0 72 74 61 62 69 6c 69 74 79 20 6f 66 20 76 69 72  rtability of vir
2f1e0 74 75 61 6c 20 74 61 62 6c 65 73 20 69 73 20 64  tual tables is d
2f1f0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
2f200 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
2f210 6f 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 76  od.  ** of the v
2f220 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 74 73  irtual table its
2f230 65 6c 66 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61  elf */.  if( pLa
2f240 73 74 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  st->wsFlags & WH
2f250 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2f260 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
2f270 28 20 6e 4c 6f 6f 70 3e 30 20 29 3b 20 20 2f 2a  ( nLoop>0 );  /*
2f280 20 54 72 75 65 20 77 68 65 6e 20 6f 75 74 65 72   True when outer
2f290 20 6c 6f 6f 70 73 20 61 72 65 20 6f 6e 65 2d 72   loops are one-r
2f2a0 6f 77 20 61 6e 64 20 6d 61 74 63 68 20 0a 20 20  ow and match .  
2f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2c0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 20 4f 52          ** no OR
2f2d0 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
2f2e0 20 20 20 20 72 65 74 75 72 6e 20 70 4c 61 73 74      return pLast
2f2f0 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
2f300 65 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c  ed;.  }.  if( nL
2f310 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  oop && Optimizat
2f320 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
2f330 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64  SQLITE_OrderById
2f340 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  xJoin) ) return 
2f350 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d  0;..  nOrderBy =
2f360 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
2f370 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f  ;.  testcase( nO
2f380 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b  rderBy==BMS-1 );
2f390 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e  .  if( nOrderBy>
2f3a0 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30  BMS-1 ) return 0
2f3b0 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74  ;  /* Cannot opt
2f3c0 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72  imize overly lar
2f3d0 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a  ge ORDER BYs */.
2f3e0 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2f3f0 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20  t = 1;.  obDone 
2f400 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72  = MASKBIT(nOrder
2f410 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69  By)-1;.  orderDi
2f420 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a  stinctMask = 0;.
2f430 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66    ready = 0;.  f
2f440 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72  or(iLoop=0; isOr
2f450 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f  derDistinct && o
2f460 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69  bSat<obDone && i
2f470 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f  Loop<=nLoop; iLo
2f480 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69  op++){.    if( i
2f490 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c  Loop>0 ) ready |
2f4a0 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  = pLoop->maskSel
2f4b0 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69  f;.    pLoop = i
2f4c0 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61  Loop<nLoop ? pPa
2f4d0 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  th->aLoop[iLoop]
2f4e0 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 61 73   : pLast;.    as
2f4f0 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
2f500 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
2f510 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
2f520 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57 49  ;.    iCur = pWI
2f530 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
2f540 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43  [pLoop->iTab].iC
2f550 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d  ursor;..    /* M
2f560 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45  ark off any ORDE
2f570 52 20 42 59 20 74 65 72 6d 20 58 20 74 68 61 74  R BY term X that
2f580 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
2f590 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20  the table of.   
2f5a0 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
2f5b0 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74  loop for which t
2f5c0 68 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20  here is term in 
2f5d0 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a  the WHERE.    **
2f5e0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
2f5f0 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72  orm X IS NULL or
2f600 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65   X=? that refere
2f610 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20  nce only outer. 
2f620 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20     ** loops..   
2f630 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
2f640 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
2f650 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53  ){.      if( MAS
2f660 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
2f670 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2f680 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69    pOBExpr = sqli
2f690 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2f6a0 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  te(pOrderBy->a[i
2f6b0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
2f6c0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
2f6d0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
2f6e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
2f6f0 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65   pOBExpr->iTable
2f700 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
2f710 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  e;.      pTerm =
2f720 20 66 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66   findTerm(&pWInf
2f730 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f  o->sWC, iCur, pO
2f740 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a  BExpr->iColumn,.
2f750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f760 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20 57         ~ready, W
2f770 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20  O_EQ|WO_ISNULL, 
2f780 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  0);.      if( pT
2f790 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  erm==0 ) continu
2f7a0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  e;.      if( (pT
2f7b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57  erm->eOperator&W
2f7c0 4f 5f 45 51 29 21 3d 30 20 26 26 20 70 4f 42 45  O_EQ)!=0 && pOBE
2f7d0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
2f7e0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
2f7f0 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a   char *z1, *z2;.
2f800 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
2f810 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2f820 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
2f830 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
2f840 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
2f850 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
2f860 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
2f870 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31  Coll;.        z1
2f880 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b   = pColl->zName;
2f890 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2f8a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2f8b0 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
2f8c0 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
2f8d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
2f8e0 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
2f8f0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2f900 20 20 20 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c         z2 = pCol
2f910 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l->zName;.      
2f920 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2f930 49 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20  ICmp(z1, z2)!=0 
2f940 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2f950 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20    }.      obSat 
2f960 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
2f970 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
2f980 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2f990 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
2f9a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
2f9b0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2f9c0 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20  HERE_IPK ){.    
2f9d0 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
2f9e0 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
2f9f0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
2fa00 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70   if( (pIndex = p
2fa10 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2fa20 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64  ndex)==0 || pInd
2fa30 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
2fa40 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2fa50 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
2fa60 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
2fa70 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   = pIndex->nColu
2fa80 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72  mn;.        isOr
2fa90 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 70 49  derDistinct = pI
2faa0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
2fab0 45 5f 4e 6f 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  E_None;.      }.
2fac0 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74  .      /* Loop t
2fad0 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d  hrough all colum
2fae0 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ns of the index 
2faf0 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74 68  and deal with th
2fb00 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20  e ones.      ** 
2fb10 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e  that are not con
2fb20 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f  strained by == o
2fb30 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  r IN..      */. 
2fb40 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 53 65       rev = revSe
2fb50 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69 73  t = 0;.      dis
2fb60 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30  tinctColumns = 0
2fb70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
2fb80 20 6a 3c 3d 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b   j<=nColumn; j++
2fb90 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f  ){.        u8 bO
2fba0 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 74  nce;   /* True t
2fbb0 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20  o run the ORDER 
2fbc0 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a  BY search loop *
2fbd0 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 6b  /..        /* Sk
2fbe0 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49  ip over == and I
2fbf0 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a  S NULL terms */.
2fc00 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c          if( j<pL
2fc10 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
2fc20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 69  .         && ((i
2fc30 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
2fc40 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20  [j]->eOperator) 
2fc50 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  & (WO_EQ|WO_ISNU
2fc60 4c 4c 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  LL))!=0.        
2fc70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2fc80 20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29   i & WO_ISNULL )
2fc90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
2fca0 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
2fcb0 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
2fcc0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2fcd0 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
2fce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fcf0 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20    continue;  .  
2fd00 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2fd10 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75   /* Get the colu
2fd20 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  mn number in the
2fd30 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29   table (iColumn)
2fd40 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a   and sort order.
2fd50 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49          ** (revI
2fd60 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68  dx) for the j-th
2fd70 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
2fd80 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndex..        */
2fd90 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 6e  .        if( j<n
2fda0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
2fdb0 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 69 6e      /* Normal in
2fdc0 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  dex columns */. 
2fdd0 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
2fde0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c   = pIndex->aiCol
2fdf0 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
2fe00 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65    revIdx = pInde
2fe10 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  x->aSortOrder[j]
2fe20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2fe30 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d  iColumn==pIndex-
2fe40 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29  >pTable->iPKey )
2fe50 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
2fe60 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2fe70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 52          /* The R
2fe80 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 61 74 20 74  OWID column at t
2fe90 68 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20  he end */.      
2fea0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e      assert( j==n
2feb0 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20  Column );.      
2fec0 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31      iColumn = -1
2fed0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49  ;.          revI
2fee0 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dx = 0;.        
2fef0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  }..        /* An
2ff00 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63   unconstrained c
2ff10 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74  olumn that might
2ff20 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74   be NULL means t
2ff30 68 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20  hat this.       
2ff40 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73   ** WhereLoop is
2ff50 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65   not well-ordere
2ff60 64 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d .        */.  
2ff70 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
2ff80 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20  rDistinct.      
2ff90 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30     && iColumn>=0
2ffa0 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d  .         && j>=
2ffb0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
2ffc0 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  Eq.         && p
2ffd0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61  Index->pTable->a
2ffe0 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  Col[iColumn].not
2fff0 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  Null==0.        
30000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
30010 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
30020 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
30030 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65       /* Find the
30040 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74   ORDER BY term t
30050 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
30060 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  to the j-th colu
30070 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  mn.        ** of
30080 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 61   the index and a
30090 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44  nd mark that ORD
300a0 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a  ER BY term off .
300b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
300c0 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20     bOnce = 1;.  
300d0 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
300e0 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
300f0 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e  =0; bOnce && i<n
30100 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
30110 20 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53           if( MAS
30120 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
30130 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
30140 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20        pOBExpr = 
30150 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
30160 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d  ollate(pOrderBy-
30170 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
30180 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
30190 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
301a0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
301b0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
301c0 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
301d0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
301e0 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Y );.          i
301f0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
30200 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c   (WHERE_GROUPBY|
30210 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
30220 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20  ))==0 ) bOnce = 
30230 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
30240 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
30250 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
30260 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
30270 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
30280 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
30290 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
302a0 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  ( pOBExpr->iColu
302b0 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  mn!=iColumn ) co
302c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
302d0 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30    if( iColumn>=0
302e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
302f0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
30300 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
30310 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
30320 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
30330 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
30340 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
30350 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
30360 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
30370 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
30380 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
30390 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d  Index->azColl[j]
303a0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
303b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
303c0 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d         isMatch =
303d0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
303e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
303f0 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74         if( isMat
30400 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
30410 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  if( iColumn<0 ){
30420 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
30430 74 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43  tcase( distinctC
30440 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20  olumns==0 );.   
30450 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63           distinc
30460 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20  tColumns = 1;.  
30470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30480 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
30490 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
304a0 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
304b0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
304c0 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29  RE_GROUPBY)==0 )
304d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
304e0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
304f0 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d  ort order is com
30500 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52  patible in an OR
30510 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
30520 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f             ** So
30530 72 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65  rt order is irre
30540 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f  levant for a GRO
30550 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f  UP BY clause. */
30560 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30570 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20   revSet ){.     
30580 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65           if( (re
30590 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72  v ^ revIdx)!=pOr
305a0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
305b0 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 30  Order ) return 0
305c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
305d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
305e0 20 20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20     rev = revIdx 
305f0 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ^ pOrderBy->a[i]
30600 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
30610 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
30620 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d  v ) *pRevMask |=
30630 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b   MASKBIT(iLoop);
30640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
30650 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  evSet = 1;.     
30660 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30670 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
30680 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
30690 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20   No match found 
306a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
306b0 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 43 6f 6c 75   j==0 || j<nColu
306c0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
306d0 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
306e0 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29  derDistinct!=0 )
306f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  ;.            is
30700 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
30710 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
30720 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
30730 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30740 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76  } /* end Loop ov
30750 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c  er all index col
30760 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  umns */.      if
30770 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
30780 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  s ){.        tes
30790 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
307a0 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20  stinct==0 );.   
307b0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
307c0 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  inct = 1;.      
307d0 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69  }.    } /* end-i
307e0 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f  f not one-row */
307f0 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
30800 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45  f any other ORDE
30810 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20  R BY terms that 
30820 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20  reference pLoop 
30830 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64  */.    if( isOrd
30840 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  erDistinct ){.  
30850 20 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63      orderDistinc
30860 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e  tMask |= pLoop->
30870 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
30880 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
30890 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
308a0 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
308b0 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
308c0 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
308d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
308e0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
308f0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
30900 20 69 66 28 20 28 65 78 70 72 54 61 62 6c 65 55   if( (exprTableU
30910 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  sage(&pWInfo->sM
30920 61 73 6b 53 65 74 2c 20 70 29 26 7e 6f 72 64 65  askSet, p)&~orde
30930 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d  rDistinctMask)==
30940 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 ){.          o
30950 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
30960 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
30970 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
30980 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20  /* End the loop 
30990 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f  over all WhereLo
309a0 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d  ops from outer-m
309b0 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65  ost down to inne
309c0 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20  r-most */.  if( 
309d0 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20  obSat==obDone ) 
309e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
309f0 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74  !isOrderDistinct
30a00 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
30a10 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66  eturn -1;.}..#if
30a20 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
30a30 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65  NABLED./* For de
30a40 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
30a50 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  : */.static cons
30a60 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61 74  t char *wherePat
30a70 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68 20  hName(WherePath 
30a80 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f  *pPath, int nLoo
30a90 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  p, WhereLoop *pL
30aa0 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ast){.  static c
30ab0 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20  har zName[65];. 
30ac0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
30ad0 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29  0; i<nLoop; i++)
30ae0 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61  { zName[i] = pPa
30af0 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49  th->aLoop[i]->cI
30b00 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74  d; }.  if( pLast
30b10 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20   ) zName[i++] = 
30b20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e  pLast->cId;.  zN
30b30 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65  ame[i] = 0;.  re
30b40 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65  turn zName;.}.#e
30b50 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ndif.../*.** Giv
30b60 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  en the list of W
30b70 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
30b80 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f   at pWInfo->pLoo
30b90 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ps, this routine
30ba0 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
30bb0 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  find the lowest 
30bc0 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76  cost path that v
30bd0 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65  isits each Where
30be0 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54  Loop.** once.  T
30bf0 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e  his path is then
30c00 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65   loaded into the
30c10 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c   pWInfo->a[].pWL
30c20 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a  oop fields..**.*
30c30 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68  * Assume that th
30c40 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
30c50 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68  f output rows th
30c60 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  at will need to 
30c70 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c  be sorted.** wil
30c80 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e  l be nRowEst (in
30c90 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70   the 10*log2 rep
30ca0 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f  resentation).  O
30cb0 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e  r, ignore sortin
30cc0 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52  g.** costs if nR
30cd0 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  owEst==0..**.** 
30ce0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
30cf0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53   on success or S
30d00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61  QLITE_NOMEM of a
30d10 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
30d20 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  on.** error occu
30d30 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
30d40 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65  t wherePathSolve
30d50 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  r(WhereInfo *pWI
30d60 6e 66 6f 2c 20 57 68 65 72 65 43 6f 73 74 20 6e  nfo, WhereCost n
30d70 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d  RowEst){.  int m
30d80 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20  xChoice;        
30d90 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
30da0 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74  number of simult
30db0 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61  aneous paths tra
30dc0 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  cked */.  int nL
30dd0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
30de0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
30df0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f   terms in the jo
30e00 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  in */.  Parse *p
30e10 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
30e20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
30e30 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
30e40 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
30e50 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
30e60 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
30e70 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
30e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30e90 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76   Loop counter ov
30ea0 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  er the terms of 
30eb0 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e  the join */.  in
30ec0 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20  t ii, jj;       
30ed0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
30ee0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
30ef0 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20  t mxI = 0;      
30f00 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
30f10 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74   of next entry t
30f20 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 57  o replace */.  W
30f30 68 65 72 65 43 6f 73 74 20 72 43 6f 73 74 3b 20  hereCost rCost; 
30f40 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
30f50 20 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a 20 20   of a path */.  
30f60 57 68 65 72 65 43 6f 73 74 20 6e 4f 75 74 3b 20  WhereCost nOut; 
30f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
30f80 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73 20 2a  ber of outputs *
30f90 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6d 78  /.  WhereCost mx
30fa0 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Cost = 0;     /*
30fb0 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66   Maximum cost of
30fc0 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20   a set of paths 
30fd0 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6d  */.  WhereCost m
30fe0 78 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 2f  xOut = 0;      /
30ff0 2a 20 4d 61 78 69 6d 75 6d 20 6e 4f 75 74 20 76  * Maximum nOut v
31000 61 6c 75 65 20 6f 6e 20 74 68 65 20 73 65 74 20  alue on the set 
31010 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 57 68  of paths */.  Wh
31020 65 72 65 43 6f 73 74 20 72 53 6f 72 74 43 6f 73  ereCost rSortCos
31030 74 3b 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20  t;      /* Cost 
31040 74 6f 20 64 6f 20 61 20 73 6f 72 74 20 2a 2f 0a  to do a sort */.
31050 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d    int nTo, nFrom
31060 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
31070 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65  umber of valid e
31080 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20  ntries in aTo[] 
31090 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20  and aFrom[] */. 
310a0 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f   WherePath *aFro
310b0 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  m;         /* Al
310c0 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74  l nFrom paths at
310d0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65   the previous le
310e0 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
310f0 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20  th *aTo;        
31100 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65     /* The nTo be
31110 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20  st paths at the 
31120 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f  current level */
31130 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46  .  WherePath *pF
31140 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
31150 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46  An element of aF
31160 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72  rom[] that we ar
31170 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
31180 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f    WherePath *pTo
31190 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
311a0 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f  n element of aTo
311b0 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
311c0 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
311d0 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70  hereLoop *pWLoop
311e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
311f0 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
31200 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68   objects */.  Wh
31210 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20  ereLoop **pX;   
31220 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
31230 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70  to divy up the p
31240 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  Space memory */.
31250 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20    char *pSpace; 
31260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
31270 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
31280 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  used by this rou
31290 74 69 6e 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73  tine */..  pPars
312a0 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
312b0 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
312c0 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d  e->db;.  nLoop =
312d0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b   pWInfo->nLevel;
312e0 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f  .  /* TUNING: Fo
312f0 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73  r simple queries
31300 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20  , only the best 
31310 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e  path is tracked.
31320 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20  .  ** For 2-way 
31330 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73  joins, the 5 bes
31340 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c  t paths are foll
31350 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a  owed..  ** For j
31360 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72  oins of 3 or mor
31370 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20  e tables, track 
31380 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68  the 10 best path
31390 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20  s */.  mxChoice 
313a0 3d 20 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20 31  = (nLoop==1) ? 1
313b0 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35   : (nLoop==2 ? 5
313c0 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74   : 10);.  assert
313d0 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d  ( nLoop<=pWInfo-
313e0 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  >pTabList->nSrc 
313f0 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  );.  WHERETRACE(
31400 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65  0x002, ("---- be
31410 67 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 29 3b  gin solver\n"));
31420 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
31430 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73  and initialize s
31440 70 61 63 65 20 66 6f 72 20 61 54 6f 20 61 6e 64  pace for aTo and
31450 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d   aFrom */.  ii =
31460 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61   (sizeof(WherePa
31470 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65  th)+sizeof(Where
31480 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78  Loop*)*nLoop)*mx
31490 43 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53 70 61  Choice*2;.  pSpa
314a0 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ce = sqlite3DbMa
314b0 6c 6c 6f 63 52 61 77 28 64 62 2c 20 69 69 29 3b  llocRaw(db, ii);
314c0 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30  .  if( pSpace==0
314d0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
314e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20  _NOMEM;.  aTo = 
314f0 28 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61  (WherePath*)pSpa
31500 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54  ce;.  aFrom = aT
31510 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65  o+mxChoice;.  me
31520 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73  mset(aFrom, 0, s
31530 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29  izeof(aFrom[0]))
31540 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c  ;.  pX = (WhereL
31550 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43  oop**)(aFrom+mxC
31560 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69  hoice);.  for(ii
31570 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72  =mxChoice*2, pFr
31580 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69  om=aTo; ii>0; ii
31590 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20  --, pFrom++, pX 
315a0 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70  += nLoop){.    p
315b0 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58  From->aLoop = pX
315c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 64  ;.  }..  /* Seed
315d0 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74 68   the search with
315e0 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50   a single WhereP
315f0 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a  ath containing z
31600 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a  ero WhereLoops..
31610 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47    **.  ** TUNING
31620 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  : Do not let the
31630 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61   number of itera
31640 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32  tions go above 2
31650 35 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a  5.  If the cost.
31660 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e    ** of computin
31670 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
31680 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64  ndex is not paid
31690 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65   back within the
316a0 20 66 69 72 73 74 20 32 35 0a 20 20 2a 2a 20 72   first 25.  ** r
316b0 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ows, then do not
316c0 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74   use the automat
316d0 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61  ic index. */.  a
316e0 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d  From[0].nRow = M
316f0 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  IN(pParse->nQuer
31700 79 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73 73  yLoop, 46);  ass
31710 65 72 74 28 20 34 36 3d 3d 77 68 65 72 65 43 6f  ert( 46==whereCo
31720 73 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72 6f  st(25) );.  nFro
31730 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50 72 65  m = 1;..  /* Pre
31740 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 73 74  compute the cost
31750 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20   of sorting the 
31760 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 65 74  final result set
31770 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 0a  , if the caller.
31780 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 57    ** to sqlite3W
31790 68 65 72 65 42 65 67 69 6e 28 29 20 77 61 73 20  hereBegin() was 
317a0 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20  concerned about 
317b0 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 72 53 6f  sorting */.  rSo
317c0 72 74 43 6f 73 74 20 3d 20 30 3b 0a 20 20 69 66  rtCost = 0;.  if
317d0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
317e0 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74  By==0 || nRowEst
317f0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d  ==0 ){.    aFrom
31800 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 56 61 6c  [0].isOrderedVal
31810 69 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  id = 1;.  }else{
31820 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  .    /* TUNING: 
31830 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f  Estimated cost o
31840 66 20 73 6f 72 74 69 6e 67 20 69 73 20 4e 2a 6c  f sorting is N*l
31850 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
31860 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  s the.    ** num
31870 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
31880 77 73 2e 20 2a 2f 0a 20 20 20 20 72 53 6f 72 74  ws. */.    rSort
31890 43 6f 73 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b  Cost = nRowEst +
318a0 20 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73 74 29   estLog(nRowEst)
318b0 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
318c0 28 30 78 30 30 32 2c 28 22 2d 2d 2d 2d 20 73 6f  (0x002,("---- so
318d0 72 74 20 63 6f 73 74 3d 25 2d 33 64 5c 6e 22 2c  rt cost=%-3d\n",
318e0 20 72 53 6f 72 74 43 6f 73 74 29 29 3b 0a 20 20   rSortCost));.  
318f0 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
31900 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e  successively lon
31910 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75  ger WherePaths u
31920 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75  sing the previou
31930 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a  s generation.  *
31940 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20  * of WherePaths 
31950 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72  as the basis for
31960 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70   the next.  Keep
31970 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78   track of the mx
31980 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74  Choice.  ** best
31990 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67   paths at each g
319a0 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66  eneration */.  f
319b0 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
319c0 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
319d0 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a  ){.    nTo = 0;.
319e0 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46      for(ii=0, pF
319f0 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46  rom=aFrom; ii<nF
31a00 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d  rom; ii++, pFrom
31a10 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  ++){.      for(p
31a20 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  WLoop=pWInfo->pL
31a30 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57  oops; pWLoop; pW
31a40 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65  Loop=pWLoop->pNe
31a50 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20  xtLoop){.       
31a60 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77   Bitmask maskNew
31a70 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
31a80 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20  k revMask = 0;. 
31a90 20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65         u8 isOrde
31aa0 72 65 64 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d  redValid = pFrom
31ab0 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
31ac0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69 73 4f  ;.        u8 isO
31ad0 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e  rdered = pFrom->
31ae0 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
31af0 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e     if( (pWLoop->
31b00 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d  prereq & ~pFrom-
31b10 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
31b20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
31b30 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d    if( (pWLoop->m
31b40 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d  askSelf & pFrom-
31b50 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
31b60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
31b70 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
31b80 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20  nt, pWLoop is a 
31b90 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20  candidate to be 
31ba0 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a  the next loop. .
31bb0 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75          ** Compu
31bc0 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20  te its cost */. 
31bd0 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77         rCost = w
31be0 68 65 72 65 43 6f 73 74 41 64 64 28 70 57 4c 6f  hereCostAdd(pWLo
31bf0 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f  op->rSetup,pWLoo
31c00 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d  p->rRun + pFrom-
31c10 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20  >nRow);.        
31c20 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73  rCost = whereCos
31c30 74 41 64 64 28 72 43 6f 73 74 2c 20 70 46 72 6f  tAdd(rCost, pFro
31c40 6d 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20 20  m->rCost);.     
31c50 20 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d     nOut = pFrom-
31c60 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e  >nRow + pWLoop->
31c70 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61  nOut;.        ma
31c80 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d  skNew = pFrom->m
31c90 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70  askLoop | pWLoop
31ca0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
31cb0 20 20 20 20 69 66 28 20 21 69 73 4f 72 64 65 72      if( !isOrder
31cc0 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  edValid ){.     
31cd0 20 20 20 20 20 73 77 69 74 63 68 28 20 77 68 65       switch( whe
31ce0 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
31cf0 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20  rderBy(pWInfo,. 
31d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d10 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
31d20 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70  rderBy, pFrom, p
31d30 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
31d40 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
31d50 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c            iLoop,
31d60 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73   pWLoop, &revMas
31d70 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k) ){.          
31d80 20 20 63 61 73 65 20 31 3a 20 20 2f 2a 20 59 65    case 1:  /* Ye
31d90 73 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  s.  pFrom+pWLoop
31da0 20 64 6f 65 73 20 73 61 74 69 73 66 79 20 74 68   does satisfy th
31db0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
31dc0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
31dd0 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 31     isOrdered = 1
31de0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
31df0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
31e00 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
31e10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
31e20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 2f 2a       case 0:  /*
31e30 20 4e 6f 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f   No.  pFrom+pWLo
31e40 6f 70 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  op will require 
31e50 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20  a separate sort 
31e60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
31e70 20 69 73 4f 72 64 65 72 65 64 20 3d 20 30 3b 0a   isOrdered = 0;.
31e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
31e90 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31  OrderedValid = 1
31ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
31eb0 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73  rCost = whereCos
31ec0 74 41 64 64 28 72 43 6f 73 74 2c 20 72 53 6f 72  tAdd(rCost, rSor
31ed0 74 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  tCost);.        
31ee0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31ef0 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
31f00 3a 20 2f 2a 20 43 61 6e 6e 6f 74 20 74 65 6c 6c  : /* Cannot tell
31f10 20 79 65 74 2e 20 20 54 72 79 20 61 67 61 69 6e   yet.  Try again
31f20 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 74 65   on the next ite
31f30 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ration */.      
31f40 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
31f50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31f60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31f70 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46      revMask = pF
31f80 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
31f90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31fa0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
31fb0 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64  if pWLoop should
31fc0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
31fd0 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74 20 73   mxChoice best s
31fe0 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
31ff0 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61   for(jj=0, pTo=a
32000 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b  To; jj<nTo; jj++
32010 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
32020 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73      if( pTo->mas
32030 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20  kLoop==maskNew. 
32040 20 20 20 20 20 20 20 20 20 20 26 26 20 70 54 6f            && pTo
32050 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
32060 3d 3d 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ==isOrderedValid
32070 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
32080 28 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f  (pTo->rCost<=rCo
32090 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c  st && pTo->nRow<
320a0 3d 6e 4f 75 74 29 20 7c 7c 0a 20 20 20 20 20 20  =nOut) ||.      
320b0 20 20 20 20 20 20 20 20 20 20 28 70 54 6f 2d 3e            (pTo->
320c0 72 43 6f 73 74 3e 3d 72 43 6f 73 74 20 26 26 20  rCost>=rCost && 
320d0 70 54 6f 2d 3e 6e 52 6f 77 3e 3d 6e 4f 75 74 29  pTo->nRow>=nOut)
320e0 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
320f0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
32100 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29  ase( jj==nTo-1 )
32110 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
32120 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
32130 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32140 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29     if( jj>=nTo )
32150 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
32160 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 26 26  nTo>=mxChoice &&
32170 20 72 43 6f 73 74 3e 3d 6d 78 43 6f 73 74 20 29   rCost>=mxCost )
32180 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
32190 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
321a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
321b0 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
321c0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
321d0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
321e0 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73  rintf("Skip   %s
321f0 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f   cost=%-3d,%3d o
32200 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
32210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
32220 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
32230 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
32240 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
32250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32260 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
32270 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20   ? (isOrdered ? 
32280 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
32290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
322a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
322b0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
322c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
322d0 20 20 20 20 2f 2a 20 41 64 64 20 61 20 6e 65 77      /* Add a new
322e0 20 50 61 74 68 20 74 6f 20 74 68 65 20 61 54 6f   Path to the aTo
322f0 5b 5d 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  [] set */.      
32300 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68      if( nTo<mxCh
32310 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  oice ){.        
32320 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20      /* Increase 
32330 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
32340 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a  aTo set by one *
32350 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  /.            jj
32360 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20   = nTo++;.      
32370 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32380 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61         /* New pa
32390 74 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20  th replaces the 
323a0 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b  prior worst to k
323b0 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  eep count below 
323c0 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20  mxChoice */.    
323d0 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49          jj = mxI
323e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
323f0 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61          pTo = &a
32400 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57  To[jj];.#ifdef W
32410 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
32420 44 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  D.          if( 
32430 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
32440 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
32450 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
32460 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20  gPrintf("New    
32470 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
32480 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
32490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
324a0 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
324b0 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
324c0 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
324d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
324e0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
324f0 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59   (isOrdered ? 'Y
32500 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
32510 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
32520 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  dif.        }els
32530 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
32540 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f   pTo->rCost<=rCo
32550 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c  st && pTo->nRow<
32560 3d 6e 4f 75 74 20 29 7b 0a 23 69 66 64 65 66 20  =nOut ){.#ifdef 
32570 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
32580 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ED.            i
32590 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
325a0 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
325b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
325c0 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
325d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
325e0 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
325f0 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
32600 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
32610 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
32620 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
32630 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
32640 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
32650 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
32660 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72  redValid ? (isOr
32670 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
32680 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
32690 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
326a0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20  DebugPrintf("   
326b0 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c  vs %s cost=%-3d,
326c0 25 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  %d order=%c\n",.
326d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326e0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
326f0 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
32700 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54  , pTo->rCost, pT
32710 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  o->nRow,.       
32720 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
32730 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
32740 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
32750 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
32760 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
32770 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
32780 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
32790 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f   pTo->rCost==rCo
327a0 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  st );.          
327b0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
327c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
327d0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d    testcase( pTo-
327e0 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20  >rCost==rCost+1 
327f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
32800 41 20 6e 65 77 20 61 6e 64 20 62 65 74 74 65 72  A new and better
32810 20 73 63 6f 72 65 20 66 6f 72 20 61 20 70 72 65   score for a pre
32820 76 69 6f 75 73 6c 79 20 63 72 65 61 74 65 64 20  viously created 
32830 65 71 75 69 76 61 6c 65 6e 74 20 70 61 74 68 20  equivalent path 
32840 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
32850 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
32860 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
32870 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
32880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32890 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
328a0 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
328b0 20 20 20 20 22 55 70 64 61 74 65 20 25 73 20 63      "Update %s c
328c0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
328d0 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
328e0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
328f0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
32900 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
32910 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
32920 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
32930 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72  redValid ? (isOr
32940 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
32950 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
32960 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
32970 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73  bugPrintf("  was
32980 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
32990 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
329a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
329b0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
329c0 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
329d0 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
329e0 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
329f0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
32a00 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f  eredValid ? (pTo
32a10 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59  ->isOrdered ? 'Y
32a20 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
32a30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
32a40 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dif.        }.  
32a50 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20        /* pWLoop 
32a60 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64  is a winner.  Ad
32a70 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20  d it to the set 
32a80 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  of best so far *
32a90 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d  /.        pTo->m
32aa0 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d  askLoop = pFrom-
32ab0 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f  >maskLoop | pWLo
32ac0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
32ad0 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f        pTo->revLo
32ae0 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20  op = revMask;.  
32af0 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20        pTo->nRow 
32b00 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  = nOut;.        
32b10 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f  pTo->rCost = rCo
32b20 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  st;.        pTo-
32b30 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  >isOrderedValid 
32b40 3d 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  = isOrderedValid
32b50 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69  ;.        pTo->i
32b60 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64  sOrdered = isOrd
32b70 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65  ered;.        me
32b80 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c  mcpy(pTo->aLoop,
32b90 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73   pFrom->aLoop, s
32ba0 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a  izeof(WhereLoop*
32bb0 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  )*iLoop);.      
32bc0 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f    pTo->aLoop[iLo
32bd0 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20  op] = pWLoop;.  
32be0 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d        if( nTo>=m
32bf0 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20  xChoice ){.     
32c00 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20       mxI = 0;.  
32c10 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d          mxCost =
32c20 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20   aTo[0].rCost;. 
32c30 20 20 20 20 20 20 20 20 20 6d 78 4f 75 74 20 3d           mxOut =
32c40 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20   aTo[0].nRow;.  
32c50 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31          for(jj=1
32c60 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a  , pTo=&aTo[1]; j
32c70 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b  j<mxChoice; jj++
32c80 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
32c90 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72        if( pTo->r
32ca0 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28  Cost>mxCost || (
32cb0 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f  pTo->rCost==mxCo
32cc0 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3e  st && pTo->nRow>
32cd0 6d 78 4f 75 74 29 20 29 7b 0a 20 20 20 20 20 20  mxOut) ){.      
32ce0 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d          mxCost =
32cf0 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20   pTo->rCost;.   
32d00 20 20 20 20 20 20 20 20 20 20 20 6d 78 4f 75 74             mxOut
32d10 20 3d 20 70 54 6f 2d 3e 6e 52 6f 77 3b 0a 20 20   = pTo->nRow;.  
32d20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 49 20              mxI 
32d30 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  = jj;.          
32d40 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
32d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32d60 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  }.    }..#ifdef 
32d70 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
32d80 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
32d90 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20  e3WhereTrace>=2 
32da0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
32db0 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d  DebugPrintf("---
32dc0 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64  - after round %d
32dd0 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29   ----\n", iLoop)
32de0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
32df0 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54  , pTo=aTo; ii<nT
32e00 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  o; ii++, pTo++){
32e10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32e20 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73  DebugPrintf(" %s
32e30 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d   cost=%-3d nrow=
32e40 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  %-3d order=%c",.
32e50 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
32e60 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
32e70 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
32e80 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
32e90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f  ,.           pTo
32ea0 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
32eb0 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
32ec0 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
32ed0 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
32ee0 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  if( pTo->isOrder
32ef0 65 64 56 61 6c 69 64 20 26 26 20 70 54 6f 2d 3e  edValid && pTo->
32f00 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  isOrdered ){.   
32f10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
32f20 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d  bugPrintf(" rev=
32f30 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e  0x%llx\n", pTo->
32f40 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  revLoop);.      
32f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32f60 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
32f70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
32f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
32f90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
32fa0 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c   /* Swap the rol
32fb0 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20  es of aFrom and 
32fc0 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74  aTo for the next
32fd0 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
32fe0 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a     pFrom = aTo;.
32ff0 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b      aTo = aFrom;
33000 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72  .    aFrom = pFr
33010 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20  om;.    nFrom = 
33020 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nTo;.  }..  if( 
33030 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  nFrom==0 ){.    
33040 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
33050 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72  pParse, "no quer
33060 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20  y solution");.  
33070 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
33080 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20  db, pSpace);.   
33090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
330a0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  RROR;.  }.  .  /
330b0 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  * Find the lowes
330c0 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46  t cost path.  pF
330d0 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  rom will be left
330e0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61   pointing to tha
330f0 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f  t path */.  pFro
33100 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72  m = aFrom;.  for
33110 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b  (ii=1; ii<nFrom;
33120 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
33130 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72  pFrom->rCost>aFr
33140 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70  om[ii].rCost ) p
33150 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69  From = &aFrom[ii
33160 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  ];.  }.  assert(
33170 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
33180 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c  =nLoop );.  /* L
33190 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  oad the lowest c
331a0 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57  ost path into pW
331b0 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  Info */.  for(iL
331c0 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
331d0 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
331e0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
331f0 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
33200 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   + iLoop;.    pL
33210 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70  evel->pWLoop = p
33220 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61  WLoop = pFrom->a
33230 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20  Loop[iLoop];.   
33240 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
33250 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20   pWLoop->iTab;. 
33260 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
33270 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
33280 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
33290 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b  >iFrom].iCursor;
332a0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e  .  }.  if( (pWIn
332b0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
332c0 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
332d0 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28  INCT)!=0.   && (
332e0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
332f0 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
33300 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20  NCTBY)==0.   && 
33310 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
33320 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  t==WHERE_DISTINC
33330 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f  T_NOOP.   && nRo
33340 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69  wEst.  ){.    Bi
33350 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20  tmask notUsed;. 
33360 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72     int rc = wher
33370 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
33380 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
33390 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
333a0 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20  , pFrom,.       
333b0 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
333c0 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f  DISTINCTBY, nLoo
333d0 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
333e0 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74  p[nLoop-1], &not
333f0 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  Used);.    if( r
33400 63 3d 3d 31 20 29 20 70 57 49 6e 66 6f 2d 3e 65  c==1 ) pWInfo->e
33410 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
33420 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
33430 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72  D;.  }.  if( pFr
33440 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b  om->isOrdered ){
33450 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
33460 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
33470 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
33480 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
33490 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
334a0 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
334b0 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ED;.    }else{. 
334c0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 42       pWInfo->bOB
334d0 53 61 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Sat = 1;.      p
334e0 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
334f0 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
33500 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49  .    }.  }.  pWI
33510 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70  nfo->nRowOut = p
33520 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f  From->nRow;..  /
33530 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79  * Free temporary
33540 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75   memory and retu
33550 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  rn success */.  
33560 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
33570 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74  , pSpace);.  ret
33580 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
33590 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65  ../*.** Most que
335a0 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20  ries use only a 
335b0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68  single table (th
335c0 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73  ey are not joins
335d0 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69  ) and have.** si
335e0 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69  mple == constrai
335f0 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65  nts against inde
33600 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69  xed fields.  Thi
33610 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
33620 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68  ts.** to plan th
33630 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73  ose simple cases
33640 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73   using much less
33650 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74   ceremony than t
33660 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  he.** general-pu
33670 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
33680 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79  ner, and thereby
33690 20 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71   yield faster sq
336a0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a  lite3_prepare().
336b0 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  ** times for the
336c0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a   common case..**
336d0 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
336e0 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ero on success, 
336f0 69 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61  if this query ca
33700 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  n be handled by 
33710 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c  this.** no-frill
33720 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  s query planner.
33730 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66    Return zero if
33740 20 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64   this query need
33750 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61  s the .** genera
33760 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20  l-purpose query 
33770 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74  planner..*/.stat
33780 69 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72  ic int whereShor
33790 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75  tCut(WhereLoopBu
337a0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
337b0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
337c0 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  WInfo;.  struct 
337d0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
337e0 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  tem;.  WhereClau
337f0 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
33800 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57  Term *pTerm;.  W
33810 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
33820 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69  .  int iCur;.  i
33830 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70  nt j;.  Table *p
33840 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
33850 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20  dx;.  .  pWInfo 
33860 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
33870 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  fo;.  if( pWInfo
33880 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
33890 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
338a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
338b0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70  ssert( pWInfo->p
338c0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31  TabList->nSrc>=1
338d0 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57   );.  pItem = pW
338e0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
338f0 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65  a;.  pTab = pIte
33900 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49  m->pTab;.  if( I
33910 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
33920 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
33930 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29   pItem->zIndex )
33940 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75   return 0;.  iCu
33950 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  r = pItem->iCurs
33960 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49  or;.  pWC = &pWI
33970 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f  nfo->sWC;.  pLoo
33980 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
33990 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ew;.  pLoop->wsF
339a0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 54 65 72  lags = 0;.  pTer
339b0 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
339c0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57  , iCur, -1, 0, W
339d0 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66 28 20  O_EQ, 0);.  if( 
339e0 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f  pTerm ){.    pLo
339f0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  op->wsFlags = WH
33a00 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
33a10 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e  ERE_IPK|WHERE_ON
33a20 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  EROW;.    pLoop-
33a30 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
33a40 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  rm;.    pLoop->n
33a50 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70  LTerm = 1;.    p
33a60 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
33a70 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55  q = 1;.    /* TU
33a80 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
33a90 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20  rowid lookup is 
33aa0 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d  10 */.    pLoop-
33ab0 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20  >rRun = 33;  /* 
33ac0 33 33 3d 3d 77 68 65 72 65 43 6f 73 74 28 31 30  33==whereCost(10
33ad0 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ) */.  }else{.  
33ae0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
33af0 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
33b00 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
33b10 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
33b20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61  pLoop->aLTermSpa
33b30 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  ce==pLoop->aLTer
33b40 6d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  m );.      asser
33b50 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 4c 6f  t( ArraySize(pLo
33b60 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  op->aLTermSpace)
33b70 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==4 );.      if(
33b80 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
33b90 4f 45 5f 4e 6f 6e 65 20 0a 20 20 20 20 20 20 20  OE_None .       
33ba0 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  || pIdx->pPartId
33bb0 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20  xWhere!=0 .     
33bc0 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75    || pIdx->nColu
33bd0 6d 6e 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f  mn>ArraySize(pLo
33be0 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  op->aLTermSpace)
33bf0 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e   .      ) contin
33c00 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ue;.      for(j=
33c10 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; j<pIdx->nColu
33c20 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
33c30 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
33c40 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 49  rm(pWC, iCur, pI
33c50 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c  dx->aiColumn[j],
33c60 20 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29   0, WO_EQ, pIdx)
33c70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
33c80 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
33c90 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
33ca0 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d  LTerm[j] = pTerm
33cb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33cc0 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 43 6f  if( j!=pIdx->nCo
33cd0 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
33ce0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  .      pLoop->ws
33cf0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
33d00 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e  LUMN_EQ|WHERE_ON
33d10 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58  EROW|WHERE_INDEX
33d20 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ED;.      if( (p
33d30 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20  Item->colUsed & 
33d40 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28  ~columnsInIndex(
33d50 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20  pIdx))==0 ){.   
33d60 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
33d70 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58  ags |= WHERE_IDX
33d80 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20  _ONLY;.      }. 
33d90 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65       pLoop->nLTe
33da0 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  rm = j;.      pL
33db0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
33dc0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f   = j;.      pLoo
33dd0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
33de0 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  x = pIdx;.      
33df0 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
33e00 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  of a unique inde
33e10 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a  x lookup is 15 *
33e20 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72  /.      pLoop->r
33e30 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39  Run = 39;  /* 39
33e40 3d 3d 77 68 65 72 65 43 6f 73 74 28 31 35 29 20  ==whereCost(15) 
33e50 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
33e60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
33e70 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29  pLoop->wsFlags )
33e80 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  {.    pLoop->nOu
33e90 74 20 3d 20 28 57 68 65 72 65 43 6f 73 74 29 31  t = (WhereCost)1
33ea0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
33eb0 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f  0].pWLoop = pLoo
33ec0 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61  p;.    pLoop->ma
33ed0 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b  skSelf = getMask
33ee0 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
33ef0 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70  et, iCur);.    p
33f00 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62  WInfo->a[0].iTab
33f10 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  Cur = iCur;.    
33f20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
33f30 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49  = 1;.    if( pWI
33f40 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  nfo->pOrderBy ) 
33f50 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d  pWInfo->bOBSat =
33f60 20 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49    1;.    if( pWI
33f70 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
33f80 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
33f90 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70  TINCT ){.      p
33fa0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
33fb0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
33fc0 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a  T_UNIQUE;.    }.
33fd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
33fe0 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63  BUG.    pLoop->c
33ff0 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66  Id = '0';.#endif
34000 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
34010 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
34020 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
34030 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
34040 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20  f the loop used 
34050 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  for WHERE clause
34060 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20   processing..** 
34070 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
34080 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
34090 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63   an opaque struc
340a0 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69  ture that contai
340b0 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ns.** informatio
340c0 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d  n needed to term
340d0 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
340e0 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c   Later, the call
340f0 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  ing routine.** s
34100 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c  hould invoke sql
34110 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77  ite3WhereEnd() w
34120 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76  ith the return v
34130 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
34140 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65  ction.** in orde
34150 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  r to complete th
34160 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
34170 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
34180 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
34190 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  urs, this routin
341a0 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a  e returns NULL..
341b0 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20  **.** The basic 
341c0 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20  idea is to do a 
341d0 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65  nested loop, one
341e0 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74   loop for each t
341f0 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  able in.** the F
34200 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
34210 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54  select.  (INSERT
34220 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74   and UPDATE stat
34230 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a  ements are the.*
34240 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45  * same as a SELE
34250 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73  CT with only a s
34260 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
34270 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29  he FROM clause.)
34280 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65    For.** example
34290 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20  , if the SQL is 
342a0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
342b0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
342c0 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45  t1, t2, t3 WHERE
342d0 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e   ...;.**.** Then
342e0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
342f0 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61  ted is conceptua
34300 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c  lly like the fol
34310 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
34320 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
34330 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c  in t1 do       \
34340 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
34350 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72  ed.**        for
34360 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
34370 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73  do      |-- by s
34380 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
34390 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ().**          f
343a0 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74  oreach row3 in t
343b0 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20  3 do   /.**     
343c0 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
343d0 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
343e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
343f0 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
34400 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64  ed.**        end
34410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34420 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73          |-- by s
34430 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
34440 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20  .**      end    
34450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34460 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74       /.**.** Not
34470 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73  e that the loops
34480 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65   might not be ne
34490 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  sted in the orde
344a0 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a  r in which they.
344b0 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ** appear in the
344c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20   FROM clause if 
344d0 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  a different orde
344e0 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c 65  r is better able
344f0 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20   to make.** use 
34500 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74  of indices.  Not
34510 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e  e also that when
34520 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
34530 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74   appears in.** t
34540 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
34550 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74   it might result
34560 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   in additional n
34570 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a  ested loops for.
34580 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  ** scanning thro
34590 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ugh all values o
345a0 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  n the right-hand
345b0 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e   side of the IN.
345c0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
345d0 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61   Btree cursors a
345e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
345f0 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75  ach table.  t1 u
34600 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  ses cursor.** nu
34610 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  mber pTabList->a
34620 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32  [0].iCursor.  t2
34630 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72   uses the cursor
34640 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e   pTabList->a[1].
34650 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20  iCursor..** And 
34660 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20  so forth.  This 
34670 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
34680 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74  s code to open t
34690 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72  hose VDBE cursor
346a0 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  s.** and sqlite3
346b0 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72  WhereEnd() gener
346c0 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
346d0 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a   close them..**.
346e0 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  ** The code that
346f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
34700 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c  in() generates l
34710 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
34720 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54  s named.** in pT
34730 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20  abList pointing 
34740 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72  at their appropr
34750 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54  iate entries.  T
34760 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a  he [...] code.**
34770 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75   can use OP_Colu
34780 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20  mn and OP_Rowid 
34790 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65  opcodes on these
347a0 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72   cursors to extr
347b0 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d  act.** data from
347c0 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62   the various tab
347d0 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  les of the loop.
347e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  .**.** If the WH
347f0 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d  ERE clause is em
34800 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68  pty, the foreach
34810 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68   loops must each
34820 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65   scan their.** e
34830 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54  ntire tables.  T
34840 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20  hus a three-way 
34850 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33  join is an O(N^3
34860 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  ) operation.  Bu
34870 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  t if.** the tabl
34880 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20  es have indices 
34890 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65  and there are te
348a0 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  rms in the WHERE
348b0 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20   clause that.** 
348c0 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69  refer to those i
348d0 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65  ndices, a comple
348e0 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61  te table scan ca
348f0 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64  n be avoided and
34900 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c   the.** code wil
34910 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65  l run much faste
34920 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20  r.  Most of the 
34930 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75  work of this rou
34940 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67  tine is checking
34950 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68  .** to see if th
34960 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20  ere are indices 
34970 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
34980 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65   to speed up the
34990 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72   loop..**.** Ter
349a0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
349b0 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20  clause are also 
349c0 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68  used to limit wh
349d0 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c  ich rows actuall
349e0 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20  y.** make it to 
349f0 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65  the "..." in the
34a00 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c   middle of the l
34a10 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68  oop.  After each
34a20 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74   "foreach",.** t
34a30 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
34a40 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73  E clause that us
34a50 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20  e only terms in 
34a60 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75  that loop and ou
34a70 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65  ter.** loops are
34a80 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69   evaluated and i
34a90 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69  f false a jump i
34aa0 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c  s made around al
34ab0 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
34ac0 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20  inner loops (or 
34ad0 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22  around the "..."
34ae0 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63   if the test occ
34af0 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69  urs within the i
34b00 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f  nner-.** most lo
34b10 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20  op).**.** OUTER 
34b20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f  JOINS.**.** An o
34b30 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62  uter join of tab
34b40 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73  les t1 and t2 is
34b50 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64   conceptally cod
34b60 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
34b70 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20  *.**    foreach 
34b80 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a  row1 in t1 do.**
34b90 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a        flag = 0.*
34ba0 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
34bb0 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20  ow2 in t2 do.** 
34bc0 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a         start:.**
34bd0 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
34be0 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d            flag =
34bf0 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a   1.**      end.*
34c00 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d  *      if flag==
34c10 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  0 then.**       
34c20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63   move the row2 c
34c30 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20  ursor to a null 
34c40 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f  row.**        go
34c50 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20  to start.**     
34c60 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a   fi.**    end.**
34c70 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41  .** ORDER BY CLA
34c80 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a  USE PROCESSING.*
34c90 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73  *.** pOrderBy is
34ca0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
34cb0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
34cc0 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20  e (or the GROUP 
34cd0 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20  BY clause.** if 
34ce0 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42  the WHERE_GROUPB
34cf0 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  Y flag is set in
34d00 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20   wctrlFlags) of 
34d10 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
34d20 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  nt.** if there i
34d30 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65  s one.  If there
34d40 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
34d50 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69  clause or if thi
34d60 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
34d70 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55  called from an U
34d80 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
34d90 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
34da0 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c  pOrderBy is NULL
34db0 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a  ..*/.WhereInfo *
34dc0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
34dd0 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
34de0 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  se,        /* Th
34df0 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
34e00 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
34e10 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 46  TabList,    /* F
34e20 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69  ROM clause: A li
34e30 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  st of all tables
34e40 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
34e50 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
34e60 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
34e70 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
34e80 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
34e90 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f  derBy,   /* An O
34ea0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
34eb0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  or NULL */.  Exp
34ec0 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65  rList *pResultSe
34ed0 74 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74  t, /* Result set
34ee0 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
34ef0 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
34f00 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  s,       /* One 
34f10 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66  of the WHERE_* f
34f20 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20  lags defined in 
34f30 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20  sqliteInt.h */. 
34f40 20 69 6e 74 20 69 49 64 78 43 75 72 20 20 20 20   int iIdxCur    
34f50 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45         /* If WHE
34f60 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
34f70 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63   is set, index c
34f80 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a  ursor number */.
34f90 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49  ){.  int nByteWI
34fa0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
34fb0 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c  /* Num. bytes al
34fc0 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72  located for Wher
34fd0 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a  eInfo struct */.
34fe0 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20    int nTabList; 
34ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35000 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
35010 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a  ts in pTabList *
35020 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
35030 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  WInfo;         /
35040 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * Will become th
35050 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
35060 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
35070 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
35080 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
35090 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64  /* The virtual d
350a0 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a  atabase engine *
350b0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
350c0 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f  eady;          /
350d0 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61  * Cursors that a
350e0 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74  re not yet posit
350f0 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  ioned */.  Where
35100 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42  LoopBuilder sWLB
35110 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ;     /* The Whe
35120 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a  reLoop builder *
35130 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
35140 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f   *pMaskSet;    /
35150 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
35160 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
35170 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
35180 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  l;        /* A s
35190 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70  ingle level in p
351a0 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  WInfo->a[] */.  
351b0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
351c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ;          /* Po
351d0 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c  inter to a singl
351e0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
351f0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20  ct */.  int ii; 
35200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35210 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
35220 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
35230 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
35240 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
35250 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
35260 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
35270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
35280 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20  urn code */...  
35290 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74  /* Variable init
352a0 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  ialization */.  
352b0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
352c0 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c  .  memset(&sWLB,
352d0 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29   0, sizeof(sWLB)
352e0 29 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72  );.  sWLB.pOrder
352f0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a  By = pOrderBy;..
35300 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65    /* Disable the
35310 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69   DISTINCT optimi
35320 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45  zation if SQLITE
35330 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20  _DistinctOpt is 
35340 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c  set via.  ** sql
35350 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53  ite3_test_ctrl(S
35360 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
35370 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e  PTIMIZATIONS,...
35380 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d  ) */.  if( Optim
35390 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
353a0 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69  db, SQLITE_Disti
353b0 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77  nctOpt) ){.    w
353c0 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48  ctrlFlags &= ~WH
353d0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
353e0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  T;.  }..  /* The
353f0 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65   number of table
35400 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
35410 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
35420 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
35430 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20  .  ** bits in a 
35440 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20  Bitmask .  */.  
35450 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69  testcase( pTabLi
35460 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b  st->nSrc==BMS );
35470 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
35480 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20  >nSrc>BMS ){.   
35490 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
354a0 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73  (pParse, "at mos
354b0 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61  t %d tables in a
354c0 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20   join", BMS);.  
354d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
354e0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
354f0 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e  ion normally gen
35500 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20  erates a nested 
35510 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62  loop for all tab
35520 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61  les in .  ** pTa
35530 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74  bList.  But if t
35540 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  he WHERE_ONETABL
35550 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73  E_ONLY flag is s
35560 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75  et, then we shou
35570 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e  ld.  ** only gen
35580 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
35590 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69  he first table i
355a0 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  n pTabList and a
355b0 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20  ssume that.  ** 
355c0 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f  any cursors asso
355d0 63 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73  ciated with subs
355e0 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72  equent tables ar
355f0 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  e uninitialized.
35600 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74  .  */.  nTabList
35610 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26   = (wctrlFlags &
35620 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
35630 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62  ONLY) ? 1 : pTab
35640 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f  List->nSrc;..  /
35650 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
35660 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68  nitialize the Wh
35670 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
35680 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  e that will beco
35690 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75  me the.  ** retu
356a0 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67  rn value. A sing
356b0 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  le allocation is
356c0 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
356d0 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a  he WhereInfo.  *
356e0 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f  * struct, the co
356f0 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49  ntents of WhereI
35700 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65  nfo.a[], the Whe
35710 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
35720 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  re.  ** and the 
35730 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72  WhereMaskSet str
35740 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68  ucture. Since Wh
35750 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69  ereClause contai
35760 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a  ns an 8-byte.  *
35770 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69  * field (type Bi
35780 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62  tmask) it must b
35790 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20  e aligned on an 
357a0 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20  8-byte boundary 
357b0 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63  on.  ** some arc
357c0 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63  hitectures. Henc
357d0 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62  e the ROUND8() b
357e0 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79  elow..  */.  nBy
357f0 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38  teWInfo = ROUND8
35800 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66  (sizeof(WhereInf
35810 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a  o)+(nTabList-1)*
35820 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65  sizeof(WhereLeve
35830 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  l));.  pWInfo = 
35840 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
35850 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49 6e  ero(db, nByteWIn
35860 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72  fo + sizeof(Wher
35870 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64  eLoop));.  if( d
35880 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
35890 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
358a0 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
358b0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30  ;.    pWInfo = 0
358c0 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  ;.    goto where
358d0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
358e0 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
358f0 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70   = nTabList;.  p
35900 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
35910 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
35920 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
35930 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
35940 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
35950 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  erBy;.  pWInfo->
35960 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65  pResultSet = pRe
35970 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66  sultSet;.  pWInf
35980 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69  o->iBreak = sqli
35990 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
359a0 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77  (v);.  pWInfo->w
359b0 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72  ctrlFlags = wctr
359c0 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f  lFlags;.  pWInfo
359d0 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
359e0 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
359f0 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53  ryLoop;.  pMaskS
35a00 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d  et = &pWInfo->sM
35a10 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70  askSet;.  sWLB.p
35a20 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a  WInfo = pWInfo;.
35a30 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57    sWLB.pWC = &pW
35a40 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c  Info->sWC;.  sWL
35a50 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c  B.pNew = (WhereL
35a60 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57  oop*)(((char*)pW
35a70 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f  Info)+nByteWInfo
35a80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
35a90 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
35aa0 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a  T(sWLB.pNew) );.
35ab0 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
35ac0 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64  sWLB.pNew);.#ifd
35ad0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
35ae0 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64    sWLB.pNew->cId
35af0 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a   = '*';.#endif..
35b00 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
35b10 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
35b20 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
35b30 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
35b40 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
35b50 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
35b60 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
35b70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
35b80 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b  nitMaskSet(pMask
35b90 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61  Set);.  whereCla
35ba0 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d  useInit(&pWInfo-
35bb0 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  >sWC, pWInfo);. 
35bc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
35bd0 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65  Constants(pParse
35be0 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65  , pWhere);.  whe
35bf0 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d  reSplit(&pWInfo-
35c00 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b  >sWC, pWhere, TK
35c10 5f 41 4e 44 29 3b 0a 20 20 73 71 6c 69 74 65 33  _AND);.  sqlite3
35c20 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
35c30 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a  (pParse, -1); /*
35c40 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b   Insert the cook
35c50 69 65 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f  ie verifier Goto
35c60 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70   */.    .  /* Sp
35c70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48  ecial case: a WH
35c80 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
35c90 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76  is constant.  Ev
35ca0 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  aluate the.  ** 
35cb0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65  expression and e
35cc0 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20  ither jump over 
35cd0 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20  all of the code 
35ce0 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20  or fall thru..  
35cf0 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 20  */.  if( pWhere 
35d00 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20  && (nTabList==0 
35d10 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  || sqlite3ExprIs
35d20 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
35d30 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20  pWhere)) ){.    
35d40 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
35d50 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  se(pParse, pWher
35d60 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
35d70 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  k, SQLITE_JUMPIF
35d80 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72  NULL);.    pWher
35d90 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
35da0 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e   Special case: N
35db0 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  o FROM clause.  
35dc0 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73  */.  if( nTabLis
35dd0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t==0 ){.    if( 
35de0 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66  pOrderBy ) pWInf
35df0 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20  o->bOBSat = 1;. 
35e00 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
35e10 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
35e20 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20  ISTINCT ){.     
35e30 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
35e40 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
35e50 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
35e60 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69  }.  }..  /* Assi
35e70 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68  gn a bit from th
35e80 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65  e bitmask to eve
35e90 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ry term in the F
35ea0 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
35eb0 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67  .  ** When assig
35ec0 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c  ning bitmask val
35ed0 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75  ues to FROM clau
35ee0 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d  se cursors, it m
35ef0 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20  ust be.  ** the 
35f00 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20 69  case that if X i
35f10 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
35f20 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20  r the N-th FROM 
35f30 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e  clause term then
35f40 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73  .  ** the bitmas
35f50 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63  k for all FROM c
35f60 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74  lause terms to t
35f70 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e  he left of the N
35f80 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73  -th term.  ** is
35f90 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70   (X-1).   An exp
35fa0 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
35fb0 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
35fc0 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73  LEFT JOIN can us
35fd0 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e  e.  ** its Expr.
35fe0 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
35ff0 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68  value to find th
36000 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65  e bitmask of the
36010 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a   right table.  *
36020 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
36030 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20  Subtracting one 
36040 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74  from the right t
36050 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76  able bitmask giv
36060 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73  es a.  ** bitmas
36070 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  k for all tables
36080 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
36090 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69  the join.  Knowi
360a0 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20  ng the bitmask. 
360b0 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c   ** for all tabl
360c0 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
360d0 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73  f a left join is
360e0 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63   important.  Tic
360f0 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a  ket #3015..  **.
36100 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    ** Note that b
36110 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61  itmasks are crea
36120 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62  ted for all pTab
36130 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65  List->nSrc table
36140 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69  s in.  ** pTabLi
36150 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65  st, not just the
36160 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20   first nTabList 
36170 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73  tables.  nTabLis
36180 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20  t is normally.  
36190 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62  ** equal to pTab
361a0 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d  List->nSrc but m
361b0 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65  ight be shortene
361c0 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20  d to 1 if the.  
361d0 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  ** WHERE_ONETABL
361e0 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73  E_ONLY flag is s
361f0 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  et..  */.  for(i
36200 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74  i=0; ii<pTabList
36210 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20  ->nSrc; ii++){. 
36220 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d     createMask(pM
36230 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
36240 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
36250 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ;.  }.#ifndef ND
36260 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74  EBUG.  {.    Bit
36270 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d  mask toTheLeft =
36280 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   0;.    for(ii=0
36290 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  ; ii<pTabList->n
362a0 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Src; ii++){.    
362b0 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65    Bitmask m = ge
362c0 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
362d0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
362e0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
362f0 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74  assert( (m-1)==t
36300 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20  oTheLeft );.    
36310 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d    toTheLeft |= m
36320 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
36330 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  if..  /* Analyze
36340 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
36350 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74  xpressions.  Not
36360 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79  e that exprAnaly
36370 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  ze() might.  ** 
36380 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20  add new virtual 
36390 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65  terms onto the e
363a0 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
363b0 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e  clause.  We do n
363c0 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20  ot.  ** want to 
363d0 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69  analyze these vi
363e0 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20  rtual terms, so 
363f0 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20  start analyzing 
36400 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20  at the end.  ** 
36410 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64  and work forward
36420 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64   so that the add
36430 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ed virtual terms
36440 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65   are never proce
36450 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70  ssed..  */.  exp
36460 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62  rAnalyzeAll(pTab
36470 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
36480 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  WC);.  if( db->m
36490 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
364a0 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
364b0 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  inError;.  }..  
364c0 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20  /* If the ORDER 
364d0 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29  BY (or GROUP BY)
364e0 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
364f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 67   references to g
36500 65 6e 65 72 61 6c 0a 20 20 2a 2a 20 65 78 70 72  eneral.  ** expr
36510 65 73 73 69 6f 6e 73 2c 20 74 68 65 6e 20 77 65  essions, then we
36520 20 77 6f 6e 27 74 20 62 65 20 61 62 6c 65 20 74   won't be able t
36530 6f 20 73 61 74 69 73 66 79 20 69 74 20 75 73 69  o satisfy it usi
36540 6e 67 20 69 6e 64 69 63 65 73 2c 20 73 6f 0a 20  ng indices, so. 
36550 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64   ** go ahead and
36560 20 64 69 73 61 62 6c 65 20 69 74 20 6e 6f 77 2e   disable it now.
36570 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
36580 65 72 42 79 20 26 26 20 28 77 63 74 72 6c 46 6c  erBy && (wctrlFl
36590 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
365a0 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 20 29 7b  _DISTINCT)!=0 ){
365b0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
365c0 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
365d0 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
365e0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71  Expr *pExpr = sq
365f0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
36600 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61  late(pOrderBy->a
36610 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  [ii].pExpr);.   
36620 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
36630 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  !=TK_COLUMN ){. 
36640 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70         pWInfo->p
36650 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
36660 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  By = 0;.        
36670 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
36680 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43  se if( pExpr->iC
36690 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
366a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
366b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
366c0 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
366d0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
366e0 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20 69  NCT ){.    if( i
366f0 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
36700 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  nt(pParse, pTabL
36710 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  ist, &pWInfo->sW
36720 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29 20 29  C, pResultSet) )
36730 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 44  {.      /* The D
36740 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20  ISTINCT marking 
36750 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49  is pointless.  I
36760 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20  gnore it. */.   
36770 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
36780 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
36790 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20  TINCT_UNIQUE;.  
367a0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 64    }else if( pOrd
367b0 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
367c0 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44 45 52   /* Try to ORDER
367d0 20 42 59 20 74 68 65 20 72 65 73 75 6c 74 20 73   BY the result s
367e0 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73 74 69  et to make disti
367f0 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67 20 65  nct processing e
36800 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  asier */.      p
36810 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
36820 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54 49  s |= WHERE_DISTI
36830 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57 49  NCTBY;.      pWI
36840 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  nfo->pOrderBy = 
36850 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 20 20  pResultSet;.    
36860 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73  }.  }..  /* Cons
36870 74 72 75 63 74 20 74 68 65 20 57 68 65 72 65 4c  truct the WhereL
36880 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  oop objects */. 
36890 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
368a0 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  ff,("*** Optimiz
368b0 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29  er Start ***\n")
368c0 29 3b 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73  );.  if( nTabLis
368d0 74 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f  t!=1 || whereSho
368e0 72 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20  rtCut(&sWLB)==0 
368f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  ){.    rc = wher
36900 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c  eLoopAddAll(&sWL
36910 42 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  B);.    if( rc )
36920 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
36930 45 72 72 6f 72 3b 0a 20 20 0a 20 20 20 20 2f 2a  Error;.  .    /*
36940 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20   Display all of 
36950 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
36960 6a 65 63 74 73 20 69 66 20 77 68 65 72 65 74 72  jects if wheretr
36970 61 63 65 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  ace is enabled *
36980 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
36990 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
369a0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
369b0 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 57  Trace ){.      W
369c0 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20  hereLoop *p;.   
369d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
369e0 73 74 61 74 69 63 20 63 68 61 72 20 7a 4c 61 62  static char zLab
369f0 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37  el[] = "01234567
36a00 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e  89abcdefghijklmn
36a10 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20  opqrstuvwyxz".  
36a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a40 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a       "ABCDEFGHIJ
36a50 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a  KLMNOPQRSTUVWYXZ
36a60 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70  ";.      for(p=p
36a70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69  WInfo->pLoops, i
36a80 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  =0; p; p=p->pNex
36a90 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20  tLoop, i++){.   
36aa0 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c       p->cId = zL
36ab0 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c  abel[i%sizeof(zL
36ac0 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20  abel)];.        
36ad0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
36ae0 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20  , pTabList);.   
36af0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
36b00 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61  f.  .    wherePa
36b10 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
36b20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
36b30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
36b40 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
36b50 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57  rror;.    if( pW
36b60 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
36b70 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61  {.       wherePa
36b80 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
36b90 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
36ba0 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  +1);.       if( 
36bb0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
36bc0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
36bd0 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  inError;.    }. 
36be0 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d   }.  if( pWInfo-
36bf0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20  >pOrderBy==0 && 
36c00 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
36c10 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
36c20 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49  )!=0 ){.     pWI
36c30 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 28  nfo->revMask = (
36c40 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20  Bitmask)(-1);.  
36c50 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
36c60 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64 62  nErr || NEVER(db
36c70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20  ->mallocFailed) 
36c80 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
36c90 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
36ca0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
36cb0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
36cc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
36cd0 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69  ce ){.    int ii
36ce0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
36cf0 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53  ugPrintf("---- S
36d00 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22  olution nRow=%d"
36d10 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
36d20 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  t);.    if( pWIn
36d30 66 6f 2d 3e 62 4f 42 53 61 74 20 29 7b 0a 20 20  fo->bOBSat ){.  
36d40 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
36d50 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59  Printf(" ORDERBY
36d60 3d 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f  =0x%llx", pWInfo
36d70 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20  ->revMask);.    
36d80 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 57  }.    switch( pW
36d90 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
36da0 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  ){.      case WH
36db0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
36dc0 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
36dd0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
36de0 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e  f("  DISTINCT=un
36df0 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20  ique");.        
36e00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
36e10 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
36e20 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
36e30 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
36e40 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
36e50 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72    DISTINCT=order
36e60 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed");.        br
36e70 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
36e80 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
36e90 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
36ea0 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
36eb0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
36ec0 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64    DISTINCT=unord
36ed0 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  ered");.        
36ee0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
36ef0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
36f00 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
36f10 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  );.    for(ii=0;
36f20 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   ii<pWInfo->nLev
36f30 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  el; ii++){.     
36f40 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
36f50 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57  pWInfo->a[ii].pW
36f60 4c 6f 6f 70 2c 20 70 54 61 62 4c 69 73 74 29 3b  Loop, pTabList);
36f70 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
36f80 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74  f.  /* Attempt t
36f90 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72  o omit tables fr
36fa0 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74  om the join that
36fb0 20 64 6f 20 6e 6f 74 20 65 66 66 65 63 74 20 74   do not effect t
36fc0 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69  he result */.  i
36fd0 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
36fe0 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73 75  l>=2.   && pResu
36ff0 6c 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20 4f  ltSet!=0.   && O
37000 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
37010 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d  ed(db, SQLITE_Om
37020 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b  itNoopJoin).  ){
37030 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62  .    Bitmask tab
37040 55 73 65 64 20 3d 20 65 78 70 72 4c 69 73 74 54  Used = exprListT
37050 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
37060 65 74 2c 20 70 52 65 73 75 6c 74 53 65 74 29 3b  et, pResultSet);
37070 0a 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f  .    if( sWLB.pO
37080 72 64 65 72 42 79 20 29 20 74 61 62 55 73 65 64  rderBy ) tabUsed
37090 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
370a0 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
370b0 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b   sWLB.pOrderBy);
370c0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e  .    while( pWIn
370d0 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b  fo->nLevel>=2 ){
370e0 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
370f0 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a   *pTerm, *pEnd;.
37100 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57        pLoop = pW
37110 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e  Info->a[pWInfo->
37120 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70  nLevel-1].pWLoop
37130 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 57 49  ;.      if( (pWI
37140 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
37150 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f  [pLoop->iTab].jo
37160 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
37170 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
37180 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
37190 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
371a0 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20  _DISTINCT)==0.  
371b0 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
371c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
371d0 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20  ONEROW)==0.     
371e0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
371f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
37200 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20   if( (tabUsed & 
37210 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
37220 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
37230 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70     pEnd = sWLB.p
37240 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43  WC->a + sWLB.pWC
37250 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66  ->nTerm;.      f
37260 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57  or(pTerm=sWLB.pW
37270 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64  C->a; pTerm<pEnd
37280 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
37290 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
372a0 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f  prereqAll & pLoo
372b0 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a  p->maskSelf)!=0.
372c0 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70           && !Exp
372d0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
372e0 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
372f0 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
37300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
37310 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
37320 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
37330 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65  pTerm<pEnd ) bre
37340 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ak;.      WHERET
37350 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d  RACE(0xffff, ("-
37360 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e  > drop loop %c n
37370 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f  ot used\n", pLoo
37380 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20  p->cId));.      
37390 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d  pWInfo->nLevel--
373a0 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74  ;.      nTabList
373b0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
373c0 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
373d0 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  f,("*** Optimize
373e0 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e  r Finished ***\n
373f0 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  "));.  pWInfo->p
37400 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
37410 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  p += pWInfo->nRo
37420 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  wOut;..  /* If t
37430 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
37440 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
37450 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
37460 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
37470 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
37480 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
37490 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
374a0 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
374b0 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70  ..  ** The one-p
374c0 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e  ass algorithm on
374d0 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20  ly works if the 
374e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
374f0 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68  straints.  ** th
37500 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75  e statement to u
37510 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72  pdate a single r
37520 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ow..  */.  asser
37530 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
37540 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
37550 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57  ESIRED)==0 || pW
37560 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20  Info->nLevel==1 
37570 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46  );.  if( (wctrlF
37580 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
37590 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30  PASS_DESIRED)!=0
375a0 20 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d   .   && (pWInfo-
375b0 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73  >a[0].pWLoop->ws
375c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
375d0 45 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20  EROW)!=0 ){.    
375e0 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
375f0 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66  s = 1;.    pWInf
37600 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
37610 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  wsFlags &= ~WHER
37620 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_IDX_ONLY;.  }.
37630 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74  .  /* Open all t
37640 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61  ables in the pTa
37650 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e  bList and any in
37660 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66  dices selected f
37670 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e  or.  ** searchin
37680 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  g those tables..
37690 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
376a0 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
376b0 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65   for(ii=0, pLeve
376c0 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c  l=pWInfo->a; ii<
376d0 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20  nTabList; ii++, 
376e0 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54  pLevel++){.    T
376f0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
37700 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e  /* Table to open
37710 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b   */.    int iDb;
37720 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
37730 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  x of database co
37740 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69  ntaining table/i
37750 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75  ndex */.    stru
37760 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
37770 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20  *pTabItem;..    
37780 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
37790 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
377a0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62  iFrom];.    pTab
377b0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
377c0 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  b;.    iDb = sql
377d0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
377e0 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
377f0 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  ema);.    pLoop 
37800 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
37810 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
37820 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
37830 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20  phemeral)!=0 || 
37840 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
37850 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
37860 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  hing */.    }els
37870 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  e.#ifndef SQLITE
37880 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
37890 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  LE.    if( (pLoo
378a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
378b0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
378c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  !=0 ){.      con
378d0 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d  st char *pVTab =
378e0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
378f0 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
37900 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
37910 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62   int iCur = pTab
37920 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
37930 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37940 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70  AddOp4(v, OP_VOp
37950 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20  en, iCur, 0, 0, 
37960 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b  pVTab, P4_VTAB);
37970 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49  .    }else if( I
37980 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
37990 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20  {.      /* noop 
379a0 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  */.    }else.#en
379b0 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  dif.    if( (pLo
379c0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
379d0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
379e0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63  .         && (wc
379f0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
37a00 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45  _OMIT_OPEN_CLOSE
37a10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
37a20 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f  t op = pWInfo->o
37a30 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70  kOnePass ? OP_Op
37a40 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65  enWrite : OP_Ope
37a50 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c  nRead;.      sql
37a60 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
37a70 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  arse, pTabItem->
37a80 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54  iCursor, iDb, pT
37a90 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 74  ab, op);.      t
37aa0 65 73 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f  estcase( !pWInfo
37ab0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70  ->okOnePass && p
37ac0 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  Tab->nCol==BMS-1
37ad0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
37ae0 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  se( !pWInfo->okO
37af0 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e  nePass && pTab->
37b00 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  nCol==BMS );.   
37b10 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e     if( !pWInfo->
37b20 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
37b30 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20  b->nCol<BMS ){. 
37b40 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
37b50 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c   = pTabItem->col
37b60 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  Used;.        in
37b70 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t n = 0;.       
37b80 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31   for(; b; b=b>>1
37b90 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  , n++){}.       
37ba0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
37bb0 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56  geP4(v, sqlite3V
37bc0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
37bd0 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20  )-1, .          
37be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37bf0 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f    SQLITE_INT_TO_
37c00 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32  PTR(n), P4_INT32
37c10 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
37c20 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c  t( n<=pTab->nCol
37c30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
37c40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
37c50 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
37c60 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
37c70 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
37c80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
37c90 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
37ca0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
37cb0 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e  EXED ){.      In
37cc0 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70  dex *pIx = pLoop
37cd0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
37ce0 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
37cf0 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49  *pKey = sqlite3I
37d00 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
37d10 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20  se, pIx);.      
37d20 2f 2a 20 46 49 58 4d 45 3a 20 20 41 73 20 61 6e  /* FIXME:  As an
37d30 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73   optimization us
37d40 65 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  e pTabItem->iCur
37d50 73 6f 72 20 69 66 20 57 48 45 52 45 5f 49 44 58  sor if WHERE_IDX
37d60 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 20 20 20 20 69  _ONLY */.      i
37d70 6e 74 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70  nt iIndexCur = p
37d80 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
37d90 20 69 49 64 78 43 75 72 20 3f 20 69 49 64 78 43   iIdxCur ? iIdxC
37da0 75 72 20 3a 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur : pParse->nTa
37db0 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  b++;.      asser
37dc0 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d  t( pIx->pSchema=
37dd0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
37de0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
37df0 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a  iIndexCur>=0 );.
37e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37e10 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
37e20 65 6e 52 65 61 64 2c 20 69 49 6e 64 65 78 43 75  enRead, iIndexCu
37e30 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44  r, pIx->tnum, iD
37e40 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
37e50 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
37e60 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
37e70 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
37e80 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
37e90 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e  v, "%s", pIx->zN
37ea0 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ame));.    }.   
37eb0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
37ec0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
37ed0 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65   iDb);.    notRe
37ee0 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
37ef0 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
37f00 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  t, pTabItem->iCu
37f10 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49  rsor);.  }.  pWI
37f20 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69  nfo->iTop = sqli
37f30 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
37f40 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d  dr(v);.  if( db-
37f50 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
37f60 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
37f70 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  rror;..  /* Gene
37f80 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f  rate the code to
37f90 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20   do the search. 
37fa0 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20   Each iteration 
37fb0 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20  of the for.  ** 
37fc0 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72  loop below gener
37fd0 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20  ates code for a 
37fe0 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f  single nested lo
37ff0 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a  op of the VM.  *
38000 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a  * program..  */.
38010 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
38020 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28  itmask)0;.  for(
38030 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73  ii=0; ii<nTabLis
38040 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c  t; ii++){.    pL
38050 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
38060 61 5b 69 69 5d 3b 0a 23 69 66 6e 64 65 66 20 53  a[ii];.#ifndef S
38070 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
38080 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69  ATIC_INDEX.    i
38090 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  f( (pLevel->pWLo
380a0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
380b0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
380c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
380d0 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
380e0 64 65 78 28 70 50 61 72 73 65 2c 20 26 70 57 49  dex(pParse, &pWI
380f0 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20  nfo->sWC,.      
38100 20 20 20 20 20 20 20 20 20 20 26 70 54 61 62 4c            &pTabL
38110 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
38120 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c  From], notReady,
38130 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20   pLevel);.      
38140 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
38150 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
38160 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
38170 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 65 78   }.#endif.    ex
38180 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61  plainOneScan(pPa
38190 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
381a0 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65  Level, ii, pLeve
381b0 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63