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

Artifact 47a9d554aa12e37d00c87ed6557edff3f96d1980:


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 41 6e 79 50 72   && ExprHasAnyPr
6ee0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 48 69 6e  operty(p, EP_Hin
6ef0: 74 29 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  t) ){.    pTerm-
6f00: 3e 74 72 75 74 68 50 72 6f 62 20 3d 20 77 68 65  >truthProb = whe
6f10: 72 65 43 6f 73 74 28 70 2d 3e 69 54 61 62 6c 65  reCost(p->iTable
6f20: 29 20 2d 20 39 39 3b 0a 20 20 7d 65 6c 73 65 7b  ) - 99;.  }else{
6f30: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 74 72 75 74  .    pTerm->trut
6f40: 68 50 72 6f 62 20 3d 20 2d 31 3b 0a 20 20 7d 0a  hProb = -1;.  }.
6f50: 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d    pTerm->pExpr =
6f60: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
6f70: 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20 20 70 54  Collate(p);.  pT
6f80: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77  erm->wtFlags = w
6f90: 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d  tFlags;.  pTerm-
6fa0: 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54  >pWC = pWC;.  pT
6fb0: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d  erm->iParent = -
6fc0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b  1;.  return idx;
6fd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
6fe0: 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65  outine identifie
6ff0: 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  s subexpressions
7000: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
7010: 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61  ause where.** ea
7020: 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ch subexpression
7030: 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
7040: 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   the AND operato
7050: 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a  r or some other.
7060: 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63  ** operator spec
7070: 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20  ified in the op 
7080: 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20  parameter.  The 
7090: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
70a0: 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c  cture.** is fill
70b0: 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73  ed with pointers
70c0: 20 74 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f   to subexpressio
70d0: 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ns.  For example
70e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45  :.**.**    WHERE
70f0: 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44    a=='hello' AND
7100: 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c   coalesce(b,11)<
7110: 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20  10 AND (c+12!=d 
7120: 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20  OR c==22).**    
7130: 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
7140: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
7150: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f  ______/     \___
7160: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
7170: 2a 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f  *            slo
7180: 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20 20  t[0]            
7190: 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20  slot[1]         
71a0: 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a        slot[2].**
71b0: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
71c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
71d0: 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65   pExpr is unalte
71e0: 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72  red.  All this r
71f0: 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69  outine.** does i
7200: 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e  s make slot[] en
7210: 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73  tries point to s
7220: 75 62 73 74 72 75 63 74 75 72 65 20 77 69 74 68  ubstructure with
7230: 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20  in pExpr..**.** 
7240: 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  In the previous 
7250: 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20  sentence and in 
7260: 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c  the diagram, "sl
7270: 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a  ot[]" refers to.
7280: 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ** the WhereClau
7290: 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54  se.a[] array.  T
72a0: 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20  he slot[] array 
72b0: 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20  grows as needed 
72c0: 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c  to contain.** al
72d0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  l terms of the W
72e0: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
72f0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
7300: 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75  eSplit(WhereClau
7310: 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
7320: 45 78 70 72 2c 20 75 38 20 6f 70 29 7b 0a 20 20  Expr, u8 op){.  
7330: 70 57 43 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20  pWC->op = op;.  
7340: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
7350: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
7360: 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20  pr->op!=op ){.  
7370: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73    whereClauseIns
7380: 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20  ert(pWC, pExpr, 
7390: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
73a0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
73b0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f   pExpr->pLeft, o
73c0: 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  p);.    whereSpl
73d0: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
73e0: 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a  Right, op);.  }.
73f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
7400: 69 7a 65 20 61 20 57 68 65 72 65 4d 61 73 6b 53  ize a WhereMaskS
7410: 65 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 23 64 65  et object.*/.#de
7420: 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74  fine initMaskSet
7430: 28 50 29 20 20 28 50 29 2d 3e 6e 3d 30 0a 0a 2f  (P)  (P)->n=0../
7440: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7450: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
7460: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
7470: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
7480: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
7490: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
74a0: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
74b0: 6b 20 67 65 74 4d 61 73 6b 28 57 68 65 72 65 4d  k getMask(WhereM
74c0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
74d0: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
74e0: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
74f0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d  t( pMaskSet->n<=
7500: 28 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d  (int)sizeof(Bitm
7510: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28  ask)*8 );.  for(
7520: 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d  i=0; i<pMaskSet-
7530: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  >n; i++){.    if
7540: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69  ( pMaskSet->ix[i
7550: 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  ]==iCursor ){.  
7560: 20 20 20 20 72 65 74 75 72 6e 20 4d 41 53 4b 42      return MASKB
7570: 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  IT(i);.    }.  }
7580: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
7590: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
75a0: 65 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73  ew mask for curs
75b0: 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  or iCursor..**.*
75c0: 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63  * There is one c
75d0: 75 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20  ursor per table 
75e0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
75f0: 73 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  se.  The number 
7600: 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20  of.** tables in 
7610: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
7620: 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20  is limited by a 
7630: 74 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68  test early in th
7640: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72  e.** sqlite3Wher
7650: 65 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65  eBegin() routine
7660: 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68  .  So we know th
7670: 61 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d  at the pMaskSet-
7680: 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77  >ix[].** array w
7690: 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c  ill never overfl
76a0: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ow..*/.static vo
76b0: 69 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68  id createMask(Wh
76c0: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
76d0: 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f  kSet, int iCurso
76e0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d  r){.  assert( pM
76f0: 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61  askSet->n < Arra
7700: 79 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e  ySize(pMaskSet->
7710: 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65  ix) );.  pMaskSe
7720: 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e  t->ix[pMaskSet->
7730: 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a  n++] = iCursor;.
7740: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72  }../*.** These r
7750: 6f 75 74 69 6e 65 73 20 77 61 6c 6b 20 28 72 65  outines walk (re
7760: 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65 78  cursively) an ex
7770: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e  pression tree an
7780: 64 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 61 20  d generate.** a 
7790: 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69  bitmask indicati
77a0: 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65 73 20  ng which tables 
77b0: 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 61 74  are used in that
77c0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74   expression.** t
77d0: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  ree..*/.static B
77e0: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
77f0: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
7800: 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73  askSet*, ExprLis
7810: 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d  t*);.static Bitm
7820: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
7830: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
7840: 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29  skSet*, Select*)
7850: 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  ;.static Bitmask
7860: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
7870: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
7880: 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29  askSet, Expr *p)
7890: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
78a0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30   = 0;.  if( p==0
78b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
78c0: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
78d0: 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20  UMN ){.    mask 
78e0: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
78f0: 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a  et, p->iTable);.
7900: 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b      return mask;
7910: 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78  .  }.  mask = ex
7920: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
7930: 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74  skSet, p->pRight
7940: 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  );.  mask |= exp
7950: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
7960: 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  kSet, p->pLeft);
7970: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
7980: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
7990: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6d  Select) ){.    m
79a0: 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63  ask |= exprSelec
79b0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
79c0: 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65  kSet, p->x.pSele
79d0: 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ct);.  }else{.  
79e0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
79f0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
7a00: 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73  skSet, p->x.pLis
7a10: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
7a20: 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20   mask;.}.static 
7a30: 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74  Bitmask exprList
7a40: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
7a50: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
7a60: 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  t, ExprList *pLi
7a70: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
7a80: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
7a90: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
7aa0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7ab0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
7ac0: 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c  +){.      mask |
7ad0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
7ae0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74  (pMaskSet, pList
7af0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
7b00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7b10: 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63  n mask;.}.static
7b20: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c   Bitmask exprSel
7b30: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68  ectTableUsage(Wh
7b40: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
7b50: 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53  kSet, Select *pS
7b60: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  ){.  Bitmask mas
7b70: 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  k = 0;.  while( 
7b80: 70 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  pS ){.    SrcLis
7b90: 74 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70 53  t *pSrc = pS->pS
7ba0: 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  rc;.    mask |= 
7bb0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
7bc0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
7bd0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61  >pEList);.    ma
7be0: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
7bf0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
7c00: 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29  t, pS->pGroupBy)
7c10: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
7c20: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
7c30: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
7c40: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61  OrderBy);.    ma
7c50: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
7c60: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
7c70: 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  S->pWhere);.    
7c80: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
7c90: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7ca0: 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20   pS->pHaving);. 
7cb0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53     if( ALWAYS(pS
7cc0: 72 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  rc!=0) ){.      
7cd0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
7ce0: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
7cf0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
7d00: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65    mask |= exprSe
7d10: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70  lectTableUsage(p
7d20: 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61  MaskSet, pSrc->a
7d30: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
7d40: 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78        mask |= ex
7d50: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
7d60: 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69  skSet, pSrc->a[i
7d70: 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ].pOn);.      }.
7d80: 20 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20 70      }.    pS = p
7d90: 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20  S->pPrior;.  }. 
7da0: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
7db0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
7dc0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
7dd0: 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20  operator is one 
7de0: 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  of the operators
7df0: 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f   that is.** allo
7e00: 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  wed for an index
7e10: 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  able WHERE claus
7e20: 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c  e term.  The all
7e30: 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61  owed operators a
7e40: 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20  re.** "=", "<", 
7e50: 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c  ">", "<=", ">=",
7e60: 20 22 49 4e 22 2c 20 61 6e 64 20 22 49 53 20 4e   "IN", and "IS N
7e70: 55 4c 4c 22 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ULL".*/.static i
7e80: 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74  nt allowedOp(int
7e90: 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   op){.  assert( 
7ea0: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_GT>TK_EQ && T
7eb0: 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_GT<TK_GE );.  
7ec0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b  assert( TK_LT>TK
7ed0: 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f  _EQ && TK_LT<TK_
7ee0: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
7ef0: 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LE>TK_EQ && T
7f00: 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LE<TK_GE );.  
7f10: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
7f20: 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75  K_EQ+4 );.  retu
7f30: 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  rn op==TK_IN || 
7f40: 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70  (op>=TK_EQ && op
7f50: 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d  <=TK_GE) || op==
7f60: 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a  TK_ISNULL;.}../*
7f70: 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a  .** Swap two obj
7f80: 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 59 50  ects of type TYP
7f90: 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57  E..*/.#define SW
7fa0: 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59  AP(TYPE,A,B) {TY
7fb0: 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74  PE t=A; A=B; B=t
7fc0: 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74  ;}../*.** Commut
7fd0: 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  e a comparison o
7fe0: 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73  perator.  Expres
7ff0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
8000: 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72  m "X op Y".** ar
8010: 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
8020: 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a   "Y op X"..**.**
8030: 20 49 66 20 6c 65 66 74 2f 72 69 67 68 74 20 70   If left/right p
8040: 72 65 63 65 64 65 6e 63 65 20 72 75 6c 65 73 20  recedence rules 
8050: 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20 77  come into play w
8060: 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  hen determining 
8070: 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  the.** collating
8080: 20 73 65 71 75 65 6e 63 65 2c 20 74 68 65 6e 20   sequence, then 
8090: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
80a0: 73 20 61 72 65 20 61 64 6a 75 73 74 65 64 20 74  s are adjusted t
80b0: 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74  o ensure.** that
80c0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
80d0: 65 71 75 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74  equence does not
80e0: 20 63 68 61 6e 67 65 2e 20 20 46 6f 72 20 65 78   change.  For ex
80f0: 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20 63 6f 6c  ample:.** "Y col
8100: 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 58  late NOCASE op X
8110: 22 20 62 65 63 6f 6d 65 73 20 22 58 20 6f 70 20  " becomes "X op 
8120: 59 22 20 62 65 63 61 75 73 65 20 61 6e 79 20 63  Y" because any c
8130: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
8140: 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74  e on.** the left
8150: 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20   hand side of a 
8160: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72  comparison overr
8170: 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69  ides any collati
8180: 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20  on sequence .** 
8190: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
81a0: 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73  right. For the s
81b0: 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45  ame reason the E
81c0: 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a  P_Collate flag.*
81d0: 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65  * is not commute
81e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
81f0: 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50 61  d exprCommute(Pa
8200: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
8210: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36  r *pExpr){.  u16
8220: 20 65 78 70 52 69 67 68 74 20 3d 20 28 70 45 78   expRight = (pEx
8230: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67  pr->pRight->flag
8240: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b  s & EP_Collate);
8250: 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d  .  u16 expLeft =
8260: 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   (pExpr->pLeft->
8270: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
8280: 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  te);.  assert( a
8290: 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e  llowedOp(pExpr->
82a0: 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  op) && pExpr->op
82b0: 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66 28  !=TK_IN );.  if(
82c0: 20 65 78 70 52 69 67 68 74 3d 3d 65 78 70 4c 65   expRight==expLe
82d0: 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  ft ){.    /* Eit
82e0: 68 65 72 20 58 20 61 6e 64 20 59 20 62 6f 74 68  her X and Y both
82f0: 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70   have COLLATE op
8300: 65 72 61 74 6f 72 20 6f 72 20 6e 65 69 74 68 65  erator or neithe
8310: 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28 20  r do */.    if( 
8320: 65 78 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  expRight ){.    
8330: 20 20 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64 20    /* Both X and 
8340: 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f  Y have COLLATE o
8350: 70 65 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65 20  perators.  Make 
8360: 73 75 72 65 20 58 20 69 73 20 61 6c 77 61 79 73  sure X is always
8370: 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62  .      ** used b
8380: 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 45  y clearing the E
8390: 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20 66  P_Collate flag f
83a0: 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20 20  rom Y. */.      
83b0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
83c0: 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c 6c  lags &= ~EP_Coll
83d0: 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ate;.    }else i
83e0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
83f0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
8400: 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
8410: 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65 69 74 68  {.      /* Neith
8420: 65 72 20 58 20 6e 6f 72 20 59 20 68 61 76 65 20  er X nor Y have 
8430: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
8440: 73 2c 20 62 75 74 20 58 20 68 61 73 20 61 20 6e  s, but X has a n
8450: 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20 20 20 20  on-default.     
8460: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65   ** collating se
8470: 71 75 65 6e 63 65 2e 20 20 53 6f 20 61 64 64 20  quence.  So add 
8480: 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 6d  the EP_Collate m
8490: 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63 61  arker on X to ca
84a0: 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  use.      ** it 
84b0: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 66  to be searched f
84c0: 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70  irst. */.      p
84d0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
84e0: 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65  gs |= EP_Collate
84f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53 57  ;.    }.  }.  SW
8500: 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e  AP(Expr*,pExpr->
8510: 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c  pRight,pExpr->pL
8520: 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70  eft);.  if( pExp
8530: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a  r->op>=TK_GT ){.
8540: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
8550: 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20  T==TK_GT+2 );.  
8560: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
8570: 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20  =TK_LE+2 );.    
8580: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
8590: 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _EQ );.    asser
85a0: 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29  t( TK_GT<TK_LE )
85b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
85c0: 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26  xpr->op>=TK_GT &
85d0: 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f  & pExpr->op<=TK_
85e0: 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  GE );.    pExpr-
85f0: 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f  >op = ((pExpr->o
8600: 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47  p-TK_GT)^2)+TK_G
8610: 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  T;.  }.}../*.** 
8620: 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54  Translate from T
8630: 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f  K_xx operator to
8640: 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a   WO_xx bitmask..
8650: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70  */.static u16 op
8660: 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f  eratorMask(int o
8670: 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61  p){.  u16 c;.  a
8680: 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70  ssert( allowedOp
8690: 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70  (op) );.  if( op
86a0: 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63  ==TK_IN ){.    c
86b0: 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73   = WO_IN;.  }els
86c0: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  e if( op==TK_ISN
86d0: 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57  ULL ){.    c = W
86e0: 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73  O_ISNULL;.  }els
86f0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e{.    assert( (
8700: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
8710: 29 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20  )) < 0x7fff );. 
8720: 20 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f     c = (u16)(WO_
8730: 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b  EQ<<(op-TK_EQ));
8740: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
8750: 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
8760: 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a  c==WO_ISNULL );.
8770: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
8780: 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20  _IN || c==WO_IN 
8790: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
87a0: 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_EQ || c==WO_
87b0: 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EQ );.  assert( 
87c0: 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d  op!=TK_LT || c==
87d0: 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_LT );.  asser
87e0: 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  t( op!=TK_LE || 
87f0: 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73  c==WO_LE );.  as
8800: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20  sert( op!=TK_GT 
8810: 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20  || c==WO_GT );. 
8820: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
8830: 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29  GE || c==WO_GE )
8840: 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  ;.  return c;.}.
8850: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
8860: 6f 20 74 68 65 20 6e 65 78 74 20 57 68 65 72 65  o the next Where
8870: 54 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68 65  Term that matche
8880: 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  s according to t
8890: 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 65  he criteria.** e
88a0: 73 74 61 62 6c 69 73 68 65 64 20 77 68 65 6e 20  stablished when 
88b0: 74 68 65 20 70 53 63 61 6e 20 6f 62 6a 65 63 74  the pScan object
88c0: 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64   was initialized
88d0: 20 62 79 20 77 68 65 72 65 53 63 61 6e 49 6e 69   by whereScanIni
88e0: 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e  t()..** Return N
88f0: 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65  ULL if there are
8900: 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69 6e   no more matchin
8910: 67 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2f  g WhereTerms..*/
8920: 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72  .static WhereTer
8930: 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e 65 78 74  m *whereScanNext
8940: 28 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61  (WhereScan *pSca
8950: 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b 20  n){.  int iCur; 
8960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
8970: 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20  e cursor on the 
8980: 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 20  LHS of the term 
8990: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
89a0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
89b0: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 4c   column on the L
89c0: 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 2e 20  HS of the term. 
89d0: 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a 20   -1 for IPK */. 
89e0: 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
89f0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72        /* An expr
8a00: 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 74 65 73  ession being tes
8a10: 74 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ted */.  WhereCl
8a20: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a  ause *pWC;    /*
8a30: 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70   Shorthand for p
8a40: 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20 57  Scan->pWC */.  W
8a50: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
8a60: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
8a70: 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a  being tested */.
8a80: 20 20 69 6e 74 20 6b 20 3d 20 70 53 63 61 6e 2d    int k = pScan-
8a90: 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20  >k;    /* Where 
8aa0: 74 6f 20 73 74 61 72 74 20 73 63 61 6e 6e 69 6e  to start scannin
8ab0: 67 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 70  g */..  while( p
8ac0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 70 53  Scan->iEquiv<=pS
8ad0: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20  can->nEquiv ){. 
8ae0: 20 20 20 69 43 75 72 20 3d 20 70 53 63 61 6e 2d     iCur = pScan-
8af0: 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e 69  >aEquiv[pScan->i
8b00: 45 71 75 69 76 2d 32 5d 3b 0a 20 20 20 20 69 43  Equiv-2];.    iC
8b10: 6f 6c 75 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61  olumn = pScan->a
8b20: 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71  Equiv[pScan->iEq
8b30: 75 69 76 2d 31 5d 3b 0a 20 20 20 20 77 68 69 6c  uiv-1];.    whil
8b40: 65 28 20 28 70 57 43 20 3d 20 70 53 63 61 6e 2d  e( (pWC = pScan-
8b50: 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20 20 20 20  >pWC)!=0 ){.    
8b60: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
8b70: 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65  >a+k; k<pWC->nTe
8b80: 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; k++, pTerm++
8b90: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
8ba0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
8bb0: 3d 3d 69 43 75 72 20 26 26 20 70 54 65 72 6d 2d  ==iCur && pTerm-
8bc0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69  >u.leftColumn==i
8bd0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
8be0: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
8bf0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
8c00: 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20 20  QUIV)!=0.       
8c10: 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45      && pScan->nE
8c20: 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28 70  quiv<ArraySize(p
8c30: 53 63 61 6e 2d 3e 61 45 71 75 69 76 29 0a 20 20  Scan->aEquiv).  
8c40: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
8c50: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
8c60: 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 73            pX = s
8c70: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
8c80: 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45 78  llate(pTerm->pEx
8c90: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
8ca0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
8cb0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pX->op==TK_COLU
8cc0: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  MN );.          
8cd0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 63    for(j=0; j<pSc
8ce0: 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b 3d 32  an->nEquiv; j+=2
8cf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8d00: 20 69 66 28 20 70 53 63 61 6e 2d 3e 61 45 71 75   if( pScan->aEqu
8d10: 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c  iv[j]==pX->iTabl
8d20: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
8d30: 20 26 26 20 70 53 63 61 6e 2d 3e 61 45 71 75 69   && pScan->aEqui
8d40: 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c  v[j+1]==pX->iCol
8d50: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
8d60: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8d90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
8da0: 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29  =pScan->nEquiv )
8db0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8dc0: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d  pScan->aEquiv[j]
8dd0: 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
8df0: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 20  an->aEquiv[j+1] 
8e00: 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  = pX->iColumn;. 
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
8e20: 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d 20 32 3b  an->nEquiv += 2;
8e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
8e40: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8e50: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
8e60: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53 63  >eOperator & pSc
8e70: 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29  an->opMask)!=0 )
8e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
8e90: 20 56 65 72 69 66 79 20 74 68 65 20 61 66 66 69   Verify the affi
8ea0: 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69  nity and collati
8eb0: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74 63  ng sequence matc
8ec0: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  h */.           
8ed0: 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c   if( pScan->zCol
8ee0: 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d 2d  lName && (pTerm-
8ef0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8f00: 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  ISNULL)==0 ){.  
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c              Coll
8f20: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
8f30: 20 20 20 20 20 20 20 20 20 20 50 61 72 73 65 20            Parse 
8f40: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
8f50: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20               pX 
8f70: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8f90: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
8fa0: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53  ffinityOk(pX, pS
8fb0: 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a  can->idxaff) ){.
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fd0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
8fe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8ff0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
9000: 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  X->pLeft);.     
9010: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
9020: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
9030: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
9040: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
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 70 58 2d 3e 70 4c 65 66 74         pX->pLeft
9080: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
90a0: 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
90b0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
90c0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
90d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
90e0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
90f0: 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d  l->zName, pScan-
9100: 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20  >zCollName) ){. 
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
9120: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
9130: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9150: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
9160: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
9170: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
9180: 20 20 26 26 20 28 70 58 20 3d 20 70 54 65 72 6d    && (pX = pTerm
9190: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  ->pExpr->pRight)
91a0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
91c0: 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 63 61  pX->iTable==pSca
91d0: 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a 20 20 20  n->aEquiv[0].   
91e0: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d            && pX-
91f0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d  >iColumn==pScan-
9200: 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20 20 20 20  >aEquiv[1].     
9210: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
9220: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
9230: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
9240: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61              pSca
9250: 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20  n->k = k+1;.    
9260: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
9270: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
9280: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
9290: 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e 2d    }.      pScan-
92a0: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57  >pWC = pScan->pW
92b0: 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 20  C->pOuter;.     
92c0: 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20   k = 0;.    }.  
92d0: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
92e0: 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20  Scan->pOrigWC;. 
92f0: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53     k = 0;.    pS
9300: 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b 3d 20 32  can->iEquiv += 2
9310: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
9320: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
9330: 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c  alize a WHERE cl
9340: 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a  ause scanner obj
9350: 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ect.  Return a p
9360: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
9370: 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52   first match.  R
9380: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
9390: 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68  ere are no match
93a0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  es..**.** The sc
93b0: 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65  anner will be se
93c0: 61 72 63 68 69 6e 67 20 74 68 65 20 57 48 45 52  arching the WHER
93d0: 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49  E clause pWC.  I
93e0: 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66  t will look.** f
93f0: 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  or terms of the 
9400: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
9410: 70 72 3e 22 20 77 68 65 72 65 20 58 20 69 73 20  pr>" where X is 
9420: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f  column iColumn o
9430: 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e  f table.** iCur.
9440: 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20    The <op> must 
9450: 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70  be one of the op
9460: 65 72 61 74 6f 72 73 20 64 65 73 63 72 69 62 65  erators describe
9470: 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a  d by opMask..**.
9480: 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72 63 68  ** If the search
9490: 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68   is for X and th
94a0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
94b0: 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66  ontains terms of
94c0: 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59   the.** form X=Y
94d0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
94e0: 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65  ne might also re
94f0: 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  turn terms of th
9500: 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70  e form.** "Y <op
9510: 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20  > <expr>".  The 
9520: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
9530: 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69 74 79   of transitivity
9540: 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20   is limited,.** 
9550: 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f  but is enough to
9560: 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d   handle most com
9570: 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20  monly occurring 
9580: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  SQL statements..
9590: 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f  **.** If X is no
95a0: 74 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  t the INTEGER PR
95b0: 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58  IMARY KEY then X
95c0: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   must be compati
95d0: 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65  ble with.** inde
95e0: 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  x pIdx..*/.stati
95f0: 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65  c WhereTerm *whe
9600: 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68  reScanInit(.  Wh
9610: 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20  ereScan *pScan, 
9620: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
9630: 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65  reScan object be
9640: 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ing initialized 
9650: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
9660: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20   *pWC,       /* 
9670: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
9680: 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
9690: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
96a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
96b0: 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f  ursor to scan fo
96c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  r */.  int iColu
96d0: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
96e0: 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e  * Column to scan
96f0: 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70   for */.  u32 op
9700: 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Mask,           
9710: 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29    /* Operator(s)
9720: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
9730: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
9740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
9750: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
9760: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 20  with this index 
9770: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 0a  */.){.  int j;..
9780: 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63 61    /* memset(pSca
9790: 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53  n, 0, sizeof(*pS
97a0: 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63 61  can)); */.  pSca
97b0: 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57 43  n->pOrigWC = pWC
97c0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d  ;.  pScan->pWC =
97d0: 20 70 57 43 3b 0a 20 20 69 66 28 20 70 49 64 78   pWC;.  if( pIdx
97e0: 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29   && iColumn>=0 )
97f0: 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78  {.    pScan->idx
9800: 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  aff = pIdx->pTab
9810: 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
9820: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
9830: 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61  for(j=0; pIdx->a
9840: 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c  iColumn[j]!=iCol
9850: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
9860: 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70 49   if( NEVER(j>=pI
9870: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20 72  dx->nColumn) ) r
9880: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
9890: 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e     pScan->zCollN
98a0: 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  ame = pIdx->azCo
98b0: 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ll[j];.  }else{.
98c0: 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66      pScan->idxaf
98d0: 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e  f = 0;.    pScan
98e0: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b  ->zCollName = 0;
98f0: 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70  .  }.  pScan->op
9900: 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20  Mask = opMask;. 
9910: 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20   pScan->k = 0;. 
9920: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30   pScan->aEquiv[0
9930: 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63 61  ] = iCur;.  pSca
9940: 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20 3d 20 69  n->aEquiv[1] = i
9950: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d  Column;.  pScan-
9960: 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 70  >nEquiv = 2;.  p
9970: 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20 32  Scan->iEquiv = 2
9980: 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72 65  ;.  return where
9990: 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b  ScanNext(pScan);
99a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
99b0: 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74   for a term in t
99c0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
99d0: 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66  that is of the f
99e0: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
99f0: 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69  r>".** where X i
9a00: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
9a10: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20   the iColumn of 
9a20: 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20 3c  table iCur and <
9a30: 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a  op> is one of.**
9a40: 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61   the WO_xx opera
9a50: 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69 66  tor codes specif
9a60: 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70 61  ied by the op pa
9a70: 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75  rameter..** Retu
9a80: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
9a90: 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72  the term.  Retur
9aa0: 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  n 0 if not found
9ab0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
9ac0: 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20   returned might 
9ad0: 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20 74  by Y=<expr> if t
9ae0: 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72 20  here is another 
9af0: 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a  constraint in.**
9b00: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
9b10: 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  e that specifies
9b20: 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79 20   that X=Y.  Any 
9b30: 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 73  such constraints
9b40: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e   will be.** iden
9b50: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57 4f  tified by the WO
9b60: 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74 68  _EQUIV bit in th
9b70: 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  e pTerm->eOperat
9b80: 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a  or field.  The.*
9b90: 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72 61 79  * aEquiv[] array
9ba0: 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61 6c 6c   holds X and all
9bb0: 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74 73   its equivalents
9bc0: 2c 20 77 69 74 68 20 65 61 63 68 20 53 51 4c 20  , with each SQL 
9bd0: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61 6b 69  variable.** taki
9be0: 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74 73 20  ng up two slots 
9bf0: 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20 54 68  in aEquiv[].  Th
9c00: 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69 73 20  e first slot is 
9c10: 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20 6e  for the cursor n
9c20: 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65  umber.** and the
9c30: 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72 20 74   second is for t
9c40: 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
9c50: 2e 20 20 54 68 65 72 65 20 61 72 65 20 32 32 20  .  There are 22 
9c60: 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76 5b  slots in aEquiv[
9c70: 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d 65 61  ].** so that mea
9c80: 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 66  ns we can look f
9c90: 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f 20  or X plus up to 
9ca0: 31 30 20 6f 74 68 65 72 20 65 71 75 69 76 61 6c  10 other equival
9cb0: 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a 20 48  ent values..** H
9cc0: 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66 6f  ence a search fo
9cd0: 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  r X will return 
9ce0: 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 20 61  <expr> if X=A1 a
9cf0: 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32 3d  nd A1=A2 and A2=
9d00: 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20 61 6e  A3.** and ... an
9d10: 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31 30  d A9=A10 and A10
9d20: 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49  =<expr>..**.** I
9d30: 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c 74  f there are mult
9d40: 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74 68  iple terms in th
9d50: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
9d60: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
9d70: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74 68  p> <expr>".** th
9d80: 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20 6f  en try for the o
9d90: 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65 6e  ne with no depen
9da0: 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70 72  dencies on <expr
9db0: 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  > - in other wor
9dc0: 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78 70  ds where.** <exp
9dd0: 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  r> is a constant
9de0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 73   expression of s
9df0: 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20  ome kind.  Only 
9e00: 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20 6f  return entries o
9e10: 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58  f.** the form "X
9e20: 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 59   <op> Y" where Y
9e30: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
9e40: 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 66  another table if
9e50: 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a 20   no terms of.** 
9e60: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
9e70: 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20 65   <const-expr>" e
9e80: 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74 65  xist.   If no te
9e90: 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73 74  rms with a const
9ea0: 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73 74  ant RHS.** exist
9eb0: 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e 20  , try to return 
9ec0: 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65 73  a term that does
9ed0: 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55 49   not use WO_EQUI
9ee0: 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  V..*/.static Whe
9ef0: 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d  reTerm *findTerm
9f00: 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
9f10: 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pWC,     /* The
9f20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
9f30: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
9f40: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
9f50: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
9f60: 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  r number of LHS 
9f70: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
9f80: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
9f90: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c  lumn number of L
9fa0: 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  HS */.  Bitmask 
9fb0: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a  notReady,     /*
9fc0: 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76   RHS must not ov
9fd0: 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73 20  erlap with this 
9fe0: 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70  mask */.  u32 op
9ff0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a000: 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78  /* Mask of WO_xx
a010: 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62 69   values describi
a020: 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ng operator */. 
a030: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
a040: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
a050: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
a060: 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66  h this index, if
a070: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a   not NULL */.){.
a080: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 65    WhereTerm *pRe
a090: 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57 68 65 72  sult = 0;.  Wher
a0a0: 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72  eTerm *p;.  Wher
a0b0: 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70  eScan scan;..  p
a0c0: 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74   = whereScanInit
a0d0: 28 26 73 63 61 6e 2c 20 70 57 43 2c 20 69 43 75  (&scan, pWC, iCu
a0e0: 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20  r, iColumn, op, 
a0f0: 70 49 64 78 29 3b 0a 20 20 77 68 69 6c 65 28 20  pIdx);.  while( 
a100: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  p ){.    if( (p-
a110: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
a120: 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20  otReady)==0 ){. 
a130: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72       if( p->prer
a140: 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70  eqRight==0 && (p
a150: 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45  ->eOperator&WO_E
a160: 51 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Q)!=0 ){.       
a170: 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 20   return p;.     
a180: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52 65   }.      if( pRe
a190: 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73 75 6c  sult==0 ) pResul
a1a0: 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20  t = p;.    }.   
a1b0: 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65   p = whereScanNe
a1c0: 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d 0a 20  xt(&scan);.  }. 
a1d0: 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c 74 3b   return pResult;
a1e0: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
a1f0: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
a200: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
a210: 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 57 68  yze(SrcList*, Wh
a220: 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29  ereClause*, int)
a230: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78  ;../*.** Call ex
a240: 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c  prAnalyze on all
a250: 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52   terms in a WHER
a260: 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2f 0a 73  E clause.  .*/.s
a270: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
a280: 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63  nalyzeAll(.  Src
a290: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
a2a0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
a2b0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
a2c0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 20  ereClause *pWC  
a2d0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48         /* the WH
a2e0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
a2f0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
a300: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
a310: 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69  =pWC->nTerm-1; i
a320: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65  >=0; i--){.    e
a330: 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c  xprAnalyze(pTabL
a340: 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20  ist, pWC, i);.  
a350: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
a360: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
a370: 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  TIMIZATION./*.**
a380: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
a390: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
a3a0: 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20  ssion is a LIKE 
a3b0: 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  or GLOB operator
a3c0: 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20   that.** can be 
a3d0: 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20  optimized using 
a3e0: 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
a3f0: 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  raints.  Return 
a400: 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a  TRUE if it is.**
a410: 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66   so and false if
a420: 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f   not..**.** In o
a430: 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65  rder for the ope
a440: 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69  rator to be opti
a450: 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53  mizible, the RHS
a460: 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69 6e   must be a strin
a470: 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61  g.** literal tha
a480: 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
a490: 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72 64   with a wildcard
a4a0: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
a4b0: 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a  t isLikeOrGlob(.
a4c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a4d0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
a4e0: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
a4f0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
a500: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
a510: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
a520: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45  xpression */.  E
a530: 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c 20  xpr **ppPrefix, 
a540: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 54   /* Pointer to T
a550: 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73 73  K_STRING express
a560: 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72 6e  ion with pattern
a570: 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74   prefix */.  int
a580: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f   *pisComplete, /
a590: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e  * True if the on
a5a0: 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20 25  ly wildcard is %
a5b0: 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61   in the last cha
a5c0: 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  racter */.  int 
a5d0: 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a  *pnoCase      /*
a5e0: 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63 61   True if upperca
a5f0: 73 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  se is equivalent
a600: 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f   to lowercase */
a610: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
a620: 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *z = 0;        
a630: 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52 48   /* String on RH
a640: 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74  S of LIKE operat
a650: 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  or */.  Expr *pR
a660: 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20  ight, *pLeft;   
a670: 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64 20     /* Right and 
a680: 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b  left size of LIK
a690: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
a6a0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
a6b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
a6c0: 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20 74  st of operands t
a6d0: 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  o the LIKE opera
a6e0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20  tor */.  int c; 
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a700: 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61      /* One chara
a710: 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20  cter in z[] */. 
a720: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
a730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a740: 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c  umber of non-wil
a750: 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68 61  dcard prefix cha
a760: 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68 61  racters */.  cha
a770: 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20 20  r wc[3];        
a780: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63          /* Wildc
a790: 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20 2a  ard characters *
a7a0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
a7b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
a7c0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
a7d0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ction */.  sqlit
a7e0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
a7f0: 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   0;.  int op;   
a800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a810: 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70 52   /* Opcode of pR
a820: 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21  ight */..  if( !
a830: 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e  sqlite3IsLikeFun
a840: 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c  ction(db, pExpr,
a850: 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b   pnoCase, wc) ){
a860: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a870: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
a880: 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70  _EBCDIC.  if( *p
a890: 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e 20  noCase ) return 
a8a0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73  0;.#endif.  pLis
a8b0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
a8c0: 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c  st;.  pLeft = pL
a8d0: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
a8e0: 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  .  if( pLeft->op
a8f0: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20  !=TK_COLUMN .   
a900: 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  || sqlite3ExprAf
a910: 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d 53  finity(pLeft)!=S
a920: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 0a  QLITE_AFF_TEXT .
a930: 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28     || IsVirtual(
a940: 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20 20 29  pLeft->pTab).  )
a950: 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  {.    /* IMP: R-
a960: 30 32 30 36 35 2d 34 39 34 36 35 20 54 68 65 20  02065-49465 The 
a970: 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  left-hand side o
a980: 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c  f the LIKE or GL
a990: 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  OB operator must
a9a0: 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 6e  .    ** be the n
a9b0: 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 65  ame of an indexe
a9c0: 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45  d column with TE
a9d0: 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  XT affinity. */.
a9e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a9f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  }.  assert( pLef
aa00: 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29  t->iColumn!=(-1)
aa10: 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 49   ); /* Because I
aa20: 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46 46  PK never has AFF
aa30: 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67  _TEXT */..  pRig
aa40: 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  ht = pList->a[0]
aa50: 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20 70  .pExpr;.  op = p
aa60: 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28  Right->op;.  if(
aa70: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
aa80: 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52 69   ){.    op = pRi
aa90: 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20  ght->op2;.  }.  
aaa0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  if( op==TK_VARIA
aab0: 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20  BLE ){.    Vdbe 
aac0: 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20 70 50  *pReprepare = pP
aad0: 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
aae0: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
aaf0: 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
ab00: 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c  ;.    pVal = sql
ab10: 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
ab20: 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72 65  Value(pReprepare
ab30: 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41  , iCol, SQLITE_A
ab40: 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66  FF_NONE);.    if
ab50: 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65  ( pVal && sqlite
ab60: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61  3_value_type(pVa
ab70: 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  l)==SQLITE_TEXT 
ab80: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68  ){.      z = (ch
ab90: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
aba0: 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20  ue_text(pVal);. 
abb0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
abc0: 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70  VdbeSetVarmask(p
abd0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 43  Parse->pVdbe, iC
abe0: 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ol);.    assert(
abf0: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
ac00: 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69 67  VARIABLE || pRig
ac10: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  ht->op==TK_REGIS
ac20: 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  TER );.  }else i
ac30: 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  f( op==TK_STRING
ac40: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69 67   ){.    z = pRig
ac50: 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ht->u.zToken;.  
ac60: 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20  }.  if( z ){.   
ac70: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68   cnt = 0;.    wh
ac80: 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21  ile( (c=z[cnt])!
ac90: 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26  =0 && c!=wc[0] &
aca0: 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21  & c!=wc[1] && c!
acb0: 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20  =wc[2] ){.      
acc0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  cnt++;.    }.   
acd0: 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26 20 32   if( cnt!=0 && 2
ace0: 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d  55!=(u8)z[cnt-1]
acf0: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
ad00: 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 2a  pPrefix;.      *
ad10: 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d  pisComplete = c=
ad20: 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b  =wc[0] && z[cnt+
ad30: 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50 72  1]==0;.      pPr
ad40: 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45 78  efix = sqlite3Ex
ad50: 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47  pr(db, TK_STRING
ad60: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , z);.      if( 
ad70: 70 50 72 65 66 69 78 20 29 20 70 50 72 65 66 69  pPrefix ) pPrefi
ad80: 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d  x->u.zToken[cnt]
ad90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 70 50   = 0;.      *ppP
ada0: 72 65 66 69 78 20 3d 20 70 50 72 65 66 69 78 3b  refix = pPrefix;
adb0: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  .      if( op==T
adc0: 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20  K_VARIABLE ){.  
add0: 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20        Vdbe *v = 
ade0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
adf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ae00: 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c 20  beSetVarmask(v, 
ae10: 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29  pRight->iColumn)
ae20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70  ;.        if( *p
ae30: 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70 52  isComplete && pR
ae40: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  ight->u.zToken[1
ae50: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ] ){.          /
ae60: 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f 66 20  * If the rhs of 
ae70: 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73 73  the LIKE express
ae80: 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62 6c  ion is a variabl
ae90: 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  e, and the curre
aea0: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
aeb0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61 72  value of the var
aec0: 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65 72  iable means ther
aed0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
aee0: 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a  invoke the LIKE.
aef0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e            ** fun
af00: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f  ction, then no O
af10: 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c 20  P_Variable will 
af20: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
af30: 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20 20  program..       
af40: 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73 65     ** This cause
af50: 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74  s problems for t
af60: 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
af70: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29  parameter_name()
af80: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 50  .          ** AP
af90: 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64  I. To workaround
afa0: 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75 6d   them, add a dum
afb0: 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 68  my OP_Variable h
afc0: 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ere..          *
afd0: 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  / .          int
afe0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
aff0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
b000: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b010: 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
b020: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
b030: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
b040: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
b050: 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56 64  eP3(v, sqlite3Vd
b060: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
b070: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  -1, 0);.        
b080: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
b090: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
b0a0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r1);.        }. 
b0b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
b0c0: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20  {.      z = 0;. 
b0d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
b0e0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
b0f0: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a 21  l);.  return (z!
b100: 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  =0);.}.#endif /*
b110: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
b120: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
b130: 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
b140: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
b150: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ABLE./*.** Check
b160: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67   to see if the g
b170: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
b180: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  is of the form.*
b190: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c  *.**         col
b1a0: 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a  umn MATCH expr.*
b1b0: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68  *.** If it is th
b1c0: 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20  en return TRUE. 
b1d0: 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   If not, return 
b1e0: 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  FALSE..*/.static
b1f0: 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f   int isMatchOfCo
b200: 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45  lumn(.  Expr *pE
b210: 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74  xpr      /* Test
b220: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
b230: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73   */.){.  ExprLis
b240: 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28  t *pList;..  if(
b250: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46   pExpr->op!=TK_F
b260: 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72  UNCTION ){.    r
b270: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
b280: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
b290: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
b2a0: 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29 7b  n,"match")!=0 ){
b2b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
b2c0: 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78   }.  pList = pEx
b2d0: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69  pr->x.pList;.  i
b2e0: 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  f( pList->nExpr!
b2f0: 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =2 ){.    return
b300: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   0;.  }.  if( pL
b310: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d  ist->a[1].pExpr-
b320: 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  >op != TK_COLUMN
b330: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
b340: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
b350: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
b360: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
b370: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
b380: 20 49 66 20 74 68 65 20 70 42 61 73 65 20 65 78   If the pBase ex
b390: 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61  pression origina
b3a0: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
b3b0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
b3c0: 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e  .** a join, then
b3d0: 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 61 70   transfer the ap
b3e0: 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e  propriate markin
b3f0: 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76  gs over to deriv
b400: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
b410: 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d  id transferJoinM
b420: 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44  arkings(Expr *pD
b430: 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42  erived, Expr *pB
b440: 61 73 65 29 7b 0a 20 20 69 66 28 20 70 44 65 72  ase){.  if( pDer
b450: 69 76 65 64 20 29 7b 0a 20 20 20 20 70 44 65 72  ived ){.    pDer
b460: 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70  ived->flags |= p
b470: 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50  Base->flags & EP
b480: 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70  _FromJoin;.    p
b490: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
b4a0: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
b4b0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
b4c0: 65 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  e;.  }.}..#if !d
b4d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b4e0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
b4f0: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
b500: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b510: 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  UERY)./*.** Anal
b520: 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20  yze a term that 
b530: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20  consists of two 
b540: 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65  or more OR-conne
b550: 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73  cted.** subterms
b560: 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20  .  So in:.**.** 
b570: 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28      ... WHERE  (
b580: 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52  a=5) AND (b=7 OR
b590: 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e   c=9 OR d=13) AN
b5a0: 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20  D (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 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e       ^^^^^^^^^^^
b5d0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20  ^^^^^^^^^.**.** 
b5e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61  This routine ana
b5f0: 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68  lyzes terms such
b600: 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74   as the middle t
b610: 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65  erm in the above
b620: 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57   example..** A W
b630: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
b640: 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  t is computed an
b650: 64 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  d attached to th
b660: 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20  e term under.** 
b670: 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64  analysis, regard
b680: 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63  less of the outc
b690: 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79  ome of the analy
b6a0: 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a  sis.  Hence:.**.
b6b0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
b6c0: 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54  .wtFlags   |=  T
b6d0: 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20  ERM_ORINFO.**   
b6e0: 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f    WhereTerm.u.pO
b6f0: 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61  rInfo  =  a dyna
b700: 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
b710: 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62  d WhereOrTerm ob
b720: 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ject.**.** The t
b730: 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  erm being analyz
b740: 65 64 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f  ed must have two
b750: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63   or more of OR-c
b760: 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d  onnected subterm
b770: 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73  s..** A single s
b780: 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20  ubterm might be 
b790: 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e  a set of AND-con
b7a0: 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62 74 65  nected sub-subte
b7b0: 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  rms..** Examples
b7c0: 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20   of terms under 
b7d0: 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20  analysis:.**.** 
b7e0: 20 20 20 20 28 41 29 20 20 20 20 20 74 31 2e 78      (A)     t1.x
b7f0: 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32  =t2.y OR t1.x=t2
b800: 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52  .z OR t1.y=15 OR
b810: 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20   t1.z=t3.a+5.** 
b820: 20 20 20 20 28 42 29 20 20 20 20 20 78 3d 65 78      (B)     x=ex
b830: 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f  pr1 OR expr2=x O
b840: 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20  R x=expr3.**    
b850: 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (C)     t1.x=t2
b860: 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a  .y OR (t1.x=t2.z
b870: 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a   AND t1.y=15).**
b880: 20 20 20 20 20 28 44 29 20 20 20 20 20 78 3d 65       (D)     x=e
b890: 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e  xpr1 OR (y>11 AN
b8a0: 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b  D y<22 AND z LIK
b8b0: 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20  E '*hello*').** 
b8c0: 20 20 20 20 28 45 29 20 20 20 20 20 28 70 2e 61      (E)     (p.a
b8d0: 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44  =1 AND q.b=2 AND
b8e0: 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d   r.c=3) OR (p.x=
b8f0: 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20  4 AND q.y=5 AND 
b900: 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53  r.z=6).**.** CAS
b910: 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  E 1:.**.** If al
b920: 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f  l subterms are o
b930: 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65  f the form T.C=e
b940: 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e  xpr for some sin
b950: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20  gle column of C 
b960: 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  and.** a single 
b970: 74 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77  table T (as show
b980: 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61  n in example B a
b990: 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74  bove) then creat
b9a0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a  e a new virtual.
b9b0: 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  ** term that is 
b9c0: 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e  an equivalent IN
b9d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e   expression.  In
b9e0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
b9f0: 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69   the term.** bei
ba00: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a  ng analyzed is:.
ba10: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65  **.**      x = e
ba20: 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20  xpr1  OR  expr2 
ba30: 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70  = x  OR  x = exp
ba40: 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72  r3.**.** then cr
ba50: 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75  eate a new virtu
ba60: 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69  al term like thi
ba70: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  s:.**.**      x 
ba80: 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c  IN (expr1,expr2,
ba90: 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53  expr3).**.** CAS
baa0: 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  E 2:.**.** If al
bab0: 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69  l subterms are i
bac0: 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69  ndexable by a si
bad0: 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68  ngle table T, th
bae0: 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20  en set.**.**    
baf0: 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72   WhereTerm.eOper
bb00: 61 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  ator            
bb10: 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20    =  WO_OR.**   
bb20: 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f    WhereTerm.u.pO
bb30: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
bb40: 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72    |=  the cursor
bb50: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c   number for tabl
bb60: 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74  e T.**.** A subt
bb70: 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c  erm is "indexabl
bb80: 65 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74  e" if it is of t
bb90: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20  he form.** "T.C 
bba0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
bbb0: 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75  re C is any colu
bbc0: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e  mn of table T an
bbd0: 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e  d .** <op> is on
bbe0: 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22  e of "=", "<", "
bbf0: 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20  <=", ">", ">=", 
bc00: 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49  "IS NULL", or "I
bc10: 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  N"..** A subterm
bc20: 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62   is also indexab
bc30: 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41  le if it is an A
bc40: 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ND of two or mor
bc50: 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73  e.** subsubterms
bc60: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
bc70: 20 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61   which is indexa
bc80: 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20  ble.  Indexable 
bc90: 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73  AND .** subterms
bca0: 20 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65   have their eOpe
bcb0: 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f  rator set to WO_
bcc0: 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76  AND and they hav
bcd0: 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20  e.** u.pAndInfo 
bce0: 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63  set to a dynamic
bcf0: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
bd00: 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65  hereAndTerm obje
bd10: 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61  ct..**.** From a
bd20: 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20  nother point of 
bd30: 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65  view, "indexable
bd40: 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  " means that the
bd50: 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a   subterm could.*
bd60: 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65  * potentially be
bd70: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
bd80: 64 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70  dex if an approp
bd90: 72 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73  riate index exis
bda0: 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c  ts..** This anal
bdb0: 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ysis does not co
bdc0: 6e 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f  nsider whether o
bdd0: 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20  r not the index 
bde0: 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20  exists; that.** 
bdf0: 69 73 20 64 65 63 69 64 65 64 20 65 6c 73 65 77  is decided elsew
be00: 68 65 72 65 2e 20 20 54 68 69 73 20 61 6e 61 6c  here.  This anal
be10: 79 73 69 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20  ysis only looks 
be20: 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65  at whether subte
be30: 72 6d 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61  rms.** appropria
be40: 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  te for indexing 
be50: 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  exist..**.** All
be60: 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f   examples A thro
be70: 75 67 68 20 45 20 61 62 6f 76 65 20 73 61 74 69  ugh E above sati
be80: 73 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74  sfy case 2.  But
be90: 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c   if a term.** al
bea0: 73 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61  so statisfies ca
beb0: 73 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29  se 1 (such as B)
bec0: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
bed0: 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c  e optimizer will
bee0: 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65  .** always prefe
bef0: 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20  r case 1, so in 
bf00: 74 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65  that case we pre
bf10: 74 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32  tend that case 2
bf20: 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73   is not.** satis
bf30: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d  fied..**.** It m
bf40: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
bf50: 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74   that multiple t
bf60: 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61  ables are indexa
bf70: 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ble.  For exampl
bf80: 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20  e,.** (E) above 
bf90: 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20  is indexable on 
bfa0: 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64  tables P, Q, and
bfb0: 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20   R..**.** Terms 
bfc0: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73  that satisfy cas
bfd0: 65 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74  e 2 are candidat
bfe0: 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79  es for lookup by
bff0: 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61   using.** separa
c000: 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69  te indices to fi
c010: 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61  nd rowids for ea
c020: 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63  ch subterm and c
c030: 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20  omposing.** the 
c040: 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77  union of all row
c050: 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53  ids using a RowS
c060: 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  et object.  This
c070: 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74   is similar.** t
c080: 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65  o "bitmap indice
c090: 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61  s" in other data
c0a0: 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a  base engines..**
c0b0: 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a  .** OTHERWISE:.*
c0c0: 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20  *.** If neither 
c0d0: 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20  case 1 nor case 
c0e0: 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65  2 apply, then le
c0f0: 61 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f  ave the eOperato
c100: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f  r set to.** zero
c110: 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20  .  This term is 
c120: 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73  not useful for s
c130: 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  earch..*/.static
c140: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
c150: 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69  eOrTerm(.  SrcLi
c160: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
c170: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
c180: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
c190: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
c1a0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f         /* the co
c1b0: 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61  mplete WHERE cla
c1c0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
c1d0: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
c1e0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
c1f0: 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65  he OR-term to be
c200: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
c210: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
c220: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
c230: 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45  o;        /* WHE
c240: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
c250: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c260: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
c270: 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
c280: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
c290: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
c2a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c2b0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
c2c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
c2d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
c2e0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
c2f0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
c300: 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20  idxTerm];    /* 
c310: 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
c320: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70  nalyzed */.  Exp
c330: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
c340: 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->pExpr;        
c350: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
c360: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65  ession of the te
c370: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  rm */.  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: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
c3b0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
c3c0: 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20  e *pOrWc;       
c3d0: 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54  /* Breakup of pT
c3e0: 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  erm into subterm
c3f0: 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  s */.  WhereTerm
c400: 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20   *pOrTerm;      
c410: 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77   /* A Sub-term w
c420: 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20  ithin the pOrWc 
c430: 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f  */.  WhereOrInfo
c440: 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f   *pOrInfo;     /
c450: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  * Additional inf
c460: 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61  ormation associa
c470: 74 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a  ted with pTerm *
c480: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67  /.  Bitmask chng
c490: 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a  ToIN;         /*
c4a0: 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   Tables that mig
c4b0: 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ht satisfy case 
c4c0: 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  1 */.  Bitmask i
c4d0: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
c4e0: 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
c4f0: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73  are indexable, s
c500: 61 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32  atisfying case 2
c510: 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42   */..  /*.  ** B
c520: 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75  reak the OR clau
c530: 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61  se into its sepa
c540: 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20  rate subterms.  
c550: 54 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65  The subterms are
c560: 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  .  ** stored in 
c570: 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  a WhereClause st
c580: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
c590: 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68  ng within the Wh
c5a0: 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f  ereOrInfo.  ** o
c5b0: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74  bject that is at
c5c0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72  tached to the or
c5d0: 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65  iginal OR clause
c5e0: 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73   term..  */.  as
c5f0: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74  sert( (pTerm->wt
c600: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59  Flags & (TERM_DY
c610: 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46  NAMIC|TERM_ORINF
c620: 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29  O|TERM_ANDINFO))
c630: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
c640: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f   pExpr->op==TK_O
c650: 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e  R );.  pTerm->u.
c660: 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66  pOrInfo = pOrInf
c670: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
c680: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
c690: 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20  of(*pOrInfo));. 
c6a0: 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20   if( pOrInfo==0 
c6b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72  ) return;.  pTer
c6c0: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
c6d0: 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72  RM_ORINFO;.  pOr
c6e0: 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77  Wc = &pOrInfo->w
c6f0: 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  c;.  whereClause
c700: 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 49 6e  Init(pOrWc, pWIn
c710: 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  fo);.  whereSpli
c720: 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20  t(pOrWc, pExpr, 
c730: 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e  TK_OR);.  exprAn
c740: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
c750: 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d  OrWc);.  if( db-
c760: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
c770: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
c780: 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d  ( pOrWc->nTerm>=
c790: 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  2 );..  /*.  ** 
c7a0: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20  Compute the set 
c7b0: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d  of tables that m
c7c0: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
c7d0: 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a  es 1 or 2..  */.
c7e0: 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28    indexable = ~(
c7f0: 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e  Bitmask)0;.  chn
c800: 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73  gToIN = ~(Bitmas
c810: 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72  k)0;.  for(i=pOr
c820: 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72  Wc->nTerm-1, pOr
c830: 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69  Term=pOrWc->a; i
c840: 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65  >=0 && indexable
c850: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
c860: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54  ){.    if( (pOrT
c870: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
c880: 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29   WO_SINGLE)==0 )
c890: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e 64  {.      WhereAnd
c8a0: 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a  Info *pAndInfo;.
c8b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
c8c0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
c8d0: 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c  & (TERM_ANDINFO|
c8e0: 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30  TERM_ORINFO))==0
c8f0: 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f   );.      chngTo
c900: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41  IN = 0;.      pA
c910: 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  ndInfo = sqlite3
c920: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
c930: 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f  sizeof(*pAndInfo
c940: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  ));.      if( pA
c950: 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  ndInfo ){.      
c960: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
c970: 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57  AndWC;.        W
c980: 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65  hereTerm *pAndTe
c990: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rm;.        int 
c9a0: 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  j;.        Bitma
c9b0: 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk b = 0;.      
c9c0: 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e    pOrTerm->u.pAn
c9d0: 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f  dInfo = pAndInfo
c9e0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
c9f0: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
ca00: 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20  RM_ANDINFO;.    
ca10: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70      pOrTerm->eOp
ca20: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b  erator = WO_AND;
ca30: 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20  .        pAndWC 
ca40: 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  = &pAndInfo->wc;
ca50: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c  .        whereCl
ca60: 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c  auseInit(pAndWC,
ca70: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20   pWC->pWInfo);. 
ca80: 20 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69         whereSpli
ca90: 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72  t(pAndWC, pOrTer
caa0: 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44  m->pExpr, TK_AND
cab0: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41  );.        exprA
cac0: 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20  nalyzeAll(pSrc, 
cad0: 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20  pAndWC);.       
cae0: 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20   pAndWC->pOuter 
caf0: 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74  = pWC;.        t
cb00: 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c  estcase( db->mal
cb10: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
cb20: 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61       if( !db->ma
cb30: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
cb40: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
cb50: 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43   pAndTerm=pAndWC
cb60: 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e  ->a; j<pAndWC->n
cb70: 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54  Term; j++, pAndT
cb80: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
cb90: 20 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64      assert( pAnd
cba0: 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
cbb0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
cbc0: 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72  llowedOp(pAndTer
cbd0: 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b  m->pExpr->op) ){
cbe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
cbf0: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49   |= getMask(&pWI
cc00: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
cc10: 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  AndTerm->leftCur
cc20: 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sor);.          
cc30: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
cc40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cc50: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
cc60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
cc70: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
cc80: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
cc90: 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20 20  COPIED ){.      
cca0: 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65 72  /* Skip this ter
ccb0: 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72  m for now.  We r
ccc0: 65 76 69 73 69 74 20 69 74 20 77 68 65 6e 20 77  evisit it when w
ccd0: 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20 20  e process the.  
cce0: 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e      ** correspon
ccf0: 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55 41  ding TERM_VIRTUA
cd00: 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65  L term */.    }e
cd10: 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
cd20: 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20  sk b;.      b = 
cd30: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
cd40: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  >sMaskSet, pOrTe
cd50: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  rm->leftCursor);
cd60: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
cd70: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
cd80: 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20  RM_VIRTUAL ){.  
cd90: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
cda0: 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63  *pOther = &pOrWc
cdb0: 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61  ->a[pOrTerm->iPa
cdc0: 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62  rent];.        b
cdd0: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49   |= getMask(&pWI
cde0: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
cdf0: 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f  Other->leftCurso
ce00: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
ce10: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
ce20: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 72  ;.      if( (pOr
ce30: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
ce40: 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20  & WO_EQ)==0 ){. 
ce50: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
ce60: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
ce70: 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f  {.        chngTo
ce80: 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d  IN &= b;.      }
ce90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
cea0: 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  .  ** Record the
ceb0: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
cec0: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
ced0: 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67   2.  The set mig
cee0: 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79  ht be.  ** empty
cef0: 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f  ..  */.  pOrInfo
cf00: 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e  ->indexable = in
cf10: 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d  dexable;.  pTerm
cf20: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e  ->eOperator = in
cf30: 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a  dexable==0 ? 0 :
cf40: 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20   WO_OR;..  /*.  
cf50: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64  ** chngToIN hold
cf60: 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65  s a set of table
cf70: 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73  s that *might* s
cf80: 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20  atisfy case 1.  
cf90: 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65  But.  ** we have
cfa0: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69   to do some addi
cfb0: 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20  tional checking 
cfc0: 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31  to see if case 1
cfd0: 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20   really.  ** is 
cfe0: 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a  satisfied..  **.
cff0: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69    ** chngToIN wi
d000: 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30  ll hold either 0
d010: 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20  , 1, or 2 bits. 
d020: 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 20   The 0-bit case 
d030: 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
d040: 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73  there is no poss
d050: 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73  ibility of trans
d060: 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63  forming the OR c
d070: 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20  lause into an.  
d080: 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62  ** IN operator b
d090: 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f  ecause one or mo
d0a0: 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
d0b0: 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  OR clause contai
d0c0: 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67  n.  ** something
d0d0: 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f   other than == o
d0e0: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  n a column in th
d0f0: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
d100: 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20   The 1-bit.  ** 
d110: 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20  case means that 
d120: 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
d130: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f  e OR clause is o
d140: 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20  f the form.  ** 
d150: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78  "table.column=ex
d160: 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e  pr" for some sin
d170: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
d180: 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 20  one bit that is 
d190: 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f  set.  ** will co
d1a0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
d1b0: 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57  common table.  W
d1c0: 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
d1d0: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20  check to make.  
d1e0: 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d 65  ** sure the same
d1f0: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
d200: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54  on all terms.  T
d210: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 73  he 2-bit case is
d220: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61   when.  ** the a
d230: 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20  ll terms are of 
d240: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31  the form "table1
d250: 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63  .column=table2.c
d260: 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a  olumn".  It.  **
d270: 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62   might be possib
d280: 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e  le to form an IN
d290: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 65   operator with e
d2a0: 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c  ither table1.col
d2b0: 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c  umn.  ** or tabl
d2c0: 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  e2.column as the
d2d0: 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 69   LHS if either i
d2e0: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72  s common to ever
d2f0: 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74  y term of.  ** t
d300: 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20  he OR clause..  
d310: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
d320: 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  t terms of the f
d330: 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d  orm "table.colum
d340: 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32  n1=table.column2
d350: 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  " (the.  ** same
d360: 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73   table on both s
d370: 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20  izes of the ==) 
d380: 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
d390: 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
d3a0: 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20  chngToIN ){.    
d3b0: 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  int okToChngToIN
d3c0: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
d3d0: 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73  e if the convers
d3e0: 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c  ion to IN is val
d3f0: 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  id */.    int iC
d400: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20  olumn = -1;     
d410: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e      /* Column in
d420: 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e  dex on lhs of IN
d430: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
d440: 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d   int iCursor = -
d450: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  1;         /* Ta
d460: 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f  ble cursor commo
d470: 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a  n to all terms *
d480: 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b  /.    int j = 0;
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
d4b0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  */..    /* Searc
d4c0: 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e  h for a table an
d4d0: 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70  d column that ap
d4e0: 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64  pears on one sid
d4f0: 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  e or the.    ** 
d500: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20  other of the == 
d510: 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72  operator in ever
d520: 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74  y subterm.  That
d530: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
d540: 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65  n.    ** will be
d550: 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75   recorded in iCu
d560: 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e  rsor and iColumn
d570: 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e  .  There might n
d580: 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a  ot be any.    **
d590: 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20   such table and 
d5a0: 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54  column.  Set okT
d5b0: 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20  oChngToIN if an 
d5c0: 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c  appropriate tabl
d5d0: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c  e.    ** and col
d5e0: 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74  umn is found but
d5f0: 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54   leave okToChngT
d600: 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  oIN false if not
d610: 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20   found..    */. 
d620: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20     for(j=0; j<2 
d630: 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  && !okToChngToIN
d640: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f  ; j++){.      pO
d650: 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61  rTerm = pOrWc->a
d660: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f  ;.      for(i=pO
d670: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e  rWc->nTerm-1; i>
d680: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
d690: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
d6a0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
d6b0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
d6c0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  );.        pOrTe
d6d0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e  rm->wtFlags &= ~
d6e0: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
d6f0: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
d700: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
d710: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
d720: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
d730: 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20   2-bit case and 
d740: 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65  we are on the se
d750: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61  cond iteration a
d760: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
d770: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20  current term is 
d780: 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69  from the first i
d790: 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b  teration.  So sk
d7a0: 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f  ip this term. */
d7b0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
d7c0: 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20  t( j==1 );.     
d7d0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
d7e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d7f0: 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26   if( (chngToIN &
d800: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
d810: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  ->sMaskSet, pOrT
d820: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
d830: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
d840: 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d    /* This term m
d850: 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f  ust be of the fo
d860: 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68  rm t1.a==t2.b wh
d870: 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65  ere t2 is in the
d880: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68  .          ** ch
d890: 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74  ngToIN set but t
d8a0: 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20  1 is not.  This 
d8b0: 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74  term will be eit
d8c0: 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20  her preceeded.  
d8d0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f          ** or fo
d8e0: 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65  llwed by an inve
d8f0: 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d  rted copy (t2.b=
d900: 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68  =t1.a).  Skip th
d910: 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20  is term .       
d920: 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74     ** and use it
d930: 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a  s inversion. */.
d940: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
d950: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
d960: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
d970: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ED );.          
d980: 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72  testcase( pOrTer
d990: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
d9a0: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
d9b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d9c0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
d9d0: 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54  & (TERM_COPIED|T
d9e0: 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a  ERM_VIRTUAL) );.
d9f0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
da00: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
da10: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
da20: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
da30: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69  olumn;.        i
da40: 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d  Cursor = pOrTerm
da50: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20  ->leftCursor;.  
da60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
da70: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
da80: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
da90: 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61   No candidate ta
daa0: 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66  ble+column was f
dab0: 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20  ound.  This can 
dac0: 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20  only occur.     
dad0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63     ** on the sec
dae0: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ond iteration */
daf0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
db00: 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20   j==1 );.       
db10: 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72   assert( IsPower
db20: 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20  OfTwo(chngToIN) 
db30: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
db40: 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74  t( chngToIN==get
db50: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
db60: 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29  askSet, iCursor)
db70: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
db80: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
db90: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20   testcase( j==1 
dba0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  );..      /* We 
dbb0: 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e  have found a can
dbc0: 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64  didate table and
dbd0: 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20   column.  Check 
dbe0: 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20  to see if that. 
dbf0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e       ** table an
dc00: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d  d column is comm
dc10: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
dc20: 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73   in the OR claus
dc30: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43  e */.      okToC
dc40: 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  hngToIN = 1;.   
dc50: 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26     for(; i>=0 &&
dc60: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69   okToChngToIN; i
dc70: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
dc80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
dc90: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
dca0: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
dcb0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
dcc0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
dcd0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
dce0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
dcf0: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
dd00: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
dd10: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
dd20: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43  u.leftColumn!=iC
dd30: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
dd40: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
dd50: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
dd60: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
dd70: 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69  t affLeft, affRi
dd80: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  ght;.          /
dd90: 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68  * If the right-h
dda0: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f  and side is also
ddb0: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
ddc0: 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20  the affinities. 
ddd0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62           ** of b
dde0: 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65  oth right and le
ddf0: 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65  ft sides must be
de00: 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79   such that no ty
de10: 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  pe.          ** 
de20: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20  conversions are 
de30: 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  required on the 
de40: 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20  right.  (Ticket 
de50: 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20  #2249).         
de60: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66   */.          af
de70: 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  fRight = sqlite3
de80: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
de90: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
dea0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
deb0: 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  affLeft = sqlite
dec0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
ded0: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
dee0: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
def0: 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20  if( affRight!=0 
df00: 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66  && affRight!=aff
df10: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
df20: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
df30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
df40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
df50: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
df60: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f  ags |= TERM_OR_O
df70: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
df80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
df90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
dfa0: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b  t this point, ok
dfb0: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72  ToChngToIN is tr
dfc0: 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70  ue if original p
dfd0: 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20  Term satisfies. 
dfe0: 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49     ** case 1.  I
dff0: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e  n that case, con
e000: 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72  struct a new vir
e010: 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69  tual term that i
e020: 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20  s .    ** pTerm 
e030: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
e040: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n IN operator.. 
e050: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b     */.    if( ok
e060: 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ToChngToIN ){.  
e070: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20      Expr *pDup; 
e080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
e090: 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63  transient duplic
e0a0: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  ate expression *
e0b0: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
e0c0: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f   *pList = 0;   /
e0d0: 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65  * The RHS of the
e0e0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
e0f0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
e100: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
e110: 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
e120: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
e130: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20      Expr *pNew; 
e140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e150: 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70  e complete IN op
e160: 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20  erator */..     
e170: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
e180: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
e190: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  OrWc->a; i>=0; i
e1a0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
e1b0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
e1c0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
e1d0: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29  TERM_OR_OK)==0 )
e1e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
e1f0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
e200: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
e210: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
e220: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
e230: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
e240: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20  ursor );.       
e250: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
e260: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
e270: 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  iColumn );.     
e280: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
e290: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72  3ExprDup(db, pOr
e2a0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
e2b0: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
e2c0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
e2d0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
e2e0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
e2f0: 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20  List, pDup);.   
e300: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72       pLeft = pOr
e310: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
e320: 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ft;.      }.    
e330: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
e340: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70  =0 );.      pDup
e350: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
e360: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
e370: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
e380: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
e390: 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20  e, TK_IN, pDup, 
e3a0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
e3b0: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
e3c0: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
e3d0: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
e3e0: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20  nMarkings(pNew, 
e3f0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
e400: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
e410: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
e420: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
e430: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
e440: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
e450: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
e460: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
e470: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52  t(pWC, pNew, TER
e480: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
e490: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
e4a0: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
e4b0: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  w==0 );.        
e4c0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
e4d0: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
e4e0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
e4f0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
e500: 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61  ;.        pWC->a
e510: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
e520: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
e530: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
e540: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 1;.      }el
e550: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
e560: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
e570: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
e580: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72      }.      pTer
e590: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
e5a0: 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65  O_NOOP;  /* case
e5b0: 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32   1 trumps case 2
e5c0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   */.    }.  }.}.
e5d0: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
e5e0: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
e5f0: 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54  ZATION && !SQLIT
e600: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
e610: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  */../*.** The in
e620: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
e630: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
e640: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
e650: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
e660: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
e670: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
e680: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
e690: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
e6a0: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
e6b0: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
e6c0: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
e6d0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
e6e0: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
e6f0: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
e700: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e710: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
e720: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
e730: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
e740: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
e750: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
e760: 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49  <expr>"..**.** I
e770: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e780: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
e790: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
e7a0: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72   both X and Y ar
e7b0: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  e.** columns, th
e7c0: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
e7d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
e7e0: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65  changed and a ne
e7f0: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
e800: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59  m of the form "Y
e810: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
e820: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
e830: 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61  lause and.** ana
e840: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
e850: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
e860: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
e870: 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a  ith TERM_COPIED.
e880: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74  ** and the new t
e890: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
e8a0: 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20  th TERM_DYNAMIC 
e8b0: 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45  (because it's pE
e8c0: 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  xpr.** needs to 
e8d0: 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68  be freed with th
e8e0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61  e WhereClause) a
e8f0: 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  nd TERM_VIRTUAL 
e900: 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69  (because it.** i
e910: 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70  s a commuted cop
e920: 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72  y of a prior ter
e930: 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61  m.)  The origina
e940: 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c  l term has nChil
e950: 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  d=1.** and the c
e960: 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e  opy has idxParen
e970: 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  t set to the ind
e980: 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ex of the origin
e990: 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  al term..*/.stat
e9a0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
e9b0: 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  yze(.  SrcList *
e9c0: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
e9d0: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
e9e0: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
e9f0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
ea00: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
ea10: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
ea20: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
ea30: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
ea40: 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  f the term to be
ea50: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
ea60: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
ea70: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
ea80: 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  o; /* WHERE clau
ea90: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f  se processing co
eaa0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
eab0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ead0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
eae0: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alyzed */.  Wher
eaf0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
eb00: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
eb10: 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64  Set of table ind
eb20: 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78  ex masks */.  Ex
eb30: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eb50: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
eb60: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
eb70: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
eb80: 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20  reqLeft;        
eb90: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
eba0: 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45  esites of the pE
ebb0: 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20  xpr->pLeft */.  
ebc0: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
ebd0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
ebe0: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
ebf0: 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20  s of pExpr */.  
ec00: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67  Bitmask extraRig
ec10: 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ht = 0;         
ec20: 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64   /* Extra depend
ec30: 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a  encies on LEFT J
ec40: 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  OIN */.  Expr *p
ec50: 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Str1 = 0;       
ec60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
ec70: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
ec80: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
ec90: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ecb0: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
ecc0: 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63   ends with wildc
ecd0: 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ard */.  int noC
ece0: 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ase = 0;        
ecf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b            /* LIK
ed00: 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69  E/GLOB distingui
ed10: 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69  shes case */.  i
ed20: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
ed30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed40: 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65  /* Top-level ope
ed50: 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f  rator.  pExpr->o
ed60: 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  p */.  Parse *pP
ed70: 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
ed80: 50 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69  Parse;  /* Parsi
ed90: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
eda0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
edb0: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
edc0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
edd0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  nection */..  if
ede0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
edf0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
ee00: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
ee10: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
ee20: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
ee30: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
ee40: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
ee50: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  m->pExpr;.  asse
ee60: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
ee70: 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_AS && pExpr->o
ee80: 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p!=TK_COLLATE );
ee90: 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20  .  prereqLeft = 
eea0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
eeb0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
eec0: 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70  pLeft);.  op = p
eed0: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
eee0: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
eef0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
ef00: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
ef10: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
ef20: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
ef30: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
ef40: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
ef50: 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65  Right = exprSele
ef60: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
ef70: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
ef80: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
ef90: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
efa0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
efb0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
efc0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
efd0: 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
efe0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
eff0: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
f000: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
f010: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d  eqRight = 0;.  }
f020: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
f030: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
f040: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
f050: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
f060: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
f070: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
f080: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
f090: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
f0a0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
f0b0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
f0c0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d  oin) ){.    Bitm
f0d0: 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28  ask x = getMask(
f0e0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
f0f0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
f100: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c  );.    prereqAll
f110: 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61   |= x;.    extra
f120: 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a  Right = x-1;  /*
f130: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
f140: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
f150: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20   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 2a 2a 20 6f 6e 20 6c 65 66 74        ** on left
f180: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
f190: 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23   JOIN.  Ticket #
f1a0: 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  3015 */.  }.  pT
f1b0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
f1c0: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
f1d0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
f1e0: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
f1f0: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
f200: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f210: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
f220: 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20  edOp(op) ){.    
f230: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
f240: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
f250: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  late(pExpr->pLef
f260: 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  t);.    Expr *pR
f270: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
f280: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
f290: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
f2a0: 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28    u16 opMask = (
f2b0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
f2c0: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
f2d0: 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57  ==0 ? WO_ALL : W
f2e0: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28  O_EQUIV;.    if(
f2f0: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
f300: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
f310: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
f320: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
f330: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75  ;.      pTerm->u
f340: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
f350: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
f360: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
f370: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
f380: 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b  ask(op) & opMask
f390: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f3a0: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
f3b0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
f3c0: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
f3d0: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
f3e0: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
f3f0: 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d    u16 eExtraOp =
f400: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78   0;        /* Ex
f410: 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65  tra bits for pNe
f420: 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  w->eOperator */.
f430: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
f440: 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29  >leftCursor>=0 )
f450: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
f460: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44  xNew;.        pD
f470: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
f480: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
f490: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
f4a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f4b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
f4c0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
f4d0: 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
f4e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
f4f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64      }.        id
f500: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
f510: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44  seInsert(pWC, pD
f520: 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  up, TERM_VIRTUAL
f530: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
f540: 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e          if( idxN
f550: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
f560: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26          pNew = &
f570: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
f580: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50          pNew->iP
f590: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
f5a0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
f5b0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
f5c0: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
f5d0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
f5e0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
f5f0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
f600: 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IED;.        if(
f610: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
f620: 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45  Q.         && !E
f630: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
f640: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
f650: 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  n).         && O
f660: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
f670: 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72  ed(db, SQLITE_Tr
f680: 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20  ansitive).      
f690: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
f6a0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f6b0: 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20  |= WO_EQUIV;.   
f6c0: 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20         eExtraOp 
f6d0: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
f6e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f6f0: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e{.        pDup 
f700: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
f710: 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20   pNew = pTerm;. 
f720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
f730: 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c  rCommute(pParse,
f740: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c   pDup);.      pL
f750: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
f760: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75  rSkipCollate(pDu
f770: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  p->pLeft);.     
f780: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
f790: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
f7a0: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  e;.      pNew->u
f7b0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
f7c0: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
f7d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
f7e0: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
f7f0: 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65  aRight) != prere
f800: 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70  qLeft );.      p
f810: 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74  New->prereqRight
f820: 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20   = prereqLeft | 
f830: 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20  extraRight;.    
f840: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c    pNew->prereqAl
f850: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
f860: 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72       pNew->eOper
f870: 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72  ator = (operator
f880: 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b  Mask(pDup->op) +
f890: 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d   eExtraOp) & opM
f8a0: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ask;.    }.  }..
f8b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f8c0: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
f8d0: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66  MIZATION.  /* If
f8e0: 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42   a term is the B
f8f0: 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c  ETWEEN operator,
f900: 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20   create two new 
f910: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20  virtual terms.  
f920: 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74  ** that define t
f930: 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68  he range that th
f940: 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d  e BETWEEN implem
f950: 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ents.  For examp
f960: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
f970: 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41     a BETWEEN b A
f980: 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69  ND c.  **.  ** i
f990: 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  s converted into
f9a0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
f9b0: 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e   (a BETWEEN b AN
f9c0: 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20  D c) AND (a>=b) 
f9d0: 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a  AND (a<=c).  **.
f9e0: 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77    ** The two new
f9f0: 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
fa00: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
fa10: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
fa20: 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68   object..  ** Th
fa30: 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  e new terms are 
fa40: 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72  "dynamic" and ar
fa50: 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68  e children of th
fa60: 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45  e original BETWE
fa70: 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54  EN.  ** term.  T
fa80: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69  hat means that i
fa90: 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65  f the BETWEEN te
faa0: 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65  rm is coded, the
fab0: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20   children are.  
fac0: 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c  ** skipped.  Or,
fad0: 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e   if the children
fae0: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62   are satisfied b
faf0: 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20  y an index, the 
fb00: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45  original.  ** BE
fb10: 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b  TWEEN term is sk
fb20: 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
fb30: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
fb40: 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20  ==TK_BETWEEN && 
fb50: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
fb60: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
fb70: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
fb80: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  x.pList;.    int
fb90: 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   i;.    static c
fba0: 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20  onst u8 ops[] = 
fbb0: 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a  {TK_GE, TK_LE};.
fbc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
fbd0: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
fbe0: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
fbf0: 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==2 );.    for(i
fc00: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
fc10: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
fc20: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
fc30: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65  dxNew;.      pNe
fc40: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
fc50: 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73  Expr(pParse, ops
fc60: 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  [i], .          
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
fc90: 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  p(db, pExpr->pLe
fca0: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcc0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fcd0: 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
fce0: 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30  [i].pExpr, 0), 0
fcf0: 29 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 66 65  );.      transfe
fd00: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e  rJoinMarkings(pN
fd10: 65 77 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a  ewExpr, pExpr);.
fd20: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
fd30: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
fd40: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
fd50: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
fd60: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
fd70: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
fd80: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ew==0 );.      e
fd90: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
fda0: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
fdb0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
fdc0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
fdd0: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
fde0: 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew].iParent = id
fdf0: 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  xTerm;.    }.   
fe00: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
fe10: 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   2;.  }.#endif /
fe20: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  * SQLITE_OMIT_BE
fe30: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
fe40: 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  ON */..#if !defi
fe50: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
fe60: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
fe70: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
fe80: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
fe90: 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  Y).  /* Analyze 
fea0: 61 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 63  a term that is c
feb0: 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f  omposed of two o
fec0: 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20  r more subterms 
fed0: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a  connected by.  *
fee0: 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72  * an OR operator
fef0: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
ff00: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
ff10: 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OR ){.    assert
ff20: 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  ( pWC->op==TK_AN
ff30: 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  D );.    exprAna
ff40: 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c  lyzeOrTerm(pSrc,
ff50: 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a   pWC, idxTerm);.
ff60: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
ff70: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
ff80: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ff90: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
ffa0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
ffb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ffc0: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
ffd0: 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74  N.  /* Add const
ffe0: 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65  raints to reduce
fff0: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
10000 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47  e on a LIKE or G
10010 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  LOB.  ** operato
10020 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c  r..  **.  ** A l
10030 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74  ike pattern of t
10040 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20  he form "x LIKE 
10050 27 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67  'abc%'" is chang
10060 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69  ed into constrai
10070 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  nts.  **.  **   
10080 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20         x>='abc' 
10090 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20  AND x<'abd' AND 
100a0 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20  x LIKE 'abc%'.  
100b0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74  **.  ** The last
100c0 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
100d0 65 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69  e prefix "abc" i
100e0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f  s incremented to
100f0 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74   form the.  ** t
10100 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69  ermination condi
10110 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f  tion "abd"..  */
10120 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d  .  if( pWC->op==
10130 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73  TK_AND .   && is
10140 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73  LikeOrGlob(pPars
10150 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31  e, pExpr, &pStr1
10160 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26  , &isComplete, &
10170 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20  noCase).  ){.   
10180 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20   Expr *pLeft;   
10190 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49      /* LHS of LI
101a0 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
101b0 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53   */.    Expr *pS
101c0 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f  tr2;       /* Co
101d0 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48  py of pStr1 - RH
101e0 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
101f0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
10200 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a  xpr *pNewExpr1;.
10210 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
10220 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  pr2;.    int idx
10230 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64  New1;.    int id
10240 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e  xNew2;.    Token
10250 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20   sCollSeqName;  
10260 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
10270 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
10280 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45  ..    pLeft = pE
10290 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
102a0 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53  1].pExpr;.    pS
102b0 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tr2 = sqlite3Exp
102c0 72 44 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20  rDup(db, pStr1, 
102d0 30 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d  0);.    if( !db-
102e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
102f0 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43  .      u8 c, *pC
10300 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  ;       /* Last 
10310 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65  character before
10320 20 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63   the first wildc
10330 61 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20  ard */.      pC 
10340 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75  = (u8*)&pStr2->u
10350 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53  .zToken[sqlite3S
10360 74 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75  trlen30(pStr2->u
10370 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20  .zToken)-1];.   
10380 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20     c = *pC;.    
10390 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a    if( noCase ){.
103a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
103b0 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65  oint is to incre
103c0 6d 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68  ment the last ch
103d0 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74  aracter before t
103e0 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
103f0 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42   ** wildcard.  B
10400 75 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65  ut if we increme
10410 6e 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c  nt '@', that wil
10420 6c 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74  l push it into t
10430 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  he.        ** al
10440 70 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77  phabetic range w
10450 68 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72  here case conver
10460 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20  sions will mess 
10470 75 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  up the .        
10480 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  ** inequality.  
10490 54 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d  To avoid this, m
104a0 61 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f  ake sure to also
104b0 20 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20   run the full.  
104c0 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e        ** LIKE on
104d0 20 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65   all candidate e
104e0 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c  xpressions by cl
104f0 65 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d  earing the isCom
10500 70 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20  plete flag.     
10510 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
10520 28 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43  ( c=='A'-1 ) isC
10530 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20  omplete = 0;.   
10540 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
10550 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b  UpperToLower[c];
10560 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
10570 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20  pC = c + 1;.    
10580 7d 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61  }.    sCollSeqNa
10590 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20  me.z = noCase ? 
105a0 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41  "NOCASE" : "BINA
105b0 52 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65  RY";.    sCollSe
105c0 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20  qName.n = 6;.   
105d0 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
105e0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
105f0 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70  pLeft, 0);.    p
10600 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
10610 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
10620 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20  TK_GE, .        
10630 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
10640 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
10650 61 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26  arse,pNewExpr1,&
10660 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20  sCollSeqName),. 
10670 20 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c            pStr1,
10680 20 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65   0);.    transfe
10690 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e  rJoinMarkings(pN
106a0 65 77 45 78 70 72 31 2c 20 70 45 78 70 72 29 3b  ewExpr1, pExpr);
106b0 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77  .    idxNew1 = w
106c0 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
106d0 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c  (pWC, pNewExpr1,
106e0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
106f0 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
10700 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
10710 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70  w1==0 );.    exp
10720 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
10730 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20  WC, idxNew1);.  
10740 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71    pNewExpr2 = sq
10750 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
10760 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20   pLeft, 0);.    
10770 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69  pNewExpr2 = sqli
10780 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
10790 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20   TK_LT,.        
107a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
107b0 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
107c0 61 72 73 65 2c 70 4e 65 77 45 78 70 72 32 2c 26  arse,pNewExpr2,&
107d0 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20  sCollSeqName),. 
107e0 20 20 20 20 20 20 20 20 20 20 70 53 74 72 32 2c            pStr2,
107f0 20 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65   0);.    transfe
10800 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e  rJoinMarkings(pN
10810 65 77 45 78 70 72 32 2c 20 70 45 78 70 72 29 3b  ewExpr2, pExpr);
10820 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77  .    idxNew2 = w
10830 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
10840 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c  (pWC, pNewExpr2,
10850 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
10860 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
10870 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
10880 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70  w2==0 );.    exp
10890 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
108a0 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20  WC, idxNew2);.  
108b0 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
108c0 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
108d0 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29  if( isComplete )
108e0 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  {.      pWC->a[i
108f0 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20  dxNew1].iParent 
10900 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
10910 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d   pWC->a[idxNew2]
10920 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
10930 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  rm;.      pTerm-
10940 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20  >nChild = 2;.   
10950 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
10960 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
10970 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
10980 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
10990 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
109a0 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57  BLE.  /* Add a W
109b0 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72  O_MATCH auxiliar
109c0 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f  y term to the co
109d0 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20  nstraint set if 
109e0 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
109f0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
10a00 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c  f the form:  col
10a10 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a  umn MATCH expr..
10a20 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d    ** This inform
10a30 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  ation is used by
10a40 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
10a50 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20  methods of.  ** 
10a60 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20  virtual tables. 
10a70 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72   The native quer
10a80 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73  y optimizer does
10a90 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a   not attempt.  *
10aa0 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67  * to do anything
10ab0 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63   with MATCH func
10ac0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
10ad0 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  ( isMatchOfColum
10ae0 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
10af0 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
10b00 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
10b10 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54  Left;.    WhereT
10b20 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20  erm *pNewTerm;. 
10b30 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65     Bitmask prere
10b40 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45  qColumn, prereqE
10b50 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74  xpr;..    pRight
10b60 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
10b70 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
10b80 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
10b90 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
10ba0 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65  pExpr;.    prere
10bb0 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c  qExpr = exprTabl
10bc0 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
10bd0 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72   pRight);.    pr
10be0 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70  ereqColumn = exp
10bf0 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
10c00 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20  kSet, pLeft);.  
10c10 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78 70    if( (prereqExp
10c20 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  r & prereqColumn
10c30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
10c40 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
10c50 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
10c60 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
10c70 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20  se, 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 30 2c 20               0, 
10ca0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
10cb0 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30  b, pRight, 0), 0
10cc0 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
10cd0 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
10ce0 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
10cf0 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
10d00 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
10d10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
10d20 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
10d30 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57    pNewTerm = &pW
10d40 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
10d50 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
10d60 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72  ereqRight = prer
10d70 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  eqExpr;.      pN
10d80 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ewTerm->leftCurs
10d90 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
10da0 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  le;.      pNewTe
10db0 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
10dc0 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
10dd0 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  n;.      pNewTer
10de0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
10df0 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70  O_MATCH;.      p
10e00 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  NewTerm->iParent
10e10 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
10e20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
10e30 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
10e40 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
10e50 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  = 1;.      pTerm
10e60 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
10e70 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
10e80 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
10e90 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65  All = pTerm->pre
10ea0 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  reqAll;.    }.  
10eb0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10ec0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
10ed0 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ABLE */..#ifdef 
10ee0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
10ef0 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f  AT3_OR_STAT4.  /
10f00 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74  * When sqlite_st
10f10 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61  at3 histogram da
10f20 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ta is available 
10f30 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74  an operator of t
10f40 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20  he.  ** form "x 
10f50 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e  IS NOT NULL" can
10f60 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76   sometimes be ev
10f70 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66  aluated more eff
10f80 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73  iciently.  ** as
10f90 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69   "x>NULL" if x i
10fa0 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
10fb0 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53   PRIMARY KEY.  S
10fc0 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20  o construct a.  
10fd0 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  ** virtual term 
10fe0 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20  of that form..  
10ff0 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
11000 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 65  t the virtual te
11010 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67 65  rm must be tagge
11020 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c  d with TERM_VNUL
11030 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45  L.  This.  ** TE
11040 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c  RM_VNULL tag wil
11050 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20 6e  l suppress the n
11060 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74  ot-null check at
11070 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
11080 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e   ** of the loop.
11090 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54 45    Without the TE
110a0 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74  RM_VNULL flag, t
110b0 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63  he not-null chec
110c0 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74  k at.  ** the st
110d0 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  art of the loop 
110e0 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79  will prevent any
110f0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65   results from be
11100 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  ing returned..  
11110 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
11120 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20  op==TK_NOTNULL. 
11130 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
11140 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
11150 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
11160 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a  eft->iColumn>=0.
11170 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
11180 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
11190 4c 49 54 45 5f 53 74 61 74 33 29 0a 20 20 29 7b  LITE_Stat3).  ){
111a0 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
111b0 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
111c0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
111d0 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  eft;.    int idx
111e0 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65  New;.    WhereTe
111f0 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20  rm *pNewTerm;.. 
11200 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
11210 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
11220 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20  e, 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 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11250 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20  rDup(db, pLeft, 
11260 30 29 2c 0a 20 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 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
11290 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c  rse, TK_NULL, 0,
112a0 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20   0, 0), 0);..   
112b0 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
112c0 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
112d0 20 70 4e 65 77 45 78 70 72 2c 0a 20 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 54 45 52 4d 5f 56 49           TERM_VI
11300 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
11310 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a  IC|TERM_VNULL);.
11320 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 20 29      if( idxNew )
11330 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  {.      pNewTerm
11340 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65   = &pWC->a[idxNe
11350 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  w];.      pNewTe
11360 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
11370 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  = 0;.      pNewT
11380 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
11390 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
113a0 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
113b0 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
113c0 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
113d0 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
113e0 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47  eOperator = WO_G
113f0 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  T;.      pNewTer
11400 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  m->iParent = idx
11410 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
11420 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
11430 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  erm];.      pTer
11440 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
11450 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
11460 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
11470 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  ED;.      pNewTe
11480 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
11490 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
114a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
114b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
114c0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
114d0 54 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76  T4 */..  /* Prev
114e0 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65  ent ON clause te
114f0 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  rms of a LEFT JO
11500 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73  IN from being us
11510 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a  ed to drive.  **
11520 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61   an index for ta
11530 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
11540 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
11550 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  */.  pTerm->prer
11560 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72 61  eqRight |= extra
11570 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Right;.}../*.** 
11580 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
11590 61 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72  arches pList for
115a0 20 61 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61   a entry that ma
115b0 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74  tches the iCol-t
115c0 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69  h column.** of i
115d0 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
115e0 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72   If such an expr
115f0 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
11600 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c   its index in pL
11610 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75  ist->a[] is retu
11620 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65  rned. If.** no e
11630 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
11640 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  nd, -1 is return
11650 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
11660 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a  t findIndexCol(.
11670 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11690 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
116a0 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
116b0 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
116c0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
116d0 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65  ssion list to se
116e0 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42  arch */.  int iB
116f0 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
11700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
11710 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73  sor for table as
11720 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
11730 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
11740 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
11750 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
11760 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e   to match column
11770 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   of */.  int iCo
11780 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
11790 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
117a0 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d  mn of index to m
117b0 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
117c0 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
117d0 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
117e0 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20  azColl[iCol];.. 
117f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
11800 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
11810 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
11820 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
11830 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  late(pList->a[i]
11840 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
11850 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
11860 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f  N.     && p->iCo
11870 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
11880 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20  lumn[iCol].     
11890 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
118a0 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ase.    ){.     
118b0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
118c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
118d0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
118e0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
118f0 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
11900 53 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73  S(pColl) && 0==s
11910 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
11920 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  oll->zName, zCol
11930 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  l) ){.        re
11940 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a  turn i;.      }.
11950 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
11960 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
11970 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
11980 74 68 65 20 44 49 53 54 49 4e 43 54 20 65 78 70  the DISTINCT exp
11990 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73  ression-list pas
119a0 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72 64  sed as the third
119b0 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
119c0 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a  redundant..**.**
119d0 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74   A DISTINCT list
119e0 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66   is redundant if
119f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
11a00 6e 74 61 69 6e 73 20 73 6f 6d 65 20 73 75 62 73  ntains some subs
11a10 65 74 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73  et of.** columns
11a20 20 74 68 61 74 20 61 72 65 20 75 6e 69 71 75 65   that are unique
11a30 20 61 6e 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a   and non-null..*
11a40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 44  /.static int isD
11a50 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74  istinctRedundant
11a60 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11a70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
11a80 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
11a90 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
11aa0 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20  TabList,        
11ab0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
11ac0 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
11ad0 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
11ae0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
11af0 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
11b00 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20  ist *pDistinct  
11b10 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75       /* The resu
11b20 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65 65 64  lt set that need
11b30 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54  s to be DISTINCT
11b40 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
11b50 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
11b60 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20  Idx;.  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 0a 20 20 69 6e 74 20 69 42         .  int iB
11b90 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ase;..  /* If th
11ba0 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  ere is more than
11bb0 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75   one table or su
11bc0 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20  b-select in the 
11bd0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20  FROM clause of. 
11be0 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20   ** this query, 
11bf0 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74  then it will not
11c00 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
11c10 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44 49  show that the DI
11c20 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61  STINCT .  ** cla
11c30 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74  use is redundant
11c40 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c  . */.  if( pTabL
11c50 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  ist->nSrc!=1 ) r
11c60 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65  eturn 0;.  iBase
11c70 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30   = pTabList->a[0
11c80 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61  ].iCursor;.  pTa
11c90 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
11ca0 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49  0].pTab;..  /* I
11cb0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70  f any of the exp
11cc0 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49  ressions is an I
11cd0 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62  PK column on tab
11ce0 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72  le iBase, then r
11cf0 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65  eturn .  ** true
11d00 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e  . Note: The (p->
11d10 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70  iTable==iBase) p
11d20 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73 74  art of this test
11d30 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69 66   may be false if
11d40 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
11d50 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f  t SELECT is a co
11d60 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65  rrelated sub-que
11d70 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ry..  */.  for(i
11d80 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d  =0; i<pDistinct-
11d90 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11da0 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
11db0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
11dc0 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b  te(pDistinct->a[
11dd0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
11de0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
11df0 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65  UMN && p->iTable
11e00 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43  ==iBase && p->iC
11e10 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
11e20 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f   1;.  }..  /* Lo
11e30 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69  op through all i
11e40 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
11e50 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61  ble, checking ea
11e60 63 68 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ch to see if it 
11e70 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44  makes.  ** the D
11e80 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65  ISTINCT qualifie
11e90 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20  r redundant. It 
11ea0 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a  does so if:.  **
11eb0 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69  .  **   1. The i
11ec0 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66 20 55  ndex is itself U
11ed0 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a  NIQUE, and.  **.
11ee0 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66    **   2. All of
11ef0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   the columns in 
11f00 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 65 69  the index are ei
11f10 74 68 65 72 20 70 61 72 74 20 6f 66 20 74 68 65  ther part of the
11f20 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20   pDistinct.  ** 
11f30 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c       list, or el
11f40 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  se the WHERE cla
11f50 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74  use contains a t
11f60 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  erm of the form 
11f70 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20  "col=X",.  **   
11f80 20 20 20 77 68 65 72 65 20 58 20 69 73 20 61 20     where X is a 
11f90 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20  constant value. 
11fa0 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
11fb0 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20  quences of the. 
11fc0 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69   **      compari
11fd0 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c  son and select-l
11fe0 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ist expressions 
11ff0 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65  must match those
12000 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
12010 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c   **.  **   3. Al
12020 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78  l of those index
12030 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69   columns for whi
12040 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ch the WHERE cla
12050 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a  use does not.  *
12060 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61  *      contain a
12070 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72   "col=X" term ar
12080 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e  e subject to a N
12090 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
120a0 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  nt..  */.  for(p
120b0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
120c0 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
120d0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
120e0 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
120f0 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74  ==OE_None ) cont
12100 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  inue;.    for(i=
12110 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
12120 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
12130 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d  int iCol = pIdx-
12140 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
12150 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e 64 54      if( 0==findT
12160 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c 20  erm(pWC, iBase, 
12170 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29  iCol, ~(Bitmask)
12180 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 20  0, WO_EQ, pIdx) 
12190 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
121a0 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64  IdxCol = findInd
121b0 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44  exCol(pParse, pD
121c0 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c 20  istinct, iBase, 
121d0 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 20 20  pIdx, i);.      
121e0 20 20 69 66 28 20 69 49 64 78 43 6f 6c 3c 30 20    if( iIdxCol<0 
121f0 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49  || pTab->aCol[pI
12200 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  dx->aiColumn[i]]
12210 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  .notNull==0 ){. 
12220 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
12230 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12240 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
12250 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  i==pIdx->nColumn
12260 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
12270 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20  s index implies 
12280 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43  that the DISTINC
12290 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72  T qualifier is r
122a0 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20  edundant. */.   
122b0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
122c0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
122d0 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 46 69   0;.}../* .** Fi
122e0 6e 64 20 28 61 6e 20 61 70 70 72 6f 78 69 6d 61  nd (an approxima
122f0 74 65 29 20 73 75 6d 20 6f 66 20 74 77 6f 20 57  te) sum of two W
12300 68 65 72 65 43 6f 73 74 73 2e 20 20 54 68 69 73  hereCosts.  This
12310 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 0a   computation is.
12320 2a 2a 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20  ** not a simple 
12330 22 2b 22 20 6f 70 65 72 61 74 6f 72 20 62 65 63  "+" operator bec
12340 61 75 73 65 20 57 68 65 72 65 43 6f 73 74 20 69  ause WhereCost i
12350 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6c 6f  s stored as a lo
12360 67 61 72 69 74 68 6d 69 63 0a 2a 2a 20 76 61 6c  garithmic.** val
12370 75 65 2e 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  ue..** .*/.stati
12380 63 20 57 68 65 72 65 43 6f 73 74 20 77 68 65 72  c WhereCost wher
12390 65 43 6f 73 74 41 64 64 28 57 68 65 72 65 43 6f  eCostAdd(WhereCo
123a0 73 74 20 61 2c 20 57 68 65 72 65 43 6f 73 74 20  st a, WhereCost 
123b0 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  b){.  static con
123c0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
123d0 20 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 31 30   x[] = {.     10
123e0 2c 20 31 30 2c 20 20 20 20 20 20 20 20 20 20 20  , 10,           
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12400 20 30 2c 31 20 2a 2f 0a 20 20 20 20 20 20 39 2c   0,1 */.      9,
12410 20 39 2c 20 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 2f 2a 20               /* 
12430 32 2c 33 20 2a 2f 0a 20 20 20 20 20 20 38 2c 20  2,3 */.      8, 
12440 38 2c 20 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 2f 2a 20 34              /* 4
12460 2c 35 20 2a 2f 0a 20 20 20 20 20 20 37 2c 20 37  ,5 */.      7, 7
12470 2c 20 37 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 7,            
12480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 2c             /* 6,
12490 37 2c 38 20 2a 2f 0a 20 20 20 20 20 20 36 2c 20  7,8 */.      6, 
124a0 36 2c 20 36 2c 20 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 2f 2a 20 39              /* 9
124c0 2c 31 30 2c 31 31 20 2a 2f 0a 20 20 20 20 20 20  ,10,11 */.      
124d0 35 2c 20 35 2c 20 35 2c 20 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 2f                 /
124f0 2a 20 31 32 2d 31 34 20 2a 2f 0a 20 20 20 20 20  * 12-14 */.     
12500 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 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 2f 2a 20 31 35 2d 31 38 20 2a 2f 0a 20 20 20 20  /* 15-18 */.    
12530 20 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20 33 2c    3, 3, 3, 3, 3,
12540 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
12550 20 2f 2a 20 31 39 2d 32 34 20 2a 2f 0a 20 20 20   /* 19-24 */.   
12560 20 20 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32     2, 2, 2, 2, 2
12570 2c 20 32 2c 20 32 2c 20 20 20 20 20 20 20 20 20  , 2, 2,         
12580 20 20 2f 2a 20 32 35 2d 33 31 20 2a 2f 0a 20 20    /* 25-31 */.  
12590 7d 3b 0a 20 20 69 66 28 20 61 3e 3d 62 20 29 7b  };.  if( a>=b ){
125a0 0a 20 20 20 20 69 66 28 20 61 3e 62 2b 34 39 20  .    if( a>b+49 
125b0 29 20 72 65 74 75 72 6e 20 61 3b 0a 20 20 20 20  ) return a;.    
125c0 69 66 28 20 61 3e 62 2b 33 31 20 29 20 72 65 74  if( a>b+31 ) ret
125d0 75 72 6e 20 61 2b 31 3b 0a 20 20 20 20 72 65 74  urn a+1;.    ret
125e0 75 72 6e 20 61 2b 78 5b 61 2d 62 5d 3b 0a 20 20  urn a+x[a-b];.  
125f0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 62  }else{.    if( b
12600 3e 61 2b 34 39 20 29 20 72 65 74 75 72 6e 20 62  >a+49 ) return b
12610 3b 0a 20 20 20 20 69 66 28 20 62 3e 61 2b 33 31  ;.    if( b>a+31
12620 20 29 20 72 65 74 75 72 6e 20 62 2b 31 3b 0a 20   ) return b+1;. 
12630 20 20 20 72 65 74 75 72 6e 20 62 2b 78 5b 62 2d     return b+x[b-
12640 61 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a];.  }.}../*.**
12650 20 43 6f 6e 76 65 72 74 20 61 6e 20 69 6e 74 65   Convert an inte
12660 67 65 72 20 69 6e 74 6f 20 61 20 57 68 65 72 65  ger into a Where
12670 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  Cost.  In other 
12680 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65 20 61  words, compute a
12690 0a 2a 2a 20 67 6f 6f 64 20 61 70 70 72 6f 78 69  .** good approxi
126a0 6d 61 74 61 74 69 6f 6e 20 66 6f 72 20 31 30 2a  matation for 10*
126b0 6c 6f 67 32 28 78 29 2e 0a 2a 2f 0a 73 74 61 74  log2(x)..*/.stat
126c0 69 63 20 57 68 65 72 65 43 6f 73 74 20 77 68 65  ic WhereCost whe
126d0 72 65 43 6f 73 74 28 74 52 6f 77 63 6e 74 20 78  reCost(tRowcnt x
126e0 29 7b 0a 20 20 73 74 61 74 69 63 20 57 68 65 72  ){.  static Wher
126f0 65 43 6f 73 74 20 61 5b 5d 20 3d 20 7b 20 30 2c  eCost a[] = { 0,
12700 20 32 2c 20 33 2c 20 35 2c 20 36 2c 20 37 2c 20   2, 3, 5, 6, 7, 
12710 38 2c 20 39 20 7d 3b 0a 20 20 57 68 65 72 65 43  8, 9 };.  WhereC
12720 6f 73 74 20 79 20 3d 20 34 30 3b 0a 20 20 69 66  ost y = 40;.  if
12730 28 20 78 3c 38 20 29 7b 0a 20 20 20 20 69 66 28  ( x<8 ){.    if(
12740 20 78 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b   x<2 ) return 0;
12750 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3c 38 20  .    while( x<8 
12760 29 7b 20 20 79 20 2d 3d 20 31 30 3b 20 78 20 3c  ){  y -= 10; x <
12770 3c 3d 20 31 3b 20 7d 0a 20 20 7d 65 6c 73 65 7b  <= 1; }.  }else{
12780 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3e 32 35  .    while( x>25
12790 35 20 29 7b 20 79 20 2b 3d 20 34 30 3b 20 78 20  5 ){ y += 40; x 
127a0 3e 3e 3d 20 34 3b 20 7d 0a 20 20 20 20 77 68 69  >>= 4; }.    whi
127b0 6c 65 28 20 78 3e 31 35 20 29 7b 20 20 79 20 2b  le( x>15 ){  y +
127c0 3d 20 31 30 3b 20 78 20 3e 3e 3d 20 31 3b 20 7d  = 10; x >>= 1; }
127d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 5b  .  }.  return a[
127e0 78 26 37 5d 20 2b 20 79 20 2d 20 31 30 3b 0a 7d  x&7] + y - 10;.}
127f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12800 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12810 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  LE./*.** Convert
12820 20 61 20 64 6f 75 62 6c 65 20 28 61 73 20 72 65   a double (as re
12830 63 65 69 76 65 64 20 66 72 6f 6d 20 78 42 65 73  ceived from xBes
12840 74 49 6e 64 65 78 20 6f 66 20 61 20 76 69 72 74  tIndex of a virt
12850 75 61 6c 20 74 61 62 6c 65 29 0a 2a 2a 20 69 6e  ual table).** in
12860 74 6f 20 61 20 57 68 65 72 65 43 6f 73 74 2e 20  to a WhereCost. 
12870 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
12880 20 63 6f 6d 70 75 74 65 20 61 6e 20 61 70 70 72   compute an appr
12890 6f 78 69 6d 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a  oximation for.**
128a0 20 31 30 2a 6c 6f 67 32 28 78 29 2e 0a 2a 2f 0a   10*log2(x)..*/.
128b0 73 74 61 74 69 63 20 57 68 65 72 65 43 6f 73 74  static WhereCost
128c0 20 77 68 65 72 65 43 6f 73 74 46 72 6f 6d 44 6f   whereCostFromDo
128d0 75 62 6c 65 28 64 6f 75 62 6c 65 20 78 29 7b 0a  uble(double x){.
128e0 20 20 75 36 34 20 61 3b 0a 20 20 57 68 65 72 65    u64 a;.  Where
128f0 43 6f 73 74 20 65 3b 0a 20 20 61 73 73 65 72 74  Cost e;.  assert
12900 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
12910 26 20 73 69 7a 65 6f 66 28 61 29 3d 3d 38 20 29  & sizeof(a)==8 )
12920 3b 0a 20 20 69 66 28 20 78 3c 3d 31 20 29 20 72  ;.  if( x<=1 ) r
12930 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 78  eturn 0;.  if( x
12940 3c 3d 32 30 30 30 30 30 30 30 30 30 20 29 20 72  <=2000000000 ) r
12950 65 74 75 72 6e 20 77 68 65 72 65 43 6f 73 74 28  eturn whereCost(
12960 28 74 52 6f 77 63 6e 74 29 78 29 3b 0a 20 20 6d  (tRowcnt)x);.  m
12970 65 6d 63 70 79 28 26 61 2c 20 26 78 2c 20 38 29  emcpy(&a, &x, 8)
12980 3b 0a 20 20 65 20 3d 20 28 61 3e 3e 35 32 29 20  ;.  e = (a>>52) 
12990 2d 20 31 30 32 32 3b 0a 20 20 72 65 74 75 72 6e  - 1022;.  return
129a0 20 65 2a 31 30 3b 0a 7d 0a 23 65 6e 64 69 66 20   e*10;.}.#endif 
129b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
129c0 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
129d0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
129e0 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20  he logarithm of 
129f0 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 20  the input value 
12a00 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74  to base 2..*/.st
12a10 61 74 69 63 20 57 68 65 72 65 43 6f 73 74 20 65  atic WhereCost e
12a20 73 74 4c 6f 67 28 57 68 65 72 65 43 6f 73 74 20  stLog(WhereCost 
12a30 4e 29 7b 0a 20 20 57 68 65 72 65 43 6f 73 74 20  N){.  WhereCost 
12a40 78 20 3d 20 77 68 65 72 65 43 6f 73 74 28 4e 29  x = whereCost(N)
12a50 3b 0a 20 20 72 65 74 75 72 6e 20 78 3e 33 33 20  ;.  return x>33 
12a60 3f 20 78 20 2d 20 33 33 20 3a 20 30 3b 0a 7d 0a  ? x - 33 : 0;.}.
12a70 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69  ./*.** Two routi
12a80 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67  nes for printing
12a90 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
12aa0 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  an sqlite3_index
12ab0 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  _info.** structu
12ac0 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65  re.  Used for te
12ad0 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
12ae0 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65  ing only.  If ne
12af0 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f  ither.** SQLITE_
12b00 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44  TEST or SQLITE_D
12b10 45 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64  EBUG are defined
12b20 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75  , then these rou
12b30 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d  tines.** are no-
12b40 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ops..*/.#if !def
12b50 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
12b60 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26  _VIRTUALTABLE) &
12b70 26 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54  & defined(WHERET
12b80 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74  RACE_ENABLED).st
12b90 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
12ba0 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74  IDX_INPUTS(sqlit
12bb0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
12bc0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
12bd0 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
12be0 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
12bf0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
12c00 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
12c10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
12c20 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73  ugPrintf("  cons
12c30 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d  traint[%d]: col=
12c40 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d  %d termid=%d op=
12c50 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22  %d usabled=%d\n"
12c60 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
12c70 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
12c80 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  t[i].iColumn,.  
12c90 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
12ca0 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  int[i].iTermOffs
12cb0 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  et,.       p->aC
12cc0 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c  onstraint[i].op,
12cd0 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
12ce0 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
12cf0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
12d00 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b  ; i<p->nOrderBy;
12d10 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
12d20 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
12d30 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f   orderby[%d]: co
12d40 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c  l=%d desc=%d\n",
12d50 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
12d60 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
12d70 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
12d80 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
12d90 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  desc);.  }.}.sta
12da0 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
12db0 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74  DX_OUTPUTS(sqlit
12dc0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
12dd0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
12de0 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
12df0 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
12e00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
12e10 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
12e20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
12e30 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67  ugPrintf("  usag
12e40 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25  e[%d]: argvIdx=%
12e50 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20  d omit=%d\n",.  
12e60 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
12e70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
12e80 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c  ge[i].argvIndex,
12e90 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
12ea0 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f  traintUsage[i].o
12eb0 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mit);.  }.  sqli
12ec0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12ed0 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20    idxNum=%d\n", 
12ee0 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71  p->idxNum);.  sq
12ef0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12f00 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22  ("  idxStr=%s\n"
12f10 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  , p->idxStr);.  
12f20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
12f30 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e  tf("  orderByCon
12f40 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e  sumed=%d\n", p->
12f50 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29  orderByConsumed)
12f60 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
12f70 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61  Printf("  estima
12f80 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70  tedCost=%g\n", p
12f90 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
12fa0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
12fb0 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
12fc0 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
12fd0 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
12fe0 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  A).#endif..#ifnd
12ff0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13000 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
13010 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
13020 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
13030 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20  ause term pTerm 
13040 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65  is of a form whe
13050 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62  re it.** could b
13060 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
13070 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70  ndex to access p
13080 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e  Src, assuming an
13090 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
130a0 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a  index existed..*
130b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72  /.static int ter
130c0 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a  mCanDriveIndex(.
130d0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
130e0 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
130f0 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
13100 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a   term to check *
13110 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
13120 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
13130 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61     /* Table we a
13140 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63  re trying to acc
13150 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ess */.  Bitmask
13160 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20   notReady       
13170 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
13180 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s in outer loops
13190 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
131a0 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
131b0 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
131c0 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43  Cursor!=pSrc->iC
131d0 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30  ursor ) return 0
131e0 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  ;.  if( (pTerm->
131f0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
13200 51 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  Q)==0 ) return 0
13210 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  ;.  if( (pTerm->
13220 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f  prereqRight & no
13230 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65 74  tReady)!=0 ) ret
13240 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65  urn 0;.  if( pTe
13250 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
13260 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <0 ) return 0;. 
13270 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61   aff = pSrc->pTa
13280 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75  b->aCol[pTerm->u
13290 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66  .leftColumn].aff
132a0 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71  inity;.  if( !sq
132b0 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
132c0 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70  tyOk(pTerm->pExp
132d0 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e  r, aff) ) return
132e0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
132f0 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
13300 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13310 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
13320 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
13330 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
13340 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
13350 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
13360 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
13370 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
13380 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
13390 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
133a0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
133b0 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
133c0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
133d0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
133e0 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
133f0 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
13400 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
13410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13420 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
13430 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
13440 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
13450 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
13460 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
13470 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
13480 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
13490 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
134a0 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
134b0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
134c0 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
134d0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
134e0 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
134f0 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
13500 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
13510 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
13520 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
13530 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
13540 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20  .  int nColumn; 
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13560 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
13570 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
13580 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
13590 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
135a0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
135b0 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
135c0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
135d0 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
135e0 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
135f0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
13600 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  C->a[] */.  int 
13610 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
13620 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
13630 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64  of memory needed
13640 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 49   for pIdx */.  I
13650 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
13660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
13670 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20  ject describing 
13680 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  the transient in
13690 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
136a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
136b0 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
136c0 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
136d0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
136e0 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b  .  int addrInit;
136f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13700 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
13710 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
13720 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20  bypass jump */. 
13730 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20   Table *pTable; 
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13750 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
13760 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65 79  indexed */.  Key
13770 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b 20  Info *pKeyinfo; 
13780 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20           /* Key 
13790 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
137a0 74 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20 0a  the index */   .
137b0 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
137c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
137d0 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65   Top of the inde
137e0 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20  x fill loop */. 
137f0 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13810 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
13820 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64   an index record
13830 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13850 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e    /* Column coun
13860 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ter */.  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 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
13890 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  nter */.  int mx
138a0 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  BitCol;         
138b0 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
138c0 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d   column in pSrc-
138d0 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f  >colUsed */.  Co
138e0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
138f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
13900 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
13910 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a  to on a column *
13920 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
13930 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
13940 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65  /* The Loop obje
13950 63 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ct */.  Bitmask 
13960 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  idxCols;        
13970 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
13980 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f   columns used fo
13990 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
139a0 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c  Bitmask extraCol
139b0 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  s;          /* B
139c0 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f  itmap of additio
139d0 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nal columns */. 
139e0 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20   u8 sentWarning 
139f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
13a00 54 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69  True if a warnni
13a10 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73 73 75  ng has been issu
13a20 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ed */..  /* Gene
13a30 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
13a40 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
13a50 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
13a60 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
13a70 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
13a80 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
13a90 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
13aa0 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
13ab0 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
13ac0 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
13ad0 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
13ae0 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
13af0 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
13b00 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
13b10 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
13b20 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
13b30 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64  added to the ind
13b40 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65 64  ex.  ** and used
13b50 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45 20   to match WHERE 
13b60 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
13b70 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d 6e 20  ts */.  nColumn 
13b80 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20  = 0;.  pTable = 
13b90 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57  pSrc->pTab;.  pW
13ba0 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70  CEnd = &pWC->a[p
13bb0 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c  WC->nTerm];.  pL
13bc0 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
13bd0 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20  Loop;.  idxCols 
13be0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
13bf0 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
13c00 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
13c10 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
13c20 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
13c30 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
13c40 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
13c50 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
13c60 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
13c70 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
13c80 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53   iCol>=BMS ? MAS
13c90 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41  KBIT(BMS-1) : MA
13ca0 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20  SKBIT(iCol);.   
13cb0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
13cc0 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
13cd0 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
13ce0 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69  BMS-1 );.      i
13cf0 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20  f( !sentWarning 
13d00 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13d10 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
13d20 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c  RNING_AUTOINDEX,
13d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75  .            "au
13d40 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e  tomatic index on
13d50 20 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65   %s(%s)", pTable
13d60 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
13d70 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
13d80 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a  l[iCol].zName);.
13d90 20 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e          sentWarn
13da0 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ing = 1;.      }
13db0 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
13dc0 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
13dd0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  ){.        if( w
13de0 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70  hereLoopResize(p
13df0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70  Parse->db, pLoop
13e00 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 29 20 29 20 72  , nColumn+1) ) r
13e10 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70  eturn;.        p
13e20 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 43 6f  Loop->aLTerm[nCo
13e30 6c 75 6d 6e 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b  lumn++] = pTerm;
13e40 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73  .        idxCols
13e50 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20   |= cMask;.     
13e60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
13e70 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3e 30  ssert( nColumn>0
13e80 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62   );.  pLoop->u.b
13e90 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70  tree.nEq = pLoop
13ea0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 43 6f 6c 75  ->nLTerm = nColu
13eb0 6d 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  mn;.  pLoop->wsF
13ec0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
13ed0 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49  UMN_EQ | WHERE_I
13ee0 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f  DX_ONLY | WHERE_
13ef0 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20 20  INDEXED.        
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57               | W
13f10 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b  HERE_AUTO_INDEX;
13f20 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
13f30 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69 74   number of addit
13f40 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
13f50 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  eded to create a
13f60 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69  .  ** covering i
13f70 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72 69  ndex.  A "coveri
13f80 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e 20  ng index" is an 
13f90 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
13fa0 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c  ins all.  ** col
13fb0 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 65  umns that are ne
13fc0 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65 72  eded by the quer
13fd0 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65 72  y.  With a cover
13fe0 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a 20  ing index, the. 
13ff0 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
14000 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  le never needs t
14010 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20 20  o be accessed.  
14020 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65  Automatic indice
14030 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61  s must.  ** be a
14040 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
14050 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64 65  because the inde
14060 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70  x will not be up
14070 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20 2a  dated if the.  *
14080 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65  * original table
14090 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68 65   changes and the
140a0 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
140b0 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20   cannot both be 
140c0 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68 65  used.  ** if the
140d0 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63  y go out of sync
140e0 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f  ..  */.  extraCo
140f0 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73  ls = pSrc->colUs
14100 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c  ed & (~idxCols |
14110 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 29   MASKBIT(BMS-1))
14120 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28  ;.  mxBitCol = (
14130 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20  pTable->nCol >= 
14140 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a  BMS-1) ? BMS-1 :
14150 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20   pTable->nCol;. 
14160 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
14170 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e->nCol==BMS-1 )
14180 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  ;.  testcase( pT
14190 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  able->nCol==BMS-
141a0 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  2 );.  for(i=0; 
141b0 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
141c0 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
141d0 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29  ols & MASKBIT(i)
141e0 20 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20   ) nColumn++;.  
141f0 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
14200 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
14210 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 43  BMS-1) ){.    nC
14220 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d  olumn += pTable-
14230 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b  >nCol - BMS + 1;
14240 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  .  }.  pLoop->ws
14250 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
14260 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
14270 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f 2a  _IDX_ONLY;..  /*
14280 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   Construct the I
14290 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64  ndex object to d
142a0 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64  escribe this ind
142b0 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20  ex */.  nByte = 
142c0 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20  sizeof(Index);. 
142d0 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d   nByte += nColum
142e0 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20  n*sizeof(int);  
142f0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f     /* Index.aiCo
14300 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20  lumn */.  nByte 
14310 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f  += nColumn*sizeo
14320 66 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49  f(char*);   /* I
14330 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20  ndex.azColl */. 
14340 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d   nByte += nColum
14350 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
14360 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72     /* Index.aSor
14370 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78  tOrder */.  pIdx
14380 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
14390 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
143a0 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  b, nByte);.  if(
143b0 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72   pIdx==0 ) retur
143c0 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  n;.  pLoop->u.bt
143d0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
143e0 78 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  x;.  pIdx->azCol
143f0 6c 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64  l = (char**)&pId
14400 78 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69  x[1];.  pIdx->ai
14410 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26  Column = (int*)&
14420 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f  pIdx->azColl[nCo
14430 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn];.  pIdx->a
14440 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
14450 29 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  )&pIdx->aiColumn
14460 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64  [nColumn];.  pId
14470 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f  x->zName = "auto
14480 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d  -index";.  pIdx-
14490 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75  >nColumn = nColu
144a0 6d 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62  mn;.  pIdx->pTab
144b0 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e  le = pTable;.  n
144c0 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20   = 0;.  idxCols 
144d0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
144e0 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
144f0 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
14500 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
14510 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
14520 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
14530 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
14540 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
14550 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
14560 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
14570 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53   iCol>=BMS ? MAS
14580 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41  KBIT(BMS-1) : MA
14590 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20  SKBIT(iCol);.   
145a0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
145b0 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
145c0 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
145d0 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69  ==BMS );.      i
145e0 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
145f0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
14600 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
14610 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
14620 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63      idxCols |= c
14630 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49  Mask;.        pI
14640 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
14650 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
14660 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70  olumn;.        p
14670 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
14680 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
14690 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
146a0 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
146b0 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  );.        pIdx-
146c0 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57  >azColl[n] = ALW
146d0 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f  AYS(pColl) ? pCo
146e0 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e  ll->zName : "BIN
146f0 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b  ARY";.        n+
14700 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
14710 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
14720 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e  u32)n==pLoop->u.
14730 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20  btree.nEq );..  
14740 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61  /* Add additiona
14750 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  l columns needed
14760 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74   to make the aut
14770 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74  omatic index int
14780 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e  o.  ** a coverin
14790 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72  g index */.  for
147a0 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
147b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
147c0 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b  extraCols & MASK
147d0 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20  BIT(i) ){.      
147e0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
147f0 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64  ] = i;.      pId
14800 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22  x->azColl[n] = "
14810 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e  BINARY";.      n
14820 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
14830 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  if( pSrc->colUse
14840 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  d & MASKBIT(BMS-
14850 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  1) ){.    for(i=
14860 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d  BMS-1; i<pTable-
14870 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
14880 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
14890 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
148a0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
148b0 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
148c0 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
148d0 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43  .  assert( n==nC
148e0 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43  olumn );..  /* C
148f0 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61  reate the automa
14900 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  tic index */.  p
14910 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65  Keyinfo = sqlite
14920 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
14930 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 61  arse, pIdx);.  a
14940 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69  ssert( pLevel->i
14950 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70  IdxCur>=0 );.  p
14960 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
14970 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
14980 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14990 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 41  dOp4(v, OP_OpenA
149a0 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c  utoindex, pLevel
149b0 2d 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f 6c 75  ->iIdxCur, nColu
149c0 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20 20  mn+1, 0,.       
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
149e0 61 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20 50 34  ar*)pKeyinfo, P4
149f0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
14a00 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
14a10 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
14a20 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
14a30 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
14a40 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
14a50 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
14a60 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
14a70 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
14a80 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65  OP_Rewind, pLeve
14a90 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 72  l->iTabCur);.  r
14aa0 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
14ab0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
14ac0 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  rse);.  sqlite3G
14ad0 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
14ae0 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c  pParse, pIdx, pL
14af0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72  evel->iTabCur, r
14b00 65 67 52 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b  egRecord, 1, 0);
14b10 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14b20 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
14b30 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  sert, pLevel->iI
14b40 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  dxCur, regRecord
14b50 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14b60 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
14b70 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
14b80 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14b90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
14ba0 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  t, pLevel->iTabC
14bb0 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a  ur, addrTop+1);.
14bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
14bd0 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
14be0 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
14bf0 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33  NDEX);.  sqlite3
14c00 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14c10 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
14c20 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
14c30 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
14c40 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75  ord);.  .  /* Ju
14c50 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69  mp here when ski
14c60 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
14c70 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  lization */.  sq
14c80 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14c90 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a  e(v, addrInit);.
14ca0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
14cb0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
14cc0 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e  C_INDEX */..#ifn
14cd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14ce0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
14cf0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
14d00 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69  populate an sqli
14d10 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
14d20 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20  tructure. It is 
14d30 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
14d40 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
14d50 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
14d60 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73  ly release the s
14d70 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70  tructure.** by p
14d80 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74  assing the point
14d90 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
14da0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
14db0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
14dc0 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
14dd0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c  3_index_info *al
14de0 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
14df0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
14e00 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ,.  WhereClause 
14e10 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53  *pWC,.  struct S
14e20 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
14e30 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
14e40 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74  OrderBy.){.  int
14e50 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
14e60 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
14e70 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
14e80 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
14e90 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
14ea0 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
14eb0 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
14ec0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
14ed0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
14ee0 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
14ef0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
14f00 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
14f10 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
14f20 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
14f30 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  o;..  /* Count t
14f40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
14f50 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
14f60 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
14f70 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
14f80 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
14f90 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
14fa0 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
14fb0 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
14fc0 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
14fd0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
14fe0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
14ff0 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
15000 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
15010 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
15020 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
15030 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
15040 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
15050 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
15060 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
15070 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
15080 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
15090 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
150a0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
150b0 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
150c0 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
150d0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
150e0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
150f0 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
15100 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a     nTerm++;.  }.
15110 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44  .  /* If the ORD
15120 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e  ER BY clause con
15130 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d  tains only colum
15140 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ns in the curren
15150 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  t .  ** virtual 
15160 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63  table then alloc
15170 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
15180 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20  e aOrderBy part 
15190 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  of.  ** the sqli
151a0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
151b0 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  tructure..  */. 
151c0 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
151d0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
151e0 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72  .    int n = pOr
151f0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
15200 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
15210 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
15220 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
15230 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
15240 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
15250 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
15260 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
15270 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
15280 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15290 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20    if( i==n){.   
152a0 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b     nOrderBy = n;
152b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
152c0 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
152d0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
152e0 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a   structure.  */.
152f0 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c    pIdxInfo = sql
15300 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
15310 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
15320 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20  eof(*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 2b 20 28 73 69 7a            + (siz
15350 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b  eof(*pIdxCons) +
15360 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29   sizeof(*pUsage)
15370 29 2a 6e 54 65 72 6d 0a 20 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 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64     + sizeof(*pId
153a0 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72  xOrderBy)*nOrder
153b0 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78  By );.  if( pIdx
153c0 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Info==0 ){.    s
153d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
153e0 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d  Parse, "out of m
153f0 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74  emory");.    ret
15400 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
15410 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
15420 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
15430 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
15440 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  fo structure con
15450 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20  tains.  ** many 
15460 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20  fields that are 
15470 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22  declared "const"
15480 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73   to prevent xBes
15490 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a  tIndex from.  **
154a0 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20   changing them. 
154b0 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73   We have to do s
154c0 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e  ome funky castin
154d0 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20  g in order to.  
154e0 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** initialize th
154f0 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f  ose fields..  */
15500 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73  .  pIdxCons = (s
15510 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
15520 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29  dex_constraint*)
15530 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20  &pIdxInfo[1];.  
15540 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73  pIdxOrderBy = (s
15550 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
15560 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49  dex_orderby*)&pI
15570 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20  dxCons[nTerm];. 
15580 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63   pUsage = (struc
15590 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
155a0 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
155b0 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e  *)&pIdxOrderBy[n
155c0 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e  OrderBy];.  *(in
155d0 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t*)&pIdxInfo->nC
155e0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72  onstraint = nTer
155f0 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  m;.  *(int*)&pId
15600 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
15610 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  = nOrderBy;.  *(
15620 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
15630 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
15640 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
15650 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43  nstraint = pIdxC
15660 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  ons;.  *(struct 
15670 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
15680 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66  derby**)&pIdxInf
15690 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49  o->aOrderBy = pI
156a0 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73  dxOrderBy;.  *(s
156b0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
156c0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
156d0 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f  sage**)&pIdxInfo
156e0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
156f0 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ge =.           
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 70 55 73 61 67 65 3b 0a          pUsage;.
15740 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54  .  for(i=j=0, pT
15750 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
15760 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
15770 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20  Term++){.    u8 
15780 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  op;.    if( pTer
15790 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
157a0 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
157b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
157c0 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
157d0 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
157e0 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
157f0 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
15800 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
15810 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
15820 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
15830 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
15840 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
15850 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
15860 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
15870 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LL) ) continue;.
15880 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
15890 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
158a0 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
158b0 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
158c0 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d  iColumn = pTerm-
158d0 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
158e0 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
158f0 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a  TermOffset = i;.
15900 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54 65      op = (u8)pTe
15910 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
15920 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20  WO_ALL;.    if( 
15930 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d  op==WO_IN ) op =
15940 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64 78   WO_EQ;.    pIdx
15950 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b  Cons[j].op = op;
15960 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65  .    /* The dire
15970 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e  ct assignment in
15980 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69   the previous li
15990 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f  ne is possible o
159a0 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20  nly because.    
159b0 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53  ** the WO_ and S
159c0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
159d0 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72  TRAINT_ codes ar
159e0 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68  e identical.  Th
159f0 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  e.    ** followi
15a00 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66  ng asserts verif
15a10 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  y this fact. */.
15a20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45      assert( WO_E
15a30 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  Q==SQLITE_INDEX_
15a40 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b  CONSTRAINT_EQ );
15a50 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
15a60 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LT==SQLITE_INDEX
15a70 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29  _CONSTRAINT_LT )
15a80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
15a90 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LE==SQLITE_INDE
15aa0 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20  X_CONSTRAINT_LE 
15ab0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
15ac0 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GT==SQLITE_IND
15ad0 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54  EX_CONSTRAINT_GT
15ae0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15af0 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GE==SQLITE_IN
15b00 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
15b10 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
15b20 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54   WO_MATCH==SQLIT
15b30 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
15b40 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20  NT_MATCH );.    
15b50 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
15b60 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
15b70 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f  N|WO_EQ|WO_LT|WO
15b80 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _LE|WO_GT|WO_GE|
15b90 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20  WO_MATCH) );.   
15ba0 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   j++;.  }.  for(
15bb0 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
15bc0 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
15bd0 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
15be0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
15bf0 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
15c00 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ].iColumn = pExp
15c10 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
15c20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64  pIdxOrderBy[i].d
15c30 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  esc = pOrderBy->
15c40 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
15c50 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
15c60 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dxInfo;.}../*.**
15c70 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63   The table objec
15c80 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73  t reference pass
15c90 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
15ca0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
15cb0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
15cc0 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76  st represent a v
15cd0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68  irtual table. Th
15ce0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  is function invo
15cf0 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64  kes the xBestInd
15d00 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  ex().** method o
15d10 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
15d20 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c  ble with the sql
15d30 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
15d40 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63  object that.** c
15d50 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20 33  omes in as the 3
15d60 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  rd argument to t
15d70 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
15d80 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
15d90 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69  occurs, pParse i
15da0 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
15db0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
15dc0 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a  e and a.** non-z
15dd0 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74  ero value is ret
15de0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
15df0 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 0 is returned 
15e00 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
15e10 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71  * part of the sq
15e20 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
15e30 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65   structure is le
15e40 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a  ft populated..**
15e50 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
15e60 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  ot an error is r
15e70 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74  eturned, it is t
15e80 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
15e90 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  y of the.** call
15ea0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
15eb0 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20   free p->idxStr 
15ec0 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65  if p->needToFree
15ed0 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73  IdxStr indicates
15ee0 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73  .** that this is
15ef0 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
15f00 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73  atic int vtabBes
15f10 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  tIndex(Parse *pP
15f20 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
15f30 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  b, sqlite3_index
15f40 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c  _info *p){.  sql
15f50 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
15f60 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61   = sqlite3GetVTa
15f70 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
15f80 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20  pTab)->pVtab;.  
15f90 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
15fa0 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ..  TRACE_IDX_IN
15fb0 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20  PUTS(p);.  rc = 
15fc0 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e  pVtab->pModule->
15fd0 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62  xBestIndex(pVtab
15fe0 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44  , p);.  TRACE_ID
15ff0 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20  X_OUTPUTS(p);.. 
16000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16010 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
16020 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
16030 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
16040 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
16050 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
16060 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72  if( !pVtab->zErr
16070 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
16080 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16090 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  rse, "%s", sqlit
160a0 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20  e3ErrStr(rc));. 
160b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
160c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
160d0 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56  pParse, "%s", pV
160e0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
160f0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
16100 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
16110 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
16120 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a  ->zErrMsg = 0;..
16130 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
16140 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
16150 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61  ){.    if( !p->a
16160 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
16170 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73  able && p->aCons
16180 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
16190 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20  rgvIndex>0 ){.  
161a0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
161b0 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
161c0 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73         "table %s
161d0 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74  : xBestIndex ret
161e0 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64  urned an invalid
161f0 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e   plan", pTab->zN
16200 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
16210 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
16220 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66  ->nErr;.}.#endif
16230 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
16240 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
16250 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23 69 66 64  TABLE) */...#ifd
16260 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
16270 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
16280 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
16290 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61  he location of a
162a0 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20   particular key 
162b0 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69  among all keys i
162c0 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20  n an.** index.  
162d0 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
162e0 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f  s in aStat as fo
162f0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
16300 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73  aStat[0]      Es
16310 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  t. number of row
16320 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c  s less than pVal
16330 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  .**    aStat[1] 
16340 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
16350 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74   of rows equal t
16360 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74  o pVal.**.** Ret
16370 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
16380 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
16390 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4b 65  tic void whereKe
163a0 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20  yStats(.  Parse 
163b0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
163c0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
163d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
163e0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
163f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16400 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
16410 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
16420 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
16430 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a   *pRec,       /*
16440 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65   Vector of value
16450 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f  s to consider */
16460 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20  .  int roundUp, 
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16480 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72  * Round up if tr
16490 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20  ue.  Round down 
164a0 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52  if false */.  tR
164b0 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20  owcnt *aStat    
164c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
164d0 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20  : stats written 
164e0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
164f0 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
16500 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  e = pIdx->aSampl
16510 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  e;.  int iCol;  
16520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16530 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71   /* Index of req
16540 75 69 72 65 64 20 73 74 61 74 73 20 69 6e 20 61  uired stats in a
16550 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20  nEq[] etc. */.  
16560 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20  int iMin = 0;   
16570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
16580 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e  mallest sample n
16590 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f  ot yet tested */
165a0 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 64 78 2d  .  int i = pIdx-
165b0 3e 6e 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 2f  >nSample;      /
165c0 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  * Smallest sampl
165d0 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72  e larger than or
165e0 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a   equal to pRec *
165f0 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20  /.  int iTest;  
16600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16610 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74  /* Next sample t
16620 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20  o test */.  int 
16630 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
16640 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
16650 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
16660 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  operation */..  
16670 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20  assert( pRec!=0 
16680 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
16690 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
166a0 20 69 66 28 20 70 52 65 63 3d 3d 30 20 29 20 72   if( pRec==0 ) r
166b0 65 74 75 72 6e 3b 0a 20 20 69 43 6f 6c 20 3d 20  eturn;.  iCol = 
166c0 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 2d 20 31  pRec->nField - 1
166d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
166e0 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
166f0 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e   assert( pRec->n
16700 46 69 65 6c 64 3e 30 20 26 26 20 69 43 6f 6c 3c  Field>0 && iCol<
16710 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  pIdx->nSampleCol
16720 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 54   );.  do{.    iT
16730 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 29 2f 32  est = (iMin+i)/2
16740 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  ;.    res = sqli
16750 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
16760 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 54 65  pare(aSample[iTe
16770 73 74 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  st].n, aSample[i
16780 54 65 73 74 5d 2e 70 2c 20 70 52 65 63 29 3b 0a  Test].p, pRec);.
16790 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
167a0 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54  .      iMin = iT
167b0 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  est+1;.    }else
167c0 7b 0a 20 20 20 20 20 20 69 20 3d 20 69 54 65 73  {.      i = iTes
167d0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  t;.    }.  }whil
167e0 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69  e( res && iMin<i
167f0 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
16800 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
16810 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
16820 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68  rt statements ch
16830 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e  eck that the bin
16840 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a  ary search code.
16850 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64    ** above found
16860 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77 65   the right answe
16870 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  r. This block se
16880 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20  rves no purpose 
16890 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20  other.  ** than 
168a0 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73  to invoke the as
168b0 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28  serts.  */.  if(
168c0 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   res==0 ){.    /
168d0 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73  * If (res==0) is
168e0 20 74 72 75 65 2c 20 74 68 65 6e 20 73 61 6d 70   true, then samp
168f0 6c 65 20 24 69 20 6d 75 73 74 20 62 65 20 65 71  le $i must be eq
16900 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20  ual to pRec */. 
16910 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64     assert( i<pId
16920 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20  x->nSample );.  
16930 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
16940 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
16950 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d  mpare(aSample[i]
16960 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70  .n, aSample[i].p
16970 2c 20 70 52 65 63 29 0a 20 20 20 20 20 20 20 20  , pRec).        
16980 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
16990 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
169a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
169b0 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63 20  Otherwise, pRec 
169c0 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20  must be smaller 
169d0 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20 61  than sample $i a
169e0 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  nd larger than. 
169f0 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69     ** sample ($i
16a00 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  -1).  */.    ass
16a10 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  ert( i==pIdx->nS
16a20 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20  ample .         
16a30 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  || sqlite3VdbeRe
16a40 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
16a50 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
16a60 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a  e[i].p, pRec)>0.
16a70 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
16a80 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
16a90 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65  iled );.    asse
16aa0 72 74 28 20 69 3d 3d 30 0a 20 20 20 20 20 20 20  rt( i==0.       
16ab0 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65    || sqlite3Vdbe
16ac0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
16ad0 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53  ample[i-1].n, aS
16ae0 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52  ample[i-1].p, pR
16af0 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  ec)<0.         |
16b00 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
16b10 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
16b20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65  }.#endif /* ifde
16b30 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
16b40 2f 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  /..  /* At this 
16b50 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69  point, aSample[i
16b60 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  ] is the first s
16b70 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67 72  ample that is gr
16b80 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20  eater than.  ** 
16b90 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c  or equal to pVal
16ba0 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49 64 78  .  Or if i==pIdx
16bb0 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20  ->nSample, then 
16bc0 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72 65 20  all samples are 
16bd0 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70  less.  ** than p
16be0 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c 65  Val.  If aSample
16bf0 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20  [i]==pVal, then 
16c00 72 65 73 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 69  res==0..  */.  i
16c10 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
16c20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d   aStat[0] = aSam
16c30 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  ple[i].anLt[iCol
16c40 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  ];.    aStat[1] 
16c50 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45  = aSample[i].anE
16c60 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65  q[iCol];.  }else
16c70 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c  {.    tRowcnt iL
16c80 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20 69 47  ower, iUpper, iG
16c90 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 30  ap;.    if( i==0
16ca0 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
16cb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70   = 0;.      iUpp
16cc0 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e  er = aSample[0].
16cd0 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
16ce0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70  }else{.      iUp
16cf0 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e  per = i>=pIdx->n
16d00 53 61 6d 70 6c 65 20 3f 20 70 49 64 78 2d 3e 61  Sample ? pIdx->a
16d10 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 61 53 61  iRowEst[0] : aSa
16d20 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
16d30 6c 5d 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72  l];.      iLower
16d40 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e   = aSample[i-1].
16d50 61 6e 45 71 5b 69 43 6f 6c 5d 20 2b 20 61 53 61  anEq[iCol] + aSa
16d60 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 4c 74 5b 69  mple[i-1].anLt[i
16d70 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col];.    }.    
16d80 61 53 74 61 74 5b 31 5d 20 3d 20 28 70 49 64 78  aStat[1] = (pIdx
16d90 2d 3e 6e 43 6f 6c 75 6d 6e 3e 69 43 6f 6c 20 3f  ->nColumn>iCol ?
16da0 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43   pIdx->aAvgEq[iC
16db0 6f 6c 5d 20 3a 20 31 29 3b 0a 20 20 20 20 69 66  ol] : 1);.    if
16dc0 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72  ( iLower>=iUpper
16dd0 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
16de0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
16df0 20 20 20 20 20 69 47 61 70 20 3d 20 69 55 70 70       iGap = iUpp
16e00 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20  er - iLower;.   
16e10 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64   }.    if( round
16e20 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70  Up ){.      iGap
16e30 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20   = (iGap*2)/3;. 
16e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16e50 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20  iGap = iGap/3;. 
16e60 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30     }.    aStat[0
16e70 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61  ] = iLower + iGa
16e80 70 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  p;.  }.}.#endif 
16e90 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
16ea0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
16eb0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
16ec0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
16ed0 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
16ee0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
16ef0 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69  hat will be visi
16f00 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69  ted.** by scanni
16f10 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ng an index for 
16f20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65  a range of value
16f30 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79  s. The range may
16f40 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a   have an upper.*
16f50 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72  * bound, a lower
16f60 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e   bound, or both.
16f70 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
16f80 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74  e terms that set
16f90 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e   the upper.** an
16fa0 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61  d lower bounds a
16fb0 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62  re represented b
16fc0 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  y pLower and pUp
16fd0 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
16fe0 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65  . For.** example
16ff0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
17000 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
17010 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  (a):.**.**   ...
17020 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
17030 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
17040 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
17050 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c           |_____|
17060 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20     |_____|.**   
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17080 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a      |         |.
17090 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
170a0 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20         pLower   
170b0 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66   pUpper.**.** If
170c0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75   either of the u
170d0 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f  pper or lower bo
170e0 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65  und is not prese
170f0 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73  nt, then NULL is
17100 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c   passed in.** pl
17110 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ace of the corre
17120 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65  sponding WhereTe
17130 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  rm..**.** The va
17140 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72  lue in (pBuilder
17150 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
17160 6e 45 71 29 20 69 73 20 74 68 65 20 69 6e 64 65  nEq) is the inde
17170 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a  x of the index.*
17180 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74  * column subject
17190 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63 6f   to the range co
171a0 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71  nstraint. Or, eq
171b0 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20  uivalently, the 
171c0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75  number of.** equ
171d0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
171e0 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74  s optimized by t
171f0 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65  he proposed inde
17200 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d  x scan. For exam
17210 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67  ple,.** assuming
17220 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74   index p is on t
17230 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65  1(a, b), and the
17240 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a   SQL query is:.*
17250 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
17260 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41  t1 WHERE a = ? A
17270 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c  ND b > ? AND b <
17280 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
17290 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20  n nEq is set to 
172a0 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20  1 (as the range 
172b0 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d  restricted colum
172c0 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65 63  n, b, is the sec
172d0 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73  ond .** left-mos
172e0 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
172f0 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74  index). Or, if t
17300 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  he query is:.**.
17310 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
17320 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
17330 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   a < ? ....**.**
17340 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74   then nEq is set
17350 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   to 0..**.** Whe
17360 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
17370 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75  is called, *pnOu
17380 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
17390 77 68 65 72 65 43 6f 73 74 28 29 20 6f 66 20 74  whereCost() of t
173a0 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
173b0 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 69 6e  rows that the in
173c0 64 65 78 20 73 63 61 6e 20 69 73 20 65 78 70 65  dex scan is expe
173d0 63 74 65 64 20 74 6f 20 76 69 73 69 74 20 77 69  cted to visit wi
173e0 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  thout .** consid
173f0 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20  ering the range 
17400 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20  constraints. If 
17410 6e 45 71 20 69 73 20 30 2c 20 74 68 69 73 20 69  nEq is 0, this i
17420 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
17430 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20  .** rows in the 
17440 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20  index. Assuming 
17450 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
17460 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73   *pnOut is adjus
17470 74 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a  ted (reduced).**
17480 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
17490 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 74 72 61  the range contra
174a0 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20  ints pLower and 
174b0 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49  pUpper..** .** I
174c0 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66  n the absence of
174d0 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e   sqlite_stat4 AN
174e0 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69  ALYZE data, or i
174f0 66 20 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e  f such data cann
17500 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 65  ot be.** used, e
17510 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75 61  ach range inequa
17520 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68 65  lity reduces the
17530 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79   search space by
17540 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20   a factor of 4. 
17550 0a 2a 2a 20 48 65 6e 63 65 20 61 20 70 61 69 72  .** Hence a pair
17560 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   of constraints 
17570 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65  (x>? AND x<?) re
17580 64 75 63 65 73 20 74 68 65 20 65 78 70 65 63 74  duces the expect
17590 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  ed number of.** 
175a0 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  rows visited by 
175b0 61 20 66 61 63 74 6f 72 20 6f 66 20 31 36 2e 0a  a factor of 16..
175c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
175d0 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
175e0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
175f0 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
17600 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
17610 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
17620 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
17630 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
17640 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
17650 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
17660 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
17670 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
17680 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
17690 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
176a0 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
176b0 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
176c0 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
176d0 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
176e0 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 6e 4f    WhereCost *pnO
176f0 75 74 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54  ut     /* IN/OUT
17700 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  : Number of rows
17710 20 76 69 73 69 74 65 64 20 2a 2f 0a 29 7b 0a 20   visited */.){. 
17720 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17730 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20  _OK;.  int nOut 
17740 3d 20 28 69 6e 74 29 2a 70 6e 4f 75 74 3b 0a 20  = (int)*pnOut;. 
17750 20 57 68 65 72 65 43 6f 73 74 20 6e 4e 65 77 3b   WhereCost nNew;
17760 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
17770 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
17780 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70  STAT4.  Index *p
17790 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
177a0 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
177b0 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
177c0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
177d0 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69  .btree.nEq;..  i
177e0 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 0a  f( p->nSample>0.
177f0 20 20 20 26 26 20 6e 45 71 3d 3d 70 42 75 69 6c     && nEq==pBuil
17800 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a 20  der->nRecValid. 
17810 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d    && nEq<p->nSam
17820 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70 74  pleCol.   && Opt
17830 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
17840 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  (pParse->db, SQL
17850 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29 7b  ITE_Stat3) .  ){
17860 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63  .    UnpackedRec
17870 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
17880 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20  lder->pRec;.    
17890 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20  tRowcnt a[2];.  
178a0 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 2f    u8 aff;..    /
178b0 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65  * Variable iLowe
178c0 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  r will be set to
178d0 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66   the estimate of
178e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
178f0 6f 77 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74  ows in .    ** t
17900 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72  he index that ar
17910 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  e less than the 
17920 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  lower bound of t
17930 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20  he range query. 
17940 54 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65 72  The.    ** lower
17950 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65   bound being the
17960 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f   concatenation o
17970 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65  f $P and $L, whe
17980 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20 20  re $P is the.   
17990 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66   ** key-prefix f
179a0 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71  ormed by the nEq
179b0 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20   values matched 
179c0 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20  against the nEq 
179d0 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 2a 2a  left-most.    **
179e0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
179f0 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73  index, and $L is
17a00 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c   the value in pL
17a10 6f 77 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ower..    **.   
17a20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65   ** Or, if pLowe
17a30 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20  r is NULL or $L 
17a40 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
17a50 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63  ted from it (bec
17a60 61 75 73 65 20 69 74 0a 20 20 20 20 2a 2a 20 69  ause it.    ** i
17a70 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76  s not a simple v
17a80 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72  ariable or liter
17a90 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c  al value), the l
17aa0 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
17ab0 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69  e.    ** range i
17ac0 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71  s $P. Due to a q
17ad0 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20  uirk in the way 
17ae0 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20  whereKeyStats() 
17af0 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20  works, even.    
17b00 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61 69  ** if $L is avai
17b10 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53  lable, whereKeyS
17b20 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64  tats() is called
17b30 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61   for both ($P) a
17b40 6e 64 20 0a 20 20 20 20 2a 2a 20 28 24 50 3a 24  nd .    ** ($P:$
17b50 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65  L) and the large
17b60 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74  r of the two ret
17b70 75 72 6e 65 64 20 76 61 6c 75 65 73 20 75 73 65  urned values use
17b80 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
17b90 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70   Similarly, iUpp
17ba0 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74 20  er is to be set 
17bb0 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
17bc0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
17bd0 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 6c 65 73   rows.    ** les
17be0 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72  s than the upper
17bf0 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61   bound of the ra
17c00 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65  nge query. Where
17c10 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
17c20 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65  .    ** is eithe
17c30 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55  r ($P) or ($P:$U
17c40 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69  ). Again, even i
17c50 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c  f $U is availabl
17c60 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  e, both values. 
17c70 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20     ** of iUpper 
17c80 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f 66  are requested of
17c90 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
17ca0 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72   and the smaller
17cb0 20 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20   used..    */.  
17cc0 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
17cd0 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55  ;.    tRowcnt iU
17ce0 70 70 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 6e  pper;..    if( n
17cf0 45 71 3d 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Eq==p->nColumn )
17d00 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
17d10 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
17d20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17d30 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62     aff = p->pTab
17d40 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
17d50 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69 6e  lumn[nEq]].affin
17d60 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  ity;.    }.    /
17d70 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77  * Determine iLow
17d80 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75 73  er and iUpper us
17d90 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a  ing ($P) only. *
17da0 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30  /.    if( nEq==0
17db0 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
17dc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70   = 0;.      iUpp
17dd0 65 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74  er = p->aiRowEst
17de0 5b 30 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [0];.    }else{.
17df0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74        /* Note: t
17e00 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62  his call could b
17e10 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79  e optimized away
17e20 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d   - since the sam
17e30 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20  e values must . 
17e40 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65       ** have bee
17e50 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65 6e  n requested when
17e60 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20   testing key $P 
17e70 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  in whereEqualSca
17e80 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20  nEst().  */.    
17e90 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
17ea0 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
17eb0 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 69 4c   0, a);.      iL
17ec0 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  ower = a[0];.   
17ed0 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d     iUpper = a[0]
17ee0 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 7d 0a 0a   + a[1];.    }..
17ef0 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62      /* If possib
17f00 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74  le, improve on t
17f10 68 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61  he iLower estima
17f20 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29  te using ($P:$L)
17f30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f  . */.    if( pLo
17f40 77 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  wer ){.      int
17f50 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20   bOk;           
17f60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
17f70 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78 74   if value is ext
17f80 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70  racted from pExp
17f90 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
17fa0 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d  *pExpr = pLower-
17fb0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
17fc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
17fd0 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
17fe0 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
17ff0 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )!=0 );.      rc
18000 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50   = sqlite3Stat4P
18010 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61  robeSetValue(pPa
18020 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70  rse, p, &pRec, p
18030 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20  Expr, aff, nEq, 
18040 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  &bOk);.      if(
18050 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
18060 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20  & bOk ){.       
18070 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20   tRowcnt iNew;. 
18080 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53         whereKeyS
18090 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
180a0 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20  pRec, 0, a);.   
180b0 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d       iNew = a[0]
180c0 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70   + ((pLower->eOp
180d0 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 29 20  erator & WO_GT) 
180e0 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20  ? a[1] : 0);.   
180f0 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c       if( iNew>iL
18100 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20  ower ) iLower = 
18110 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 6e 4f  iNew;.        nO
18120 75 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ut--;.      }.  
18130 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70    }..    /* If p
18140 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
18150 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65   on the iUpper e
18160 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
18170 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 69 66  P:$U). */.    if
18180 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
18190 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20    int bOk;      
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
181b0 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20 69   True if value i
181c0 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
181d0 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20   pExpr */.      
181e0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55  Expr *pExpr = pU
181f0 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  pper->pExpr->pRi
18200 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
18210 74 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  t( (pUpper->eOpe
18220 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57  rator & (WO_LT|W
18230 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_LE))!=0 );.   
18240 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
18250 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
18260 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
18270 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
18280 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20  nEq, &bOk);.    
18290 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
182a0 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
182b0 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e        tRowcnt iN
182c0 65 77 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  ew;.        wher
182d0 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
182e0 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29  , p, pRec, 1, a)
182f0 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d  ;.        iNew =
18300 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72   a[0] + ((pUpper
18310 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
18320 5f 4c 45 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29  _LE) ? a[1] : 0)
18330 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4e  ;.        if( iN
18340 65 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70  ew<iUpper ) iUpp
18350 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20  er = iNew;.     
18360 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20     nOut--;.     
18370 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 42   }.    }..    pB
18380 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70  uilder->pRec = p
18390 52 65 63 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  Rec;.    if( rc=
183a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
183b0 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69      if( iUpper>i
183c0 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Lower ){.       
183d0 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 43 6f 73   nNew = whereCos
183e0 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  t(iUpper - iLowe
183f0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
18400 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20  .        nNew = 
18410 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65 72  10;        asser
18420 74 28 20 31 30 3d 3d 77 68 65 72 65 43 6f 73 74  t( 10==whereCost
18430 28 32 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (2) );.      }. 
18440 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f       if( nNew<nO
18450 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f  ut ){.        nO
18460 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  ut = nNew;.     
18470 20 7d 0a 20 20 20 20 20 20 2a 70 6e 4f 75 74 20   }.      *pnOut 
18480 3d 20 28 57 68 65 72 65 43 6f 73 74 29 6e 4f 75  = (WhereCost)nOu
18490 74 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  t;.      WHERETR
184a0 41 43 45 28 30 78 31 30 30 2c 20 28 22 72 61 6e  ACE(0x100, ("ran
184b0 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ge scan regions:
184c0 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c   %u..%u  est=%d\
184d0 6e 22 2c 0a 20 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 28 75 33               (u3
184f0 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69  2)iLower, (u32)i
18500 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20  Upper, nOut));. 
18510 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18520 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
18530 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
18540 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65  PARAMETER(pParse
18550 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
18560 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b  METER(pBuilder);
18570 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
18580 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70  ( pLower || pUpp
18590 65 72 20 29 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e  er );.  /* TUNIN
185a0 47 3a 20 20 45 61 63 68 20 69 6e 65 71 75 61 6c  G:  Each inequal
185b0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 72  ity constraint r
185c0 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
185d0 68 20 73 70 61 63 65 20 34 2d 66 6f 6c 64 2e 0a  h space 4-fold..
185e0 20 20 2a 2a 20 41 20 42 45 54 57 45 45 4e 20 6f    ** A BETWEEN o
185f0 70 65 72 61 74 6f 72 2c 20 74 68 65 72 65 66 6f  perator, therefo
18600 72 65 2c 20 72 65 64 75 63 65 73 20 74 68 65 20  re, reduces the 
18610 73 65 61 72 63 68 20 73 70 61 63 65 20 31 36 2d  search space 16-
18620 66 6f 6c 64 20 2a 2f 0a 20 20 6e 4e 65 77 20 3d  fold */.  nNew =
18630 20 6e 4f 75 74 3b 0a 20 20 69 66 28 20 70 4c 6f   nOut;.  if( pLo
18640 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e  wer && (pLower->
18650 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
18660 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
18670 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20 20 20 20  nNew -= 20;     
18680 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 77     assert( 20==w
18690 68 65 72 65 43 6f 73 74 28 34 29 20 29 3b 0a 20  hereCost(4) );. 
186a0 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 7d 0a 20     nOut--;.  }. 
186b0 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20   if( pUpper ){. 
186c0 20 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20     nNew -= 20;  
186d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32 30        assert( 20
186e0 3d 3d 77 68 65 72 65 43 6f 73 74 28 34 29 20 29  ==whereCost(4) )
186f0 3b 0a 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20  ;.    nOut--;.  
18700 7d 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20  }.  if( nNew<10 
18710 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69  ) nNew = 10;.  i
18720 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e  f( nNew<nOut ) n
18730 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 2a 70  Out = nNew;.  *p
18740 6e 4f 75 74 20 3d 20 28 57 68 65 72 65 43 6f 73  nOut = (WhereCos
18750 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e  t)nOut;.  return
18760 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
18770 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
18780 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
18790 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
187a0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
187b0 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
187c0 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
187d0 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  an equality cons
187e0 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61  traint x=VALUE a
187f0 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41  nd where that VA
18800 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a  LUE occurs in.**
18810 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64   the histogram d
18820 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  ata.  This only 
18830 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20  works when x is 
18840 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
18850 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
18860 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  dex and sqlite_s
18870 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
18880 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
18890 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64  .** for that ind
188a0 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d  ex.  When pExpr=
188b0 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
188c0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
188d0 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c  is.** "x IS NULL
188e0 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d  " instead of "x=
188f0 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72  VALUE"..**.** Wr
18900 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
18910 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
18920 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
18930 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
18940 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
18950 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
18960 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
18970 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
18980 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
18990 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
189a0 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
189b0 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
189c0 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
189d0 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
189e0 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
189f0 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
18a00 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
18a10 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
18a20 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
18a30 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
18a40 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
18a50 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
18a60 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
18a70 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
18a80 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
18a90 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20  eEqualScanEst(. 
18aa0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
18ab0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
18ac0 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
18ad0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
18ae0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
18af0 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78   *pBuilder,.  Ex
18b00 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
18b10 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
18b20 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68   for VALUE in th
18b30 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72  e x=VALUE constr
18b40 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  aint */.  tRowcn
18b50 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
18b60 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
18b70 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
18b80 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
18b90 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
18ba0 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
18bb0 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
18bc0 45 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  Eq = pBuilder->p
18bd0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
18be0 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ;.  UnpackedReco
18bf0 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c  rd *pRec = pBuil
18c00 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20  der->pRec;.  u8 
18c10 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  aff;            
18c20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
18c30 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69   affinity */.  i
18c40 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
18c50 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66           /* Subf
18c60 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63  unction return c
18c70 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  ode */.  tRowcnt
18c80 20 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20   a[2];          
18c90 20 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73     /* Statistics
18ca0 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a   */.  int bOk;..
18cb0 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31    assert( nEq>=1
18cc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45   );.  assert( nE
18cd0 71 3c 3d 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  q<=(p->nColumn+1
18ce0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
18cf0 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
18d00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61    assert( p->nSa
18d10 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  mple>0 );.  asse
18d20 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  rt( pBuilder->nR
18d30 65 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a  ecValid<nEq );..
18d40 20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20 61    /* If values a
18d50 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
18d60 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20   for all fields 
18d70 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
18d80 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66  the left.  ** of
18d90 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73   this one, no es
18da0 74 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d 61  timate can be ma
18db0 64 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  de. Return SQLIT
18dc0 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20  E_NOTFOUND. */. 
18dd0 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e   if( pBuilder->n
18de0 52 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29  RecValid<(nEq-1)
18df0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18e00 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
18e10 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69    }..  /* This i
18e20 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
18e30 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c  n only. The call
18e40 20 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74 34   to sqlite3Stat4
18e50 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29 0a  ProbeSetValue().
18e60 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64    ** below would
18e70 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
18e80 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66   value.  */.  if
18e90 28 20 6e 45 71 3e 70 2d 3e 6e 43 6f 6c 75 6d 6e  ( nEq>p->nColumn
18ea0 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d   ){.    *pnRow =
18eb0 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
18ec0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
18ed0 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
18ee0 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
18ef0 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66 66 69 6e  mn[nEq-1]].affin
18f00 69 74 79 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ity;.  rc = sqli
18f10 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
18f20 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
18f30 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61   &pRec, pExpr, a
18f40 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29  ff, nEq-1, &bOk)
18f50 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  ;.  pBuilder->pR
18f60 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28  ec = pRec;.  if(
18f70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18f80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
18f90 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72  ( bOk==0 ) retur
18fa0 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
18fb0 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  D;.  pBuilder->n
18fc0 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a  RecValid = nEq;.
18fd0 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  .  whereKeyStats
18fe0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
18ff0 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45  , 0, a);.  WHERE
19000 54 52 41 43 45 28 30 78 31 30 30 2c 28 22 65 71  TRACE(0x100,("eq
19010 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69  uality scan regi
19020 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74  ons: %d\n", (int
19030 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f  )a[1]));.  *pnRo
19040 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72  w = a[1];.  .  r
19050 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
19060 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
19070 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
19080 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  T4 */..#ifdef SQ
19090 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
190a0 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a  3_OR_STAT4./*.**
190b0 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   Estimate the nu
190c0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
190d0 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
190e0 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  ed based on.** a
190f0 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20  n IN constraint 
19100 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d  where the right-
19110 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
19120 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
19130 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c  is a list of val
19140 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ues.  Example:.*
19150 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52  *.**        WHER
19160 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29  E x IN (1,2,3,4)
19170 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
19180 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63   estimated row c
19190 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77  ount into *pnRow
191a0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
191b0 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e  TE_OK. .** If un
191c0 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20  able to make an 
191d0 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20  estimate, leave 
191e0 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64  *pnRow unchanged
191f0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
19200 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  on-zero..**.** T
19210 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
19220 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e  fail if it is un
19230 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63  able to load a c
19240 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
19250 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f  e.** required fo
19260 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69  r string compari
19270 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c  son, or if unabl
19280 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
19290 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54  mory.** for a UT
192a0 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71  F conversion req
192b0 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72  uired for compar
192c0 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  ison.  The error
192d0 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   is stored.** in
192e0 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
192f0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
19300 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e   int whereInScan
19310 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
19320 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
19330 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
19340 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
19350 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
19360 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
19370 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  ,.  ExprList *pL
19380 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ist,     /* The 
19390 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68  value list on th
193a0 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28  e RHS of "x IN (
193b0 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a  v1,v2,v3,...)" *
193c0 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52  /.  tRowcnt *pnR
193d0 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ow       /* Writ
193e0 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
193f0 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
19400 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
19410 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
19420 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
19430 78 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c  x;.  int nRecVal
19440 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e  id = pBuilder->n
19450 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20  RecValid;.  int 
19460 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
19470 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
19480 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
19490 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74  /.  tRowcnt nEst
194a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
194b0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f  umber of rows fo
194c0 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  r a single term 
194d0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f  */.  tRowcnt nRo
194e0 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  wEst = 0;    /* 
194f0 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20  New estimate of 
19500 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
19510 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ws */.  int i;  
19520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19530 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
19540 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
19550 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
19560 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
19570 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69  LITE_OK && i<pLi
19580 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
19590 0a 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61  .    nEst = p->a
195a0 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20  iRowEst[0];.    
195b0 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
195c0 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
195d0 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e  Builder, pList->
195e0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73  a[i].pExpr, &nEs
195f0 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  t);.    nRowEst 
19600 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75  += nEst;.    pBu
19610 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
19620 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20   = nRecValid;.  
19630 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
19640 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
19650 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61  ( nRowEst > p->a
19660 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f  iRowEst[0] ) nRo
19670 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45  wEst = p->aiRowE
19680 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f  st[0];.    *pnRo
19690 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
196a0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
196b0 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  0,("IN row estim
196c0 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20  ate: est=%g\n", 
196d0 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
196e0 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
196f0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52  r->nRecValid==nR
19700 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74  ecValid );.  ret
19710 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
19720 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
19730 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
19740 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62   */../*.** Disab
19750 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  le a term in the
19760 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
19770 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64  Except, do not d
19780 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a  isable the term.
19790 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c  ** if it control
197a0 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  s a LEFT OUTER J
197b0 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e  OIN and it did n
197c0 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
197d0 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49  the ON.** or USI
197e0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  NG clause of tha
197f0 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f  t join..**.** Co
19800 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20  nsider the term 
19810 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65  t2.z='ok' in the
19820 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69   following queri
19830 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  es:.**.**   (1) 
19840 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
19850 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
19860 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52  N t1.a=t2.x WHER
19870 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  E t2.z='ok'.**  
19880 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (2)  SELECT * F
19890 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
198a0 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
198b0 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
198c0 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20  *   (3)  SELECT 
198d0 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48  * FROM t1, t2 WH
198e0 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e  ERE t1.a=t2.x AN
198f0 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a  D t2.z='ok'.**.*
19900 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20  * The t2.z='ok' 
19910 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74  is disabled in t
19920 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73  he in (2) becaus
19930 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a  e it originates.
19940 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ** in the ON cla
19950 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69  use.  The term i
19960 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33  s disabled in (3
19970 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  ) because it is 
19980 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61  not part.** of a
19990 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
199a0 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74  .  In (1), the t
199b0 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62  erm is not disab
199c0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62  led..**.** Disab
199d0 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73  ling a term caus
199e0 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20  es that term to 
199f0 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e  not be tested in
19a00 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
19a10 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
19a20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e   Disabling is an
19a30 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
19a40 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73  When terms are s
19a50 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69  atisfied.** by i
19a60 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62  ndices, we disab
19a70 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65  le them to preve
19a80 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73  nt redundant tes
19a90 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a  ts in the inner.
19aa0 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75  ** loop.  We wou
19ab0 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65  ld get the corre
19ac0 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f  ct results if no
19ad0 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20  thing were ever 
19ae0 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74  disabled,.** but
19af0 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e   joins might run
19b00 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
19b10 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20  .  The trick is 
19b20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75  to disable as mu
19b30 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20  ch.** as we can 
19b40 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e  without disablin
19b50 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20  g too much.  If 
19b60 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  we disabled in (
19b70 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20  1), we'd get.** 
19b80 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72  the wrong answer
19b90 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38  .  See ticket #8
19ba0 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  13..*/.static vo
19bb0 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57  id disableTerm(W
19bc0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
19bd0 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  l, WhereTerm *pT
19be0 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72  erm){.  if( pTer
19bf0 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72  m.      && (pTer
19c00 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
19c10 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20  M_CODED)==0.    
19c20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c    && (pLevel->iL
19c30 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78  eftJoin==0 || Ex
19c40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
19c50 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
19c60 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20  romJoin)).      
19c70 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  && (pLevel->notR
19c80 65 61 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72  eady & pTerm->pr
19c90 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b  ereqAll)==0.  ){
19ca0 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  .    pTerm->wtFl
19cb0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
19cc0 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  D;.    if( pTerm
19cd0 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a  ->iParent>=0 ){.
19ce0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
19cf0 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d  *pOther = &pTerm
19d00 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e  ->pWC->a[pTerm->
19d10 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
19d20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e  if( (--pOther->n
19d30 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20  Child)==0 ){.   
19d40 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
19d50 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29  (pLevel, pOther)
19d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19d70 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
19d80 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79  e an OP_Affinity
19d90 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79   opcode to apply
19da0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
19db0 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66  nity string zAff
19dc0 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67  .** to the n reg
19dd0 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
19de0 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  at base. .**.** 
19df0 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  As an optimizati
19e00 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  on, SQLITE_AFF_N
19e10 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69  ONE entries (whi
19e20 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61  ch are no-ops) a
19e30 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69  t the.** beginni
19e40 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41  ng and end of zA
19e50 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20  ff are ignored. 
19e60 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   If all entries 
19e70 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53  in zAff are.** S
19e80 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20  QLITE_AFF_NONE, 
19e90 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74  then no code get
19ea0 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a  s generated..**.
19eb0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19ec0 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f  makes its own co
19ed0 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68  py of zAff so th
19ee0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  at the caller is
19ef0 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69   free.** to modi
19f00 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68  fy zAff after th
19f10 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
19f20 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
19f30 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69  id codeApplyAffi
19f40 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72  nity(Parse *pPar
19f50 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e  se, int base, in
19f60 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29  t n, char *zAff)
19f70 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
19f80 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
19f90 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20  f( zAff==0 ){.  
19fa0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
19fb0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
19fc0 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
19fd0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
19fe0 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  v!=0 );..  /* Ad
19ff0 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20  just base and n 
1a000 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c  to skip over SQL
1a010 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74  ITE_AFF_NONE ent
1a020 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69  ries at the begi
1a030 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65  nning.  ** and e
1a040 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69  nd of the affini
1a050 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a  ty string..  */.
1a060 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
1a070 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f  zAff[0]==SQLITE_
1a080 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
1a090 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b  n--;.    base++;
1a0a0 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d  .    zAff++;.  }
1a0b0 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26  .  while( n>1 &&
1a0c0 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49   zAff[n-1]==SQLI
1a0d0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
1a0e0 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f     n--;.  }..  /
1a0f0 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66  * Code the OP_Af
1a100 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66  finity opcode if
1a110 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69   there is anythi
1a120 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a  ng left to do. *
1a130 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  /.  if( n>0 ){. 
1a140 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a150 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp2(v, OP_Affin
1a160 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  ity, base, n);. 
1a170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1a180 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41  angeP4(v, -1, zA
1a190 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ff, n);.    sqli
1a1a0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1a1b0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1a1c0 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d  e, base, n);.  }
1a1d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
1a1e0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73  ate code for a s
1a1f0 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74  ingle equality t
1a200 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
1a210 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75   clause.  An equ
1a220 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61  ality.** term ca
1a230 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78  n be either X=ex
1a240 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29  pr or X IN (...)
1a250 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65  .   pTerm is the
1a260 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20   term to be .** 
1a270 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  coded..**.** The
1a280 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66   current value f
1a290 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  or the constrain
1a2a0 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  t is left in reg
1a2b0 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a  ister iReg..**.*
1a2c0 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  * For a constrai
1a2d0 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  nt of the form X
1a2e0 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65  =expr, the expre
1a2f0 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74  ssion is evaluat
1a300 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65  ed and its.** re
1a310 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  sult is left on 
1a320 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20  the stack.  For 
1a330 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74  constraints of t
1a340 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e  he form X IN (..
1a350 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  .).** this routi
1a360 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f  ne sets up a loo
1a370 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72  p that will iter
1a380 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  ate over all val
1a390 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61  ues of X..*/.sta
1a3a0 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61  tic int codeEqua
1a3b0 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73  lityTerm(.  Pars
1a3c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1a3d0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
1a3e0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
1a3f0 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
1a400 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74  /* The term of t
1a410 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1a420 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
1a430 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1a440 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65  vel, /* The leve
1a450 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
1a460 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
1a470 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ing on */.  int 
1a480 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  iEq,            
1a490 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1a4a0 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69  equality term wi
1a4b0 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20  thin this level 
1a4c0 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
1a4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1a4e0 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64   for reverse-ord
1a4f0 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73  er IN operations
1a500 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65   */.  int iTarge
1a510 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74  t         /* Att
1a520 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65  empt to leave re
1a530 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65  sults in this re
1a540 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
1a550 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
1a560 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a  >pExpr;.  Vdbe *
1a570 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1a580 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20  e;.  int iReg;  
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5a0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
1a5b0 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ing results */..
1a5c0 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65    assert( iTarge
1a5d0 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d  t>0 );.  if( pX-
1a5e0 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
1a5f0 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
1a600 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1a610 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
1a620 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d  t, iTarget);.  }
1a630 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d  else if( pX->op=
1a640 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
1a650 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
1a660 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a670 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1a680 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69  ll, 0, iReg);.#i
1a690 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a6a0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
1a6b0 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70  se{.    int eTyp
1a6c0 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e;.    int iTab;
1a6d0 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f  .    struct InLo
1a6e0 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65  op *pIn;.    Whe
1a6f0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
1a700 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1a710 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
1a720 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1a730 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
1a740 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70  0.      && pLoop
1a750 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1a760 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f  !=0.      && pLo
1a770 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1a780 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
1a790 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq].    ){.     
1a7a0 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d   testcase( iEq==
1a7b0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1a7c0 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20  ase( bRev );.   
1a7d0 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b     bRev = !bRev;
1a7e0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1a7f0 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
1a800 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   );.    iReg = i
1a810 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70  Target;.    eTyp
1a820 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
1a830 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
1a840 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65  X, 0);.    if( e
1a850 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type==IN_INDEX_I
1a860 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20  NDEX_DESC ){.   
1a870 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65     testcase( bRe
1a880 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20  v );.      bRev 
1a890 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20  = !bRev;.    }. 
1a8a0 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54     iTab = pX->iT
1a8b0 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  able;.    sqlite
1a8c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
1a8d0 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
1a8e0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
1a8f0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1a900 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1a910 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
1a920 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f  R)==0 );.    pLo
1a930 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
1a940 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20  HERE_IN_ABLE;.  
1a950 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e    if( pLevel->u.
1a960 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20  in.nIn==0 ){.   
1a970 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e     pLevel->addrN
1a980 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
1a990 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1a9a0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1a9b0 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20  u.in.nIn++;.    
1a9c0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
1a9d0 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71  Loop =.       sq
1a9e0 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
1a9f0 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
1aa00 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
1aa10 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  nLoop,.         
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa30 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76       sizeof(pLev
1aa40 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
1aa50 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69  [0])*pLevel->u.i
1aa60 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20  n.nIn);.    pIn 
1aa70 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  = pLevel->u.in.a
1aa80 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  InLoop;.    if( 
1aa90 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  pIn ){.      pIn
1aaa0 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   += pLevel->u.in
1aab0 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20  .nIn - 1;.      
1aac0 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62  pIn->iCur = iTab
1aad0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
1aae0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
1aaf0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  D ){.        pIn
1ab00 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
1ab10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ab20 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
1ab30 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20  b, iReg);.      
1ab40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1ab50 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
1ab60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ab70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
1ab80 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a  iTab, 0, iReg);.
1ab90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
1aba0 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20  n->eEndLoopOp = 
1abb0 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
1abc0 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
1abd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1abe0 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
1abf0 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iReg);.    }else
1ac00 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1ac10 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20  u.in.nIn = 0;.  
1ac20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
1ac30 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1ac40 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72  vel, pTerm);.  r
1ac50 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f  eturn iReg;.}../
1ac60 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1ac70 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
1ac80 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64  luate all == and
1ac90 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
1aca0 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e  for an.** index.
1acb0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1acc0 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62  le, consider tab
1acd0 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c  le t1(a,b,c,d,e,
1ace0 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31  f) with index i1
1acf0 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70  (a,b,c)..** Supp
1ad00 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ose the WHERE cl
1ad10 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61  ause is this:  a
1ad20 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c  ==5 AND b IN (1,
1ad30 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44  2,3) AND c>5 AND
1ad40 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64   c<10.** The ind
1ad50 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61  ex has as many a
1ad60 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79  s three equality
1ad70 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75   constraints, bu
1ad80 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61  t in this.** exa
1ad90 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20  mple, the third 
1ada0 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20  "c" value is an 
1adb0 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20  inequality.  So 
1adc0 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e  only two .** con
1add0 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64  straints are cod
1ade0 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
1adf0 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  e will generate 
1ae00 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
1ae10 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49  .** a==5 and b I
1ae20 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20  N (1,2,3).  The 
1ae30 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
1ae40 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20  or a and b will 
1ae50 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  be stored.** in 
1ae60 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
1ae70 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e  sters and the in
1ae80 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
1ae90 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74   register is ret
1aea0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  urned..**.** In 
1aeb0 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
1aec0 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74  e nEq==2.  But t
1aed0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77  his subroutine w
1aee0 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c  orks for any val
1aef0 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63  ue.** of nEq inc
1af00 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45  luding 0.  If nE
1af10 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69  q==0, this routi
1af20 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e  ne is nearly a n
1af30 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  o-op..** The onl
1af40 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20  y thing it does 
1af50 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  is allocate the 
1af60 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d  pLevel->iMem mem
1af70 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20  ory cell and.** 
1af80 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69  compute the affi
1af90 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  nity string..**.
1afa0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1afb0 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73  always allocates
1afc0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65   at least one me
1afd0 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65  mory cell and re
1afe0 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64  turns.** the ind
1aff0 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72  ex of that memor
1b000 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65  y cell. The code
1b010 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74   that.** calls t
1b020 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1b030 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79   use that memory
1b040 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74   cell to store t
1b050 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a  he termination.*
1b060 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
1b070 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
1b080 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
1b090 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
1b0a0 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
1b0b0 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
1b0c0 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
1b0d0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
1b0e0 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
1b0f0 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
1b100 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20  turning, *pzAff 
1b110 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1b120 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
1b130 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79  aining a.** copy
1b140 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
1b150 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f  ffinity string o
1b160 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f  f the index allo
1b170 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  cated using.** s
1b180 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
1b190 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65  . Except, entrie
1b1a0 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66  s in the copy of
1b1b0 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f   the string asso
1b1c0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65  ciated.** with e
1b1d0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1b1e0 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e  nts that use NON
1b1f0 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20 73  E affinity are s
1b200 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f  et to.** SQLITE_
1b210 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69  AFF_NONE. This i
1b220 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  s to deal with S
1b230 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20 66  QL such as the f
1b240 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
1b250 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1b260 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52 59  1(a TEXT PRIMARY
1b270 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53   KEY, b);.**   S
1b280 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
1b290 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45 52  1 AS t2, t1 WHER
1b2a0 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a  E t1.a = t2.b;.*
1b2b0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d  *.** In the exam
1b2c0 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69  ple above, the i
1b2d0 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61  ndex on t1(a) ha
1b2e0 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e  s TEXT affinity.
1b2f0 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68   But since.** th
1b300 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69 64  e right hand sid
1b310 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74  e of the equalit
1b320 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32  y constraint (t2
1b330 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66  .b) has NONE aff
1b340 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e  inity,.** no con
1b350 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62  version should b
1b360 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f  e attempted befo
1b370 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20  re using a t2.b 
1b380 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66  value as part of
1b390 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61  .** a key to sea
1b3a0 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48  rch the index. H
1b3b0 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 62  ence the first b
1b3c0 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75 72  yte in the retur
1b3d0 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20  ned affinity.** 
1b3e0 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65  string in this e
1b3f0 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20  xample would be 
1b400 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46  set to SQLITE_AF
1b410 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69  F_NONE..*/.stati
1b420 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75  c int codeAllEqu
1b430 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61  alityTerms(.  Pa
1b440 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1b450 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1b460 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
1b470 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
1b480 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65    /* Which neste
1b490 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52  d loop of the FR
1b4a0 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  OM we are coding
1b4b0 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b4d0 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72  everse the order
1b4e0 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   of IN operators
1b4f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
1b500 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Reg,        /* N
1b510 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
1b520 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
1b530 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cate */.  char *
1b540 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20 20  *pzAff          
1b550 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70  /* OUT: Set to p
1b560 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79  oint to affinity
1b570 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
1b580 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20  int nEq;        
1b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b5a0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
1b5b0 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69  = or IN constrai
1b5c0 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20  nts to code */. 
1b5d0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1b5e0 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
1b5f0 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63  * The vm under c
1b600 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1b610 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b630 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e  * The index bein
1b640 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  g used for this 
1b650 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54  loop */.  WhereT
1b660 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
1b670 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
1b680 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  gle constraint t
1b690 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  erm */.  WhereLo
1b6a0 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
1b6b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
1b6c0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
1b6d0 2f 0a 20 20 69 6e 74 20 6a 3b 20 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 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1b700 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  r */.  int regBa
1b710 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1b720 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
1b730 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  ister */.  int n
1b740 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
1b750 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b760 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  er of registers 
1b770 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
1b780 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20   char *zAff;    
1b790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b7a0 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * Affinity strin
1b7b0 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  g to return */..
1b7c0 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65    /* This module
1b7d0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
1b7e0 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74  on query plans t
1b7f0 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  hat use an index
1b800 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  . */.  pLoop = p
1b810 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
1b820 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
1b830 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1b840 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
1b850 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f  0 );.  nEq = pLo
1b860 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
1b870 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d  .  pIdx = pLoop-
1b880 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
1b890 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21  .  assert( pIdx!
1b8a0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  =0 );..  /* Figu
1b8b0 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
1b8c0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20  memory cells we 
1b8d0 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61  will need then a
1b8e0 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20  llocate them..  
1b8f0 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70  */.  regBase = p
1b900 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
1b910 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d  .  nReg = pLoop-
1b920 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e  >u.btree.nEq + n
1b930 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72  ExtraReg;.  pPar
1b940 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
1b950 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69  ;..  zAff = sqli
1b960 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72  te3DbStrDup(pPar
1b970 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49  se->db, sqlite3I
1b980 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28  ndexAffinityStr(
1b990 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28  v, pIdx));.  if(
1b9a0 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50   !zAff ){.    pP
1b9b0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1b9c0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
1b9d0 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74  .  /* Evaluate t
1b9e0 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  he equality cons
1b9f0 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  traints.  */.  a
1ba00 73 73 65 72 74 28 20 7a 41 66 66 3d 3d 30 20 7c  ssert( zAff==0 |
1ba10 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41  | (int)strlen(zA
1ba20 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f  ff)>=nEq );.  fo
1ba30 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b  r(j=0; j<nEq; j+
1ba40 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a  +){.    int r1;.
1ba50 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1ba60 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
1ba70 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
1ba80 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 );.    /* The
1ba90 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20   following true 
1baa0 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74 68  for indices with
1bab0 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d   redundant colum
1bac0 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20  ns. .    ** Ex: 
1bad0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
1bae0 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45  ON t1(a,b,a); SE
1baf0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1bb00 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30  HERE a=0 AND b=0
1bb10 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73  ; */.    testcas
1bb20 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  e( (pTerm->wtFla
1bb30 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
1bb40 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
1bb50 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
1bb60 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1bb70 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63  AL );.    r1 = c
1bb80 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1bb90 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
1bba0 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20  Level, j, bRev, 
1bbb0 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
1bbc0 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b  if( r1!=regBase+
1bbd0 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  j ){.      if( n
1bbe0 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Reg==1 ){.      
1bbf0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1bc00 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1bc10 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20  regBase);.      
1bc20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a    regBase = r1;.
1bc30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1bc40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1bc50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
1bc60 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b  py, r1, regBase+
1bc70 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
1bc80 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
1bc90 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1bca0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
1bcb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1bcc0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1bcd0 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66   WO_IN );.    if
1bce0 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1bcf0 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
1bd00 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20  |WO_IN))==0 ){. 
1bd10 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
1bd20 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  t = pTerm->pExpr
1bd30 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1bd40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1bd50 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69  sNullJump(v, pRi
1bd60 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20  ght, regBase+j, 
1bd70 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
1bd80 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66 66  ;.      if( zAff
1bd90 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1bda0 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1bdb0 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
1bdc0 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f  Aff[j])==SQLITE_
1bdd0 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
1bde0 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20        zAff[j] = 
1bdf0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1be00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1be10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1be20 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
1be30 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
1be40 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  zAff[j]) ){.    
1be50 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20        zAff[j] = 
1be60 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1be70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1be80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a   }.    }.  }.  *
1be90 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20  pzAff = zAff;.  
1bea0 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a  return regBase;.
1beb0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1bec0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
1bed0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1bee0 65 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f  e is a helper fo
1bef0 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61  r explainIndexRa
1bf00 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a  nge() below.**.*
1bf10 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65  * pStr holds the
1bf20 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72   text of an expr
1bf30 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61  ession that we a
1bf40 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f  re building up o
1bf50 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20  ne term.** at a 
1bf60 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74  time.  This rout
1bf70 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20 74  ine adds a new t
1bf80 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  erm to the end o
1bf90 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1bfa0 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73  ..** Terms are s
1bfb0 65 70 61 72 61 74 65 64 20 62 79 20 41 4e 44 20  eparated by AND 
1bfc0 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44 22  so add the "AND"
1bfd0 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64   text for second
1bfe0 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a   and subsequent.
1bff0 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a  ** terms only..*
1c000 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
1c010 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1c020 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74  .  StrAccum *pSt
1c030 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
1c040 2a 20 54 68 65 20 74 65 78 74 20 65 78 70 72 65  * The text expre
1c050 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c  ssion being buil
1c060 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d  t */.  int iTerm
1c070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c080 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1c090 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74  his term.  First
1c0a0 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f   is zero */.  co
1c0b0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
1c0c0 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  n,        /* Nam
1c0d0 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
1c0e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1c0f0 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20 20  *zOp            
1c100 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1c110 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20  operator */.){. 
1c120 20 69 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c   if( iTerm ) sql
1c130 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1c140 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22  nd(pStr, " AND "
1c150 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 5);.  sqlite3S
1c160 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
1c170 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29  tr, zColumn, -1)
1c180 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
1c190 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
1c1a0 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  zOp, 1);.  sqlit
1c1b0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1c1c0 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a  (pStr, "?", 1);.
1c1d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
1c1e0 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62  t pLevel describ
1c1f0 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66 6f  es a strategy fo
1c200 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65  r scanning table
1c210 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20   pTab. This .** 
1c220 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1c230 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1c240 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f  string buffer co
1c250 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72  ntaining a descr
1c260 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  iption.** of the
1c270 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65   subset of table
1c280 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79   rows scanned by
1c290 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69 6e   the strategy in
1c2a0 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a   the form of an.
1c2b0 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f  ** SQL expressio
1c2c0 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f  n. Or, if all ro
1c2d0 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20  ws are scanned, 
1c2e0 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
1c2f0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1c300 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72  ple, if the quer
1c310 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  y:.**.**   SELEC
1c320 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
1c330 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a  E a=1 AND b>2;.*
1c340 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20  *.** is run and 
1c350 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
1c360 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65  x on (a, b), the
1c370 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1c380 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72  returns a.** str
1c390 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a  ing similar to:.
1c3a0 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44  **.**   "a=? AND
1c3b0 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20   b>?".**.** The 
1c3c0 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72  returned pointer
1c3d0 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72   points to memor
1c3e0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
1c3f0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
1c400 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  )..** It is the 
1c410 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
1c420 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
1c430 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72 20  free the buffer 
1c440 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f  when it is.** no
1c450 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
1c460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1c470 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61   *explainIndexRa
1c480 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nge(sqlite3 *db,
1c490 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
1c4a0 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  p, Table *pTab){
1c4b0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1c4c0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1c4d0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
1c4e0 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
1c4f0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 69 6e 74 20  tree.nEq;.  int 
1c500 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  i, j;.  Column *
1c510 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  aCol = pTab->aCo
1c520 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75  l;.  int *aiColu
1c530 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
1c540 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75  olumn;.  StrAccu
1c550 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45  m txt;..  if( nE
1c560 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  q==0 && (pLoop->
1c570 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1c580 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
1c590 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20  _TOP_LIMIT))==0 
1c5a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1c5b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
1c5c0 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c  rAccumInit(&txt,
1c5d0 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41   0, 0, SQLITE_MA
1c5e0 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74  X_LENGTH);.  txt
1c5f0 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69  .db = db;.  sqli
1c600 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1c610 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29  d(&txt, " (", 2)
1c620 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1c630 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  Eq; i++){.    ch
1c640 61 72 20 2a 7a 20 3d 20 28 69 3d 3d 70 49 6e 64  ar *z = (i==pInd
1c650 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20  ex->nColumn ) ? 
1c660 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61  "rowid" : aCol[a
1c670 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d  iColumn[i]].zNam
1c680 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70  e;.    explainAp
1c690 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69  pendTerm(&txt, i
1c6a0 2c 20 7a 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a  , z, "=");.  }..
1c6b0 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70    j = i;.  if( p
1c6c0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
1c6d0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
1c6e0 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
1c6f0 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  j==pIndex->nColu
1c700 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a  mn ) ? "rowid" :
1c710 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a   aCol[aiColumn[j
1c720 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78  ]].zName;.    ex
1c730 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1c740 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e  &txt, i++, z, ">
1c750 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  ");.  }.  if( pL
1c760 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
1c770 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
1c780 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a      char *z = (j
1c790 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  ==pIndex->nColum
1c7a0 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  n ) ? "rowid" : 
1c7b0 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  aCol[aiColumn[j]
1c7c0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70  ].zName;.    exp
1c7d0 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
1c7e0 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b  txt, i, z, "<");
1c7f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
1c800 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78  rAccumAppend(&tx
1c810 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 72 65  t, ")", 1);.  re
1c820 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41  turn sqlite3StrA
1c830 63 63 75 6d 46 69 6e 69 73 68 28 26 74 78 74 29  ccumFinish(&txt)
1c840 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1c850 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1c860 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65  -op unless curre
1c870 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
1c880 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  an EXPLAIN QUERY
1c890 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64   PLAN.** command
1c8a0 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 20 62  . If the query b
1c8b0 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69 73  eing compiled is
1c8c0 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52   an EXPLAIN QUER
1c8d0 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65  Y PLAN, a single
1c8e0 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 61 64  .** record is ad
1c8f0 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ded to the outpu
1c900 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  t to describe th
1c910 65 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72  e table scan str
1c920 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65  ategy in .** pLe
1c930 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  vel..*/.static v
1c940 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63  oid explainOneSc
1c950 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  an(.  Parse *pPa
1c960 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
1c970 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
1c980 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
1c990 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
1c9a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c9b0 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73 20 6c  able list this l
1c9c0 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20 2a 2f  oop refers to */
1c9d0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
1c9e0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
1c9f0 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72     /* Scan to wr
1ca00 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f  ite OP_Explain o
1ca10 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69  pcode for */.  i
1ca20 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ca40 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76  * Value for "lev
1ca50 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  el" column of ou
1ca60 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  tput */.  int iF
1ca70 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  rom,            
1ca80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1ca90 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f  ue for "from" co
1caa0 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a  lumn of output *
1cab0 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
1cac0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
1cad0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
1cae0 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
1caf0 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b  ereBegin() */.){
1cb00 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
1cb10 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
1cb20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1cb30 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1cb40 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
1cb50 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56  l->iFrom];.    V
1cb60 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1cb70 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
1cb80 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  VM being constru
1cb90 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69  cted */.    sqli
1cba0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1cbb0 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74  ->db;     /* Dat
1cbc0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
1cbd0 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20      char *zMsg; 
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbf0 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64    /* Text to add
1cc00 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a   to EQP output *
1cc10 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20  /.    int iId = 
1cc20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
1cc30 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64  d;  /* Select id
1cc40 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70   (left-most outp
1cc50 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20  ut column) */.  
1cc60 20 20 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20    int isSearch; 
1cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc80 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 53 45  /* True for a SE
1cc90 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20  ARCH. False for 
1cca0 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68 65  SCAN. */.    Whe
1ccb0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
1ccc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ccd0 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57 68  e controlling Wh
1cce0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
1ccf0 2f 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73 3b  /.    u32 flags;
1cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd10 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 61      /* Flags tha
1cd20 74 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20  t describe this 
1cd30 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f  loop */..    pLo
1cd40 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
1cd50 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d  oop;.    flags =
1cd60 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b   pLoop->wsFlags;
1cd70 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 26  .    if( (flags&
1cd80 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20  WHERE_MULTI_OR) 
1cd90 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57  || (wctrlFlags&W
1cda0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
1cdb0 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  LY) ) return;.. 
1cdc0 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28 66     isSearch = (f
1cdd0 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f  lags&(WHERE_BTM_
1cde0 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
1cdf0 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20  LIMIT))!=0.     
1ce00 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67         || ((flag
1ce10 73 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  s&WHERE_VIRTUALT
1ce20 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f  ABLE)==0 && (pLo
1ce30 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e  op->u.btree.nEq>
1ce40 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)).            
1ce50 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28  || (wctrlFlags&(
1ce60 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
1ce70 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  N|WHERE_ORDERBY_
1ce80 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67  MAX));..    zMsg
1ce90 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1cea0 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65  f(db, "%s", isSe
1ceb0 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53  arch?"SEARCH":"S
1cec0 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70  CAN");.    if( p
1ced0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
1cee0 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
1cef0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1cf00 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51  , zMsg, "%s SUBQ
1cf10 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70  UERY %d", zMsg,p
1cf20 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29  Item->iSelectId)
1cf30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cf40 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1cf50 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1cf60 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73  sg, "%s TABLE %s
1cf70 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
1cf80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  zName);.    }.. 
1cf90 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
1cfa0 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d  lias ){.      zM
1cfb0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1cfc0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1cfd0 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c  %s AS %s", zMsg,
1cfe0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
1cff0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1d000 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  flags & (WHERE_I
1d010 50 4b 7c 57 48 45 52 45 5f 56 49 52 54 55 41 4c  PK|WHERE_VIRTUAL
1d020 54 41 42 4c 45 29 29 3d 3d 30 0a 20 20 20 20 20  TABLE))==0.     
1d030 26 26 20 41 4c 57 41 59 53 28 70 4c 6f 6f 70 2d  && ALWAYS(pLoop-
1d040 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
1d050 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
1d060 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
1d070 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
1d080 65 28 64 62 2c 20 70 4c 6f 6f 70 2c 20 70 49 74  e(db, pLoop, pIt
1d090 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20  em->pTab);.     
1d0a0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1d0b0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1d0c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d0d0 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45   ((flags & WHERE
1d0e0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 3f 20 0a  _AUTO_INDEX) ? .
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d100 20 20 20 22 25 73 20 55 53 49 4e 47 20 41 55 54     "%s USING AUT
1d110 4f 4d 41 54 49 43 20 25 73 49 4e 44 45 58 25 2e  OMATIC %sINDEX%.
1d120 30 73 25 73 22 20 3a 0a 20 20 20 20 20 20 20 20  0s%s" :.        
1d130 20 20 20 20 20 20 20 20 20 20 20 22 25 73 20 55             "%s U
1d140 53 49 4e 47 20 25 73 49 4e 44 45 58 20 25 73 25  SING %sINDEX %s%
1d150 73 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  s"), .          
1d160 20 20 20 20 20 7a 4d 73 67 2c 20 28 28 66 6c 61       zMsg, ((fla
1d170 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
1d180 4e 4c 59 29 20 3f 20 22 43 4f 56 45 52 49 4e 47  NLY) ? "COVERING
1d190 20 22 20 3a 20 22 22 29 2c 0a 20 20 20 20 20 20   " : ""),.      
1d1a0 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
1d1b0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
1d1c0 7a 4e 61 6d 65 2c 20 7a 57 68 65 72 65 29 3b 0a  zName, zWhere);.
1d1d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
1d1e0 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b  ree(db, zWhere);
1d1f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1d200 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  flags & WHERE_IP
1d210 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20  K)!=0 && (flags 
1d220 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49  & WHERE_CONSTRAI
1d230 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  NT)!=0 ){.      
1d240 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1d250 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1d260 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45 47   "%s USING INTEG
1d270 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c  ER PRIMARY KEY",
1d280 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20 69   zMsg);..      i
1d290 66 28 20 66 6c 61 67 73 26 28 57 48 45 52 45 5f  f( flags&(WHERE_
1d2a0 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
1d2b0 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20  COLUMN_IN) ){.  
1d2c0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1d2d0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1d2e0 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
1d2f0 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d=?)", zMsg);.  
1d300 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
1d310 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f  lags&WHERE_BOTH_
1d320 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f  LIMIT)==WHERE_BO
1d330 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TH_LIMIT ){.    
1d340 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1d350 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1d360 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e  Msg, "%s (rowid>
1d370 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c  ? AND rowid<?)",
1d380 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
1d390 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57 48  lse if( flags&WH
1d3a0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
1d3b0 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
1d3c0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1d3d0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
1d3e0 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid>?)", zMsg);
1d3f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1d400 20 41 4c 57 41 59 53 28 66 6c 61 67 73 26 57 48   ALWAYS(flags&WH
1d410 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29  ERE_TOP_LIMIT) )
1d420 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
1d430 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1d440 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
1d450 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29  rowid<?)", zMsg)
1d460 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d470 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d480 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1d490 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 66  .    else if( (f
1d4a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
1d4b0 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
1d4c0 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
1d4d0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1d4e0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52 54  , zMsg, "%s VIRT
1d4f0 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20  UAL TABLE INDEX 
1d500 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20  %d:%s", zMsg,.  
1d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d520 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1d530 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76  xNum, pLoop->u.v
1d540 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
1d550 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7a 4d   }.#endif.    zM
1d560 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1d570 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1d580 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  %s", zMsg);.    
1d590 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d5a0 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
1d5b0 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46   iId, iLevel, iF
1d5c0 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  rom, zMsg, P4_DY
1d5d0 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  NAMIC);.  }.}.#e
1d5e0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
1d5f0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c  lainOneScan(u,v,
1d600 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20  w,x,y,z).#endif 
1d610 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
1d620 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  XPLAIN */.../*.*
1d630 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d640 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
1d650 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c   the iLevel-th l
1d660 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52 45  oop in the WHERE
1d670 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65   clause.** imple
1d680 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69  mentation descri
1d690 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a  bed by pWInfo..*
1d6a0 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
1d6b0 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72   codeOneLoopStar
1d6c0 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
1d6d0 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d  pWInfo,   /* Com
1d6e0 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  plete informatio
1d6f0 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52  n about the WHER
1d700 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
1d710 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
1d720 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65     /* Which leve
1d730 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  l of pWInfo->a[]
1d740 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64   should be coded
1d750 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
1d760 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57 68  tReady     /* Wh
1d770 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 63  ich tables are c
1d780 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
1d790 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  le */.){.  int j
1d7a0 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
1d7b0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
1d7c0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20   */.  int iCur; 
1d7d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d7e0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
1d7f0 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
1d800 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20 20   int addrNxt;   
1d810 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
1d820 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e  o jump to contin
1d830 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74  ue with the next
1d840 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e   IN case */.  in
1d850 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20  t omitTable;    
1d860 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
1d870 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f   use the index o
1d880 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  nly */.  int bRe
1d890 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
1d8a0 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65 64   True if we need
1d8b0 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65   to scan in reve
1d8c0 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57  rse order */.  W
1d8d0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1d8e0 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65  l;  /* The where
1d8f0 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f 64   level to be cod
1d900 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ed */.  WhereLoo
1d910 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20  p *pLoop;    /* 
1d920 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  The WhereLoop ob
1d930 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ject being coded
1d940 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
1d950 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65  e *pWC;    /* De
1d960 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  composition of t
1d970 68 65 20 65 6e 74 69 72 65 20 57 48 45 52 45 20  he entire WHERE 
1d980 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
1d990 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1d9b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
1d9c0 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  rm */.  Parse *p
1d9d0 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
1d9e0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1d9f0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1da00 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
1da10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1da30 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  ection */.  Vdbe
1da40 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
1da50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1da60 68 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74  he prepared stmt
1da70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1da80 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ions */.  struct
1da90 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1daa0 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f  TabItem;  /* FRO
1dab0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
1dac0 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
1dad0 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20  nt addrBrk;     
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1daf0 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
1db00 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
1db10 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
1db20 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20  drCont;         
1db30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
1db40 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
1db50 75 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63  ue with next cyc
1db60 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77  le */.  int iRow
1db70 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  idReg = 0;      
1db80 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74    /* Rowid is st
1db90 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67  ored in this reg
1dba0 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65  ister, if not ze
1dbb0 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c  ro */.  int iRel
1dbc0 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20  easeReg = 0;    
1dbd0 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74    /* Temp regist
1dbe0 65 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72  er to free befor
1dbf0 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a  e returning */..
1dc00 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
1dc10 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d  o->pParse;.  v =
1dc20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1dc30 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d    pWC = &pWInfo-
1dc40 3e 73 57 43 3b 0a 20 20 64 62 20 3d 20 70 50 61  >sWC;.  db = pPa
1dc50 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4c 65 76 65  rse->db;.  pLeve
1dc60 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
1dc70 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20  Level];.  pLoop 
1dc80 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
1dc90 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26  ;.  pTabItem = &
1dca0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1dcb0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
1dcc0 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61  m];.  iCur = pTa
1dcd0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
1dce0 20 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61    pLevel->notRea
1dcf0 64 79 20 3d 20 6e 6f 74 52 65 61 64 79 20 26 20  dy = notReady & 
1dd00 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  ~getMask(&pWInfo
1dd10 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
1dd20 29 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 57 49  );.  bRev = (pWI
1dd30 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c  nfo->revMask>>iL
1dd40 65 76 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74 54  evel)&1;.  omitT
1dd50 61 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77  able = (pLoop->w
1dd60 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1dd70 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20  DX_ONLY)!=0 .   
1dd80 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
1dd90 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
1dda0 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
1ddb0 4c 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4e 6f  LE)==0;.  VdbeNo
1ddc0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  opComment((v, "B
1ddd0 65 67 69 6e 20 4a 6f 69 6e 20 4c 6f 6f 70 20 25  egin Join Loop %
1dde0 64 22 2c 20 69 4c 65 76 65 6c 29 29 3b 0a 0a 20  d", iLevel));.. 
1ddf0 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c   /* Create label
1de00 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b  s for the "break
1de10 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22  " and "continue"
1de20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
1de30 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ** for the curre
1de40 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74  nt loop.  Jump t
1de50 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65  o addrBrk to bre
1de60 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ak out of a loop
1de70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63  ..  ** Jump to c
1de80 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69  ont to go immedi
1de90 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78  ately to the nex
1dea0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
1deb0 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20  he.  ** loop..  
1dec0 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65  **.  ** When the
1ded0 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  re is an IN oper
1dee0 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61  ator, we also ha
1def0 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c  ve a "addrNxt" l
1df00 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d  abel that.  ** m
1df10 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  eans to continue
1df20 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49   with the next I
1df30 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74  N value combinat
1df40 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20  ion.  When.  ** 
1df50 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20  there are no IN 
1df60 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65  operators in the
1df70 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
1df80 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  e "addrNxt" labe
1df90 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61  l.  ** is the sa
1dfa0 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e  me as "addrBrk".
1dfb0 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20  .  */.  addrBrk 
1dfc0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
1dfd0 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
1dfe0 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
1dff0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1e000 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76   addrCont = pLev
1e010 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73  el->addrCont = s
1e020 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1e030 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66  bel(v);..  /* If
1e040 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67   this is the rig
1e050 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
1e060 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61  FT OUTER JOIN, a
1e070 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a  llocate and.  **
1e080 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65   initialize a me
1e090 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72  mory cell that r
1e0a0 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74  ecords if this t
1e0b0 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79  able matches any
1e0c0 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
1e0d0 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74   left table of t
1e0e0 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
1e0f0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  if( pLevel->iFro
1e100 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  m>0 && (pTabItem
1e110 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  [0].jointype & J
1e120 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
1e130 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a    pLevel->iLeftJ
1e140 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oin = ++pParse->
1e150 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
1e160 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e170 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c  P_Integer, 0, pL
1e180 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
1e190 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
1e1a0 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54  t((v, "init LEFT
1e1b0 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66   JOIN no-match f
1e1c0 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lag"));.  }..  /
1e1d0 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f  * Special case o
1e1e0 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  f a FROM clause 
1e1f0 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65  subquery impleme
1e200 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
1e210 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54  tine */.  if( pT
1e220 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75  abItem->viaCorou
1e230 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tine ){.    int 
1e240 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49  regYield = pTabI
1e250 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
1e260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e270 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1e280 67 65 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61  ger, pTabItem->a
1e290 64 64 72 46 69 6c 6c 53 75 62 2d 31 2c 20 72 65  ddrFillSub-1, re
1e2a0 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 4c 65  gYield);.    pLe
1e2b0 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74  vel->p2 =  sqlit
1e2c0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
1e2d0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65  OP_Yield, regYie
1e2e0 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ld);.    VdbeCom
1e2f0 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72  ment((v, "next r
1e300 6f 77 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65  ow of co-routine
1e310 20 25 73 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e   %s", pTabItem->
1e320 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
1e330 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e340 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
1e350 65 67 59 69 65 6c 64 2b 31 2c 20 61 64 64 72 42  egYield+1, addrB
1e360 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  rk);.    pLevel-
1e370 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20  >op = OP_Goto;. 
1e380 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
1e390 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1e3a0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20  UALTABLE.  if(  
1e3b0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1e3c0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
1e3d0 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
1e3e0 2f 2a 20 43 61 73 65 20 31 3a 20 20 54 68 65 20  /* Case 1:  The 
1e3f0 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75  table is a virtu
1e400 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74  al-table.  Use t
1e410 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56  he VFilter and V
1e420 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  Next.    **     
1e430 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74       to access t
1e440 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  he data..    */.
1e450 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20      int iReg;   
1e460 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20  /* P3 Value for 
1e470 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20  OP_VFilter */.  
1e480 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75    int addrNotFou
1e490 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e  nd;.    int nCon
1e4a0 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d  straint = pLoop-
1e4b0 3e 6e 4c 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71  >nLTerm;..    sq
1e4c0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1e4d0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1e4e0 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  iReg = sqlite3Ge
1e4f0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1e500 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  e, nConstraint+2
1e510 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f  );.    addrNotFo
1e520 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  und = pLevel->ad
1e530 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a  drBrk;.    for(j
1e540 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; j<nConstrain
1e550 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  t; j++){.      i
1e560 6e 74 20 69 54 61 72 67 65 74 20 3d 20 69 52 65  nt iTarget = iRe
1e570 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54 65  g+j+2;.      pTe
1e580 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rm = pLoop->aLTe
1e590 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  rm[j];.      if(
1e5a0 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74   pTerm==0 ) cont
1e5b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
1e5c0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1e5d0 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
1e5e0 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79      codeEquality
1e5f0 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
1e600 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62  rm, pLevel, j, b
1e610 52 65 76 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  Rev, iTarget);. 
1e620 20 20 20 20 20 20 20 61 64 64 72 4e 6f 74 46 6f         addrNotFo
1e630 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  und = pLevel->ad
1e640 64 72 4e 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  drNxt;.      }el
1e650 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1e660 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1e670 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
1e680 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65  ->pRight, iTarge
1e690 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1e6a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1e6b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1e6c0 74 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e  teger, pLoop->u.
1e6d0 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65  vtab.idxNum, iRe
1e6e0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  g);.    sqlite3V
1e6f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e700 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72  Integer, nConstr
1e710 61 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20  aint, iReg+1);. 
1e720 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e730 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74  dOp4(v, OP_VFilt
1e740 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f  er, iCur, addrNo
1e750 74 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20  tFound, iReg,.  
1e760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e770 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
1e780 62 2e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20  b.idxStr,.      
1e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7a0 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65  pLoop->u.vtab.ne
1e7b0 65 64 46 72 65 65 20 3f 20 50 34 5f 4d 50 52 49  edFree ? P4_MPRI
1e7c0 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29  NTF : P4_STATIC)
1e7d0 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76  ;.    pLoop->u.v
1e7e0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
1e7f0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1e800 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20  <nConstraint && 
1e810 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  j<16; j++){.    
1e820 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e    if( (pLoop->u.
1e830 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a  vtab.omitMask>>j
1e840 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64  )&1 ){.        d
1e850 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1e860 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  l, pLoop->aLTerm
1e870 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [j]);.      }.  
1e880 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1e890 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20  op = OP_VNext;. 
1e8a0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1e8b0 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
1e8c0 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
1e8d0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1e8e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1e8f0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
1e900 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e  arse, iReg, nCon
1e910 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
1e920 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1e930 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
1e940 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
1e950 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
1e960 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20  RTUALTABLE */.. 
1e970 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
1e980 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
1e990 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f  )!=0.   && (pLoo
1e9a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
1e9b0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48  ERE_COLUMN_IN|WH
1e9c0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21  ERE_COLUMN_EQ))!
1e9d0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43  =0.  ){.    /* C
1e9e0 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64  ase 2:  We can d
1e9f0 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63  irectly referenc
1ea00 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75  e a single row u
1ea10 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20  sing an.    **  
1ea20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79          equality
1ea30 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
1ea40 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
1ea50 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20  eld.  Or.    ** 
1ea60 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65           we refe
1ea70 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72  rence multiple r
1ea80 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77  ows using a "row
1ea90 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20  id IN (...)".   
1eaa0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   **          con
1eab0 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  struct..    */. 
1eac0 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
1ead0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31  ->u.btree.nEq==1
1eae0 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65   );.    iRelease
1eaf0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
1eb00 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1eb10 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
1eb20 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20  op->aLTerm[0];. 
1eb30 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
1eb40 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1eb50 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21  t( pTerm->pExpr!
1eb60 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1eb70 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
1eb80 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1eb90 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1eba0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1ebb0 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d  .    iRowidReg =
1ebc0 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
1ebd0 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
1ebe0 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65 76   pLevel, 0, bRev
1ebf0 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
1ec00 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
1ec10 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
1ec20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ec30 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
1ec40 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c  eInt, iRowidReg,
1ec50 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73   addrNxt);.    s
1ec60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1ec70 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
1ec80 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  , iCur, addrNxt,
1ec90 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1eca0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1ecb0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1ecc0 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64 52 65  pParse, iRowidRe
1ecd0 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  g, 1);.    sqlit
1ece0 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
1ecf0 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d  (pParse, iCur, -
1ed00 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  1, iRowidReg);. 
1ed10 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1ed20 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70  v, "pk"));.    p
1ed30 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
1ed40 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  oop;.  }else if(
1ed50 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1ed60 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30   & WHERE_IPK)!=0
1ed70 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4c  .         && (pL
1ed80 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1ed90 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
1eda0 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  E)!=0.  ){.    /
1edb0 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20 68 61  * Case 3:  We ha
1edc0 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  ve an inequality
1edd0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
1ede0 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
1edf0 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eld..    */.    
1ee00 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f  int testOp = OP_
1ee10 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74  Noop;.    int st
1ee20 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d  art;.    int mem
1ee30 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20  EndValue = 0;.  
1ee40 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74    WhereTerm *pSt
1ee50 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20  art, *pEnd;..   
1ee60 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
1ee70 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a 20 3d  le==0 );.    j =
1ee80 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d   0;.    pStart =
1ee90 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69   pEnd = 0;.    i
1eea0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1eeb0 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
1eec0 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d 20 70  MIT ) pStart = p
1eed0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b  Loop->aLTerm[j++
1eee0 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  ];.    if( pLoop
1eef0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1ef00 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70 45  E_TOP_LIMIT ) pE
1ef10 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  nd = pLoop->aLTe
1ef20 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73 73  rm[j++];.    ass
1ef30 65 72 74 28 20 70 53 74 61 72 74 21 3d 30 20 7c  ert( pStart!=0 |
1ef40 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20  | pEnd!=0 );.   
1ef50 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
1ef60 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72     pTerm = pStar
1ef70 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74 20  t;.      pStart 
1ef80 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45  = pEnd;.      pE
1ef90 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  nd = pTerm;.    
1efa0 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  }.    if( pStart
1efb0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1efc0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
1efd0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
1efe0 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  n that defines t
1eff0 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a  he start bound *
1f000 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20  /.      int r1, 
1f010 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a  rTemp;        /*
1f020 20 52 65 67 69 73 74 65 72 73 20 66 6f 72 20 68   Registers for h
1f030 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72 74  olding the start
1f040 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20   boundary */..  
1f050 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
1f060 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61  wing constant ma
1f070 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69  ps TK_xx codes i
1f080 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  nto correspondin
1f090 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b  g .      ** seek
1f0a0 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65   opcodes.  It de
1f0b0 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69  pends on a parti
1f0c0 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f  cular ordering o
1f0d0 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f  f TK_xx.      */
1f0e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
1f0f0 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20  aMoveOp[] = {.  
1f100 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
1f110 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c  T */  OP_SeekGt,
1f120 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
1f130 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LE */  OP_Seek
1f140 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Le,.           /
1f150 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53  * TK_LT */  OP_S
1f160 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20 20  eekLt,.         
1f170 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f    /* TK_GE */  O
1f180 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20 20 7d  P_SeekGe.      }
1f190 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f1a0 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29  TK_LE==TK_GT+1 )
1f1b0 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  ;      /* Make s
1f1c0 75 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67  ure the ordering
1f1d0 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .. */.      asse
1f1e0 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
1f1f0 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e  +2 );      /*  .
1f200 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20  .. of the TK_xx 
1f210 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20  values... */.   
1f220 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
1f230 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20  ==TK_GT+3 );    
1f240 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72    /*  ... is cor
1f250 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20  recct. */..     
1f260 20 61 73 73 65 72 74 28 20 28 70 53 74 61 72 74   assert( (pStart
1f270 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1f280 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20  _VNULL)==0 );.  
1f290 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
1f2a0 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
1f2b0 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
1f2c0 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61 72        pX = pStar
1f2d0 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
1f2e0 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
1f2f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f300 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72   pStart->leftCur
1f310 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20  sor!=iCur ); /* 
1f320 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74  transitive const
1f330 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
1f340 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f350 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f360 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 54   pX->pRight, &rT
1f370 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  emp);.      sqli
1f380 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1f390 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d   aMoveOp[pX->op-
1f3a0 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61 64  TK_GT], iCur, ad
1f3b0 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20  drBrk, r1);.    
1f3c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1f3d0 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20  , "pk"));.      
1f3e0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f3f0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1f400 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20  Parse, r1, 1);. 
1f410 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
1f420 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1f430 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20 20 20  e, rTemp);.     
1f440 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1f450 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20  vel, pStart);.  
1f460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1f470 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f480 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61  (v, bRev ? OP_La
1f490 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20  st : OP_Rewind, 
1f4a0 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a  iCur, addrBrk);.
1f4b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45      }.    if( pE
1f4c0 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
1f4d0 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58 20 3d   *pX;.      pX =
1f4e0 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20   pEnd->pExpr;.  
1f4f0 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d      assert( pX!=
1f500 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1f510 74 28 20 28 70 45 6e 64 2d 3e 77 74 46 6c 61 67  t( (pEnd->wtFlag
1f520 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
1f530 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1f540 63 61 73 65 28 20 70 45 6e 64 2d 3e 6c 65 66 74  case( pEnd->left
1f550 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20  Cursor!=iCur ); 
1f560 2f 2a 20 54 72 61 6e 73 69 74 69 76 65 20 63 6f  /* Transitive co
1f570 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
1f580 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 6e     testcase( pEn
1f590 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
1f5a0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
1f5b0 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d     memEndValue =
1f5c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1f5d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f5e0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1f5f0 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e  X->pRight, memEn
1f600 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69  dValue);.      i
1f610 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  f( pX->op==TK_LT
1f620 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47   || pX->op==TK_G
1f630 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  T ){.        tes
1f640 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
1f650 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20  Le : OP_Ge;.    
1f660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f670 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f   testOp = bRev ?
1f680 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a   OP_Lt : OP_Gt;.
1f690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69        }.      di
1f6a0 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1f6b0 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20  , pEnd);.    }. 
1f6c0 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
1f6d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1f6e0 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  r(v);.    pLevel
1f6f0 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  ->op = bRev ? OP
1f700 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
1f710 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
1f720 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
1f730 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a  el->p2 = start;.
1f740 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
1f750 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20  el->p5==0 );.   
1f760 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f   if( testOp!=OP_
1f770 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52  Noop ){.      iR
1f780 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61  owidReg = iRelea
1f790 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
1f7a0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1f7b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f7c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f7d0 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52  _Rowid, iCur, iR
1f7e0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1f7f0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f800 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
1f810 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
1f820 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1f830 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74  3VdbeAddOp3(v, t
1f840 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c  estOp, memEndVal
1f850 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f  ue, addrBrk, iRo
1f860 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
1f870 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1f880 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46  P5(v, SQLITE_AFF
1f890 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54  _NUMERIC | SQLIT
1f8a0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1f8b0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1f8c0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1f8d0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
1f8e0 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34  ){.    /* Case 4
1f8f0 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61  : A scan using a
1f900 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  n index..    **.
1f910 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1f920 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1f930 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f  may contain zero
1f940 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74   or more equalit
1f950 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
1f960 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72    terms ("==" or
1f970 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29   "IN" operators)
1f980 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
1f990 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20  he N.    **     
1f9a0 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f      left-most co
1f9b0 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
1f9c0 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20  ex. It may also 
1f9d0 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20  contain.    **  
1f9e0 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74         inequalit
1f9f0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e  y constraints (>
1fa00 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f  , <, >= or <=) o
1fa10 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20  n the indexed.  
1fa20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c    **         col
1fa30 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61  umn that immedia
1fa40 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65  tely follows the
1fa50 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f   N equalities. O
1fa60 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  nly .    **     
1fa70 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f      the right-mo
1fa80 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65  st column can be
1fa90 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d   an inequality -
1faa0 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20   the rest must. 
1fab0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73     **         us
1fac0 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22  e the "==" and "
1fad0 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46  IN" operators. F
1fae0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1faf0 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  he .    **      
1fb00 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28     index is on (
1fb10 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65  x,y,z), then the
1fb20 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73   following claus
1fb30 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20  es are all .    
1fb40 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d  **         optim
1fb50 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ized:.    **.   
1fb60 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1fb70 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  =5.    **       
1fb80 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31       x=5 AND y=1
1fb90 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1fba0 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30      x=5 AND y<10
1fbb0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1fbc0 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41     x=5 AND y>5 A
1fbd0 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
1fbe0 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1fbf0 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a  D y=5 AND z<=10.
1fc00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1fc10 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74        The z<10 t
1fc20 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  erm of the follo
1fc30 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75  wing cannot be u
1fc40 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  sed, only.    **
1fc50 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d 35           the x=5
1fc60 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20   term:.    **.  
1fc70 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1fc80 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20  x=5 AND z<10.   
1fc90 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1fca0 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f     N may be zero
1fcb0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
1fcc0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1fcd0 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20  ints..    **    
1fce0 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61 72       If there ar
1fcf0 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20  e no inequality 
1fd00 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
1fd10 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a  n N is at.    **
1fd20 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f           least o
1fd30 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ne..    **.    *
1fd40 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63  *         This c
1fd50 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ase is also used
1fd60 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
1fd70 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  no WHERE clause.
1fd80 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
1fd90 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61  onstraints but a
1fda0 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63  n index is selec
1fdb0 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f  ted anyway, in o
1fdc0 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20  rder.    **     
1fdd0 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65      to force the
1fde0 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f   output order to
1fdf0 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f   conform to an O
1fe00 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20  RDER BY..    */ 
1fe10 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e   .    static con
1fe20 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d  st u8 aStartOp[]
1fe30 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20   = {.      0,.  
1fe40 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f      0,.      OP_
1fe50 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20  Rewind,         
1fe60 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f    /* 2: (!start_
1fe70 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
1fe80 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65 76  tartEq &&  !bRev
1fe90 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61  ) */.      OP_La
1fea0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1feb0 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 3: (!start_co
1fec0 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
1fed0 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20  rtEq &&   bRev) 
1fee0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1fef0 47 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Gt,           /*
1ff00 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   4: (start_const
1ff10 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
1ff20 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f  tEq && !bRev) */
1ff30 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74  .      OP_SeekLt
1ff40 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35  ,           /* 5
1ff50 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1ff60 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
1ff70 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20  q &&  bRev) */. 
1ff80 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20       OP_SeekGe, 
1ff90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20            /* 6: 
1ffa0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1ffb0 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
1ffc0 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
1ffd0 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20     OP_SeekLe    
1ffe0 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73          /* 7: (s
1fff0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
20000 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
20010 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d    bRev) */.    }
20020 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
20030 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d  st u8 aEndOp[] =
20040 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70   {.      OP_Noop
20050 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
20060 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72   0: (!end_constr
20070 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20  aints) */.      
20080 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20  OP_IdxGE,       
20090 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f       /* 1: (end_
200a0 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21  constraints && !
200b0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
200c0 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20 20 20  P_IdxLT         
200d0 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63      /* 2: (end_c
200e0 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 62 52  onstraints && bR
200f0 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  ev) */.    };.  
20100 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f    int nEq = pLoo
20110 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20  p->u.btree.nEq; 
20120 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
20130 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a   or IN terms */.
20140 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65      int isMinQue
20150 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
20160 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
20170 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45   an optimized SE
20180 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f  LECT min(x).. */
20190 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65  .    int regBase
201a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
201b0 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
201c0 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74  er holding const
201d0 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a  raint values */.
201e0 20 20 20 20 69 6e 74 20 72 31 3b 20 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 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65   /* Temp registe
20210 72 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  r */.    WhereTe
20220 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20  rm *pRangeStart 
20230 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c  = 0;  /* Inequal
20240 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
20250 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f  t range start */
20260 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
20270 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20  pRangeEnd = 0;  
20280 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
20290 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
202a0 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69  nge end */.    i
202b0 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20  nt startEq;     
202c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
202d0 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61  rue if range sta
202e0 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  rt uses ==, >= o
202f0 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
20300 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20  endEq;          
20310 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20320 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73   if range end us
20330 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
20340 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
20350 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20  _constraints;   
20360 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
20370 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61  range is constra
20380 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ined */.    int 
20390 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20  nConstraint;    
203a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
203b0 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  er of constraint
203c0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e   terms */.    In
203d0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
203e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
203f0 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20  e index we will 
20400 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20  be using */.    
20410 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20  int iIdxCur;    
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20430 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
20440 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
20450 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52  .    int nExtraR
20460 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
20470 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
20480 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e  xtra registers n
20490 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  eeded */.    int
204a0 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
204b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
204c0 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  truction opcode 
204d0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
204e0 61 72 74 41 66 66 3b 20 20 20 20 20 20 20 20 20  artAff;         
204f0 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
20500 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e  for start of ran
20510 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  ge constraint */
20520 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 41  .    char *zEndA
20530 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
20540 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
20550 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63  r end of range c
20560 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20  onstraint */..  
20570 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
20580 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
20590 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c      iIdxCur = pL
205a0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a  evel->iIdxCur;..
205b0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c      /* If this l
205c0 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20  oop satisfies a 
205d0 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64  sort order (pOrd
205e0 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68  erBy) request th
205f0 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70  at .    ** was p
20600 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
20610 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
20620 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
20630 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a  n(x) ..." .    *
20640 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68  * query, then th
20650 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e  e caller will on
20660 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f  ly allow the loo
20670 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20  p to run for.   
20680 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65   ** a single ite
20690 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  ration. This mea
206a0 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ns that the firs
206b0 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20  t row returned. 
206c0 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74     ** should not
206d0 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c   have a NULL val
206e0 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27  ue stored in 'x'
206f0 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20  . If column 'x' 
20700 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  is.    ** the fi
20710 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68  rst one after th
20720 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63  e nEq equality c
20730 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
20740 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20  e index,.    ** 
20750 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f  this requires so
20760 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  me special handl
20770 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
20780 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
20790 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
207a0 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20  DERBY_MIN)!=0.  
207b0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 62     && (pWInfo->b
207c0 4f 42 53 61 74 21 3d 30 29 0a 20 20 20 20 20 26  OBSat!=0).     &
207d0 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  & (pIdx->nColumn
207e0 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  >nEq).    ){.   
207f0 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f     /* assert( pO
20800 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31  rderBy->nExpr==1
20810 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20   ); */.      /* 
20820 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
20830 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[0].pExpr->iC
20840 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43  olumn==pIdx->aiC
20850 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f  olumn[nEq] ); */
20860 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72  .      isMinQuer
20870 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78  y = 1;.      nEx
20880 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
20890 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61  }..    /* Find a
208a0 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ny inequality co
208b0 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66  nstraint terms f
208c0 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  or the start and
208d0 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20   end .    ** of 
208e0 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20  the range. .    
208f0 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a  */.    j = nEq;.
20900 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
20910 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
20920 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
20930 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20    pRangeStart = 
20940 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
20950 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  +];.      nExtra
20960 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Reg = 1;.    }. 
20970 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
20980 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
20990 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  P_LIMIT ){.     
209a0 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f   pRangeEnd = pLo
209b0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
209c0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
209d0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
209e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
209f0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c  e to evaluate al
20a00 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  l constraint ter
20a10 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49  ms using == or I
20a20 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f  N.    ** and sto
20a30 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  re the values of
20a40 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20   those terms in 
20a50 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
20a60 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
20a70 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65  rting at regBase
20a80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67  ..    */.    reg
20a90 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71  Base = codeAllEq
20aa0 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72  ualityTerms(pPar
20ab0 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e  se,pLevel,bRev,n
20ac0 45 78 74 72 61 52 65 67 2c 26 7a 53 74 61 72 74  ExtraReg,&zStart
20ad0 41 66 66 29 3b 0a 20 20 20 20 7a 45 6e 64 41 66  Aff);.    zEndAf
20ae0 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  f = sqlite3DbStr
20af0 44 75 70 28 64 62 2c 20 7a 53 74 61 72 74 41 66  Dup(db, zStartAf
20b00 66 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20  f);.    addrNxt 
20b10 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
20b20 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  t;..    /* If we
20b30 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76   are doing a rev
20b40 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20  erse order scan 
20b50 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
20b60 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a  index, or.    **
20b70 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72   a forward order
20b80 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65   scan on a desce
20b90 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74  nding index, int
20ba0 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20  erchange the .  
20bb0 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65    ** start and e
20bc0 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65  nd terms (pRange
20bd0 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65  Start and pRange
20be0 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  End)..    */.   
20bf0 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e   if( (nEq<pIdx->
20c00 6e 43 6f 6c 75 6d 6e 20 26 26 20 62 52 65 76 3d  nColumn && bRev=
20c10 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  =(pIdx->aSortOrd
20c20 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f  er[nEq]==SQLITE_
20c30 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20 7c 7c  SO_ASC)).     ||
20c40 20 28 62 52 65 76 20 26 26 20 70 49 64 78 2d 3e   (bRev && pIdx->
20c50 6e 43 6f 6c 75 6d 6e 3d 3d 6e 45 71 29 0a 20 20  nColumn==nEq).  
20c60 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28    ){.      SWAP(
20c70 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61  WhereTerm *, pRa
20c80 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74  ngeEnd, pRangeSt
20c90 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  art);.    }..   
20ca0 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
20cb0 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e 67  eStart && (pRang
20cc0 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
20cd0 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b  r & WO_LE)!=0 );
20ce0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
20cf0 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28 70  RangeStart && (p
20d00 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
20d10 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d  rator & WO_GE)!=
20d20 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
20d30 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
20d40 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65  (pRangeEnd->eOpe
20d50 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d  rator & WO_LE)!=
20d60 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
20d70 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
20d80 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65  (pRangeEnd->eOpe
20d90 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d  rator & WO_GE)!=
20da0 30 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71  0 );.    startEq
20db0 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74 20   = !pRangeStart 
20dc0 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  || pRangeStart->
20dd0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
20de0 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65  LE|WO_GE);.    e
20df0 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65  ndEq =   !pRange
20e00 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64  End || pRangeEnd
20e10 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
20e20 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
20e30 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
20e40 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74  ts = pRangeStart
20e50 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20   || nEq>0;..    
20e60 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65  /* Seek the inde
20e70 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  x cursor to the 
20e80 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e  start of the ran
20e90 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73  ge. */.    nCons
20ea0 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
20eb0 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72    if( pRangeStar
20ec0 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  t ){.      Expr 
20ed0 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
20ee0 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52  Start->pExpr->pR
20ef0 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
20f00 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
20f10 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  se, pRight, regB
20f20 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
20f30 69 66 28 20 28 70 52 61 6e 67 65 53 74 61 72 74  if( (pRangeStart
20f40 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
20f50 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  _VNULL)==0 ){.  
20f60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20f70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
20f80 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  v, pRight, regBa
20f90 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29  se+nEq, addrNxt)
20fa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20fb0 69 66 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b  if( zStartAff ){
20fc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
20fd0 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
20fe0 69 74 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61  ity(pRight, zSta
20ff0 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c  rtAff[nEq])==SQL
21000 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20  ITE_AFF_NONE){. 
21010 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63           /* Sinc
21020 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
21030 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72   is to be perfor
21040 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76  med with no conv
21050 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20  ersions.        
21060 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20    ** applied to 
21070 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65  the operands, se
21080 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
21090 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68  o apply to pRigh
210a0 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20  t to .          
210b0 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
210c0 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  NE.  */.        
210d0 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d    zStartAff[nEq]
210e0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
210f0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
21100 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
21110 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
21120 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
21130 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71  t, zStartAff[nEq
21140 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
21150 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d  zStartAff[nEq] =
21160 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
21170 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21180 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e    }  .      nCon
21190 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
211a0 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
211b0 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
211c0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
211d0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
211e0 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20  isMinQuery ){.  
211f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21200 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
21210 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
21220 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
21230 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  aint++;.      st
21240 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  artEq = 0;.     
21250 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
21260 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
21270 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
21280 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
21290 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
212a0 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
212b0 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b    op = aStartOp[
212c0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
212d0 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45  ts<<2) + (startE
212e0 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20  q<<1) + bRev];. 
212f0 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30     assert( op!=0
21300 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
21310 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ( op==OP_Rewind 
21320 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
21330 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a   op==OP_Last );.
21340 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
21350 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20  ==OP_SeekGt );. 
21360 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
21370 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20  =OP_SeekGe );.  
21380 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
21390 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20  OP_SeekLe );.   
213a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
213b0 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20  P_SeekLt );.    
213c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
213d0 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
213e0 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
213f0 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
21400 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  nt);..    /* Loa
21410 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  d the value for 
21420 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
21430 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65  onstraint at the
21440 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
21450 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79  ** range (if any
21460 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43  )..    */.    nC
21470 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
21480 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45  .    if( pRangeE
21490 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
214a0 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
214b0 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69  eEnd->pExpr->pRi
214c0 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
214d0 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
214e0 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
214f0 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20  e+nEq, 1);.     
21500 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21510 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
21520 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
21530 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
21540 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
21550 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b  ERM_VNULL)==0 ){
21560 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21570 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
21580 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
21590 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
215a0 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
215b0 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29     if( zEndAff )
215c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
215d0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
215e0 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e  nity(pRight, zEn
215f0 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49  dAff[nEq])==SQLI
21600 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20  TE_AFF_NONE){.  
21610 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65          /* Since
21620 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
21630 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d  is to be perform
21640 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65  ed with no conve
21650 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20  rsions.         
21660 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74   ** applied to t
21670 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74  he operands, set
21680 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
21690 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74   apply to pRight
216a0 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a   to .          *
216b0 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
216c0 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  E.  */.         
216d0 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20   zEndAff[nEq] = 
216e0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
216f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21700 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
21710 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
21720 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
21730 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b  zEndAff[nEq]) ){
21740 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41  .          zEndA
21750 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
21760 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
21770 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20     }.      }  . 
21780 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66       codeApplyAf
21790 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
217a0 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a  egBase, nEq+1, z
217b0 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e  EndAff);.      n
217c0 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
217d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
217e0 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
217f0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
21800 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
21810 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
21820 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73  StartAff);.    s
21830 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
21840 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20   zEndAff);..    
21850 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f  /* Top of the lo
21860 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70  op body */.    p
21870 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69  Level->p2 = sqli
21880 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
21890 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  dr(v);..    /* C
218a0 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65  heck if the inde
218b0 78 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74  x cursor is past
218c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
218d0 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70  range. */.    op
218e0 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67   = aEndOp[(pRang
218f0 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28  eEnd || nEq) * (
21900 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20  1 + bRev)];.    
21910 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
21920 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65 73  _Noop );.    tes
21930 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
21940 78 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  xGE );.    testc
21950 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c  ase( op==OP_IdxL
21960 54 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 21  T );.    if( op!
21970 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
21980 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21990 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49  Op4Int(v, op, iI
219a0 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20  dxCur, addrNxt, 
219b0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
219c0 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  aint);.      sql
219d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
219e0 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 20  (v, endEq!=bRev 
219f0 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ?1:0);.    }..  
21a00 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
21a10 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
21a20 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20  straints, check 
21a30 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20  that the value. 
21a40 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62     ** of the tab
21a50 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  le column that t
21a60 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  he inequality co
21a70 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e  ntrains is not N
21a80 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69  ULL..    ** If i
21a90 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68  t is, jump to th
21aa0 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
21ab0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20   of the loop..  
21ac0 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71    */.    r1 = sq
21ad0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
21ae0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74 65 73  pParse);.    tes
21af0 74 63 61 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73  tcase( pLoop->ws
21b00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
21b10 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74  M_LIMIT );.    t
21b20 65 73 74 63 61 73 65 28 20 70 4c 6f 6f 70 2d 3e  estcase( pLoop->
21b30 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21b40 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20  TOP_LIMIT );.   
21b50 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
21b60 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54  lags & (WHERE_BT
21b70 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f  M_LIMIT|WHERE_TO
21b80 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b 0a  P_LIMIT))!=0 ){.
21b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21ba0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
21bb0 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e  lumn, iIdxCur, n
21bc0 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  Eq, r1);.      s
21bd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21be0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
21bf0 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  1, addrCont);.  
21c00 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52    }.    sqlite3R
21c10 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
21c20 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20  arse, r1);..    
21c30 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c  /* Seek the tabl
21c40 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71  e cursor, if req
21c50 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73  uired */.    dis
21c60 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
21c70 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
21c80 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
21c90 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64  Level, pRangeEnd
21ca0 29 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69 74  );.    if( !omit
21cb0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  Table ){.      i
21cc0 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65  RowidReg = iRele
21cd0 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33  aseReg = sqlite3
21ce0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
21cf0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
21d00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21d10 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
21d20 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
21d30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
21d40 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
21d50 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69  rse, iCur, -1, i
21d60 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
21d70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21d80 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69  p2(v, OP_Seek, i
21d90 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
21da0 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65    /* Deferred se
21db0 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  ek */.    }..   
21dc0 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69   /* Record the i
21dd0 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20  nstruction used 
21de0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
21df0 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a   loop. Disable .
21e00 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61      ** WHERE cla
21e10 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72  use terms made r
21e20 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20  edundant by the 
21e30 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e  index range scan
21e40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
21e50 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
21e60 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29  & WHERE_ONEROW )
21e70 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
21e80 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
21e90 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76    }else if( bRev
21ea0 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
21eb0 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a  ->op = OP_Prev;.
21ec0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21ed0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
21ee0 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _Next;.    }.   
21ef0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49   pLevel->p1 = iI
21f00 64 78 43 75 72 3b 0a 20 20 20 20 69 66 28 20 28  dxCur;.    if( (
21f10 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
21f20 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e   WHERE_CONSTRAIN
21f30 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  T)==0 ){.      p
21f40 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
21f50 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
21f60 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20  LLSCAN_STEP;.   
21f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
21f80 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
21f90 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ==0 );.    }.  }
21fa0 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
21fb0 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
21fc0 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
21fd0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
21fe0 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20   WHERE_MULTI_OR 
21ff0 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35  ){.    /* Case 5
22000 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73  :  Two or more s
22010 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78 65  eparately indexe
22020 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  d terms connecte
22030 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20  d by OR.    **. 
22040 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
22050 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43     **.    **   C
22060 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
22070 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20  ,b,c,d);.    ** 
22080 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
22090 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20  1 ON t1(a);.    
220a0 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
220b0 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20  X i2 ON t1(b);. 
220c0 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
220d0 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63 29  NDEX i3 ON t1(c)
220e0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
220f0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
22100 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52 20  t1 WHERE a=5 OR 
22110 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e 44  b=7 OR (c=11 AND
22120 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20   d=13).    **.  
22130 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d    ** In the exam
22140 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20 74  ple, there are t
22150 68 72 65 65 20 69 6e 64 65 78 65 64 20 74 65 72  hree indexed ter
22160 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ms connected by 
22170 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 74  OR..    ** The t
22180 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c  op of the loop l
22190 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
221a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
221b0 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
221c0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
221d0 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
221e0 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
221f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e    **.    ** Then
22200 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  , for each index
22210 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c  ed term, the fol
22220 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67 75  lowing. The argu
22230 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20  ments to.    ** 
22240 52 6f 77 53 65 74 54 65 73 74 20 61 72 65 20 73  RowSetTest are s
22250 75 63 68 20 74 68 61 74 20 74 68 65 20 72 6f 77  uch that the row
22260 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  id of the curren
22270 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65  t row is inserte
22280 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  d.    ** into th
22290 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74 20  e RowSet. If it 
222a0 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  is already prese
222b0 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70  nt, control skip
222c0 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73  s the.    ** Gos
222d0 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75  ub opcode and ju
222e0 6d 70 73 20 73 74 72 61 69 67 68 74 20 74 6f 20  mps straight to 
222f0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
22300 65 64 20 62 79 20 57 68 65 72 65 45 6e 64 28 29  ed by WhereEnd()
22310 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
22320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
22330 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29  ereBegin(<term>)
22340 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
22350 20 52 6f 77 53 65 74 54 65 73 74 20 20 20 20 20   RowSetTest     
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 49               # I
22370 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74 6f  nsert rowid into
22380 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20 20   rowset.    **  
22390 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 20 20          Gosub   
223a0 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20 20     2 A.    **   
223b0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
223c0 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20  eEnd().    **.  
223d0 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74    ** Following t
223e0 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20 74  he above, code t
223f0 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
22400 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74  loop. Label A, t
22410 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a  he target.    **
22420 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61 62   of the Gosub ab
22430 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68  ove, jumps to th
22440 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 69  e instruction ri
22450 67 68 74 20 61 66 74 65 72 20 74 68 65 20 47 6f  ght after the Go
22460 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  to..    **.    *
22470 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20  *          Null 
22480 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
22490 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68         # Zero th
224a0 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20  e rowset in reg 
224b0 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  1.    **        
224c0 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20 20    Goto       B  
224d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
224e0 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69  The loop is fini
224f0 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  shed..    **.   
22500 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f   **       A: <lo
22510 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20 20  op body>        
22520 20 20 20 20 20 20 20 20 20 23 20 52 65 74 75 72           # Retur
22530 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76 65 72  n data, whatever
22540 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
22550 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20           Return 
22560 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
22570 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63 6b       # Jump back
22580 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20 20   to the Gosub.  
22590 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
225a0 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65 20    B: <after the 
225b0 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20  loop>.    **.   
225c0 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61   */.    WhereCla
225d0 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f  use *pOrWc;    /
225e0 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20  * The OR-clause 
225f0 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20  broken out into 
22600 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  subterms */.    
22610 53 72 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b  SrcList *pOrTab;
22620 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65         /* Shorte
22630 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f  ned table list o
22640 72 20 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65  r OR-clause gene
22650 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e  ration */.    In
22660 64 65 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20  dex *pCov = 0;  
22670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
22680 74 65 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e 67  tential covering
22690 20 69 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29   index (or NULL)
226a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 76   */.    int iCov
226b0 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
226c0 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72  ab++;  /* Cursor
226d0 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 20   used for index 
226e0 73 63 61 6e 73 20 28 69 66 20 61 6e 79 29 20 2a  scans (if any) *
226f0 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65  /..    int regRe
22700 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
22710 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  >nMem;          
22720 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75 73 65   /* Register use
22730 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20  d with OP_Gosub 
22740 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f  */.    int regRo
22750 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20  wset = 0;       
22760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22770 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72   /* Register for
22780 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a   RowSet object *
22790 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  /.    int regRow
227a0 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  id = 0;         
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227c0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
227d0 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20  ing rowid */.   
227e0 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d   int iLoopBody =
227f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
22800 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74  Label(v);  /* St
22810 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79  art of loop body
22820 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74   */.    int iRet
22830 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
22840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22850 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
22860 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a  regReturn init *
22870 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74  /.    int untest
22880 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20  edTerms = 0;    
22890 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65           /* Some
228a0 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c   terms not compl
228b0 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a  etely tested */.
228c0 20 20 20 20 69 6e 74 20 69 69 3b 20 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 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
228f0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 45 78  ounter */.    Ex
22900 70 72 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30  pr *pAndExpr = 0
22910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22920 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28   /* An ".. AND (
22930 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e  ...)" expression
22940 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70 54 65 72   */.   .    pTer
22950 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  m = pLoop->aLTer
22960 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  m[0];.    assert
22970 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
22980 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
22990 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
229a0 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OR );.    assert
229b0 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
229c0 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  s & TERM_ORINFO)
229d0 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63  !=0 );.    pOrWc
229e0 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
229f0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c  Info->wc;.    pL
22a00 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65  evel->op = OP_Re
22a10 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  turn;.    pLevel
22a20 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e  ->p1 = regReturn
22a30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70  ;..    /* Set up
22a40 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
22a50 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e  n pOrTab contain
22a60 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65  ing the table be
22a70 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20  ing scanned.    
22a80 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20  ** by this loop 
22a90 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74  in the a[0] slot
22aa0 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64   and all notRead
22ab0 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e  y tables in a[1.
22ac0 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a  .] slots..    **
22ad0 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68   This becomes th
22ae0 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65  e SrcList in the
22af0 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20   recursive call 
22b00 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
22b10 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  egin()..    */. 
22b20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
22b30 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20  Level>1 ){.     
22b40 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20   int nNotReady; 
22b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b60 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
22b70 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
22b80 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
22b90 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f   SrcList_item *o
22ba0 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f  rigSrc;     /* O
22bb0 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20  riginal list of 
22bc0 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
22bd0 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e  nNotReady = pWIn
22be0 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65  fo->nLevel - iLe
22bf0 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  vel - 1;.      p
22c00 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53  OrTab = sqlite3S
22c10 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c  tackAllocRaw(db,
22c20 0a 20 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 73 69 7a               siz
22c40 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e  eof(*pOrTab)+ nN
22c50 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70  otReady*sizeof(p
22c60 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20  OrTab->a[0]));. 
22c70 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d       if( pOrTab=
22c80 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52  =0 ) return notR
22c90 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54  eady;.      pOrT
22ca0 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38  ab->nAlloc = (u8
22cb0 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29  )(nNotReady + 1)
22cc0 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
22cd0 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e  nSrc = pOrTab->n
22ce0 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d  Alloc;.      mem
22cf0 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70  cpy(pOrTab->a, p
22d00 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28  TabItem, sizeof(
22d10 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20  *pTabItem));.   
22d20 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49     origSrc = pWI
22d30 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
22d40 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b  ;.      for(k=1;
22d50 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b   k<=nNotReady; k
22d60 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ++){.        mem
22d70 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b  cpy(&pOrTab->a[k
22d80 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76  ], &origSrc[pLev
22d90 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69  el[k].iFrom], si
22da0 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b  zeof(pOrTab->a[k
22db0 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
22dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f   }else{.      pO
22dd0 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  rTab = pWInfo->p
22de0 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a  TabList;.    }..
22df0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
22e00 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67  e the rowset reg
22e10 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ister to contain
22e20 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55   NULL. An SQL NU
22e30 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71  LL is .    ** eq
22e40 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65  uivalent to an e
22e50 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20  mpty rowset..   
22e60 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20   **.    ** Also 
22e70 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65  initialize regRe
22e80 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20  turn to contain 
22e90 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
22ea0 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a  he instruction .
22eb0 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
22ec0 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
22ed0 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68   OP_Return at th
22ee0 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
22ef0 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a  loop. This.    *
22f00 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  * is required in
22f10 20 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c   a few obscure L
22f20 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77  EFT JOIN cases w
22f30 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d  here control jum
22f40 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  ps.    ** over t
22f50 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
22f60 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  op into the body
22f70 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20   of it. In this 
22f80 63 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  case the .    **
22f90 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73   correct respons
22fa0 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66  e for the end-of
22fb0 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20  -loop code (the 
22fc0 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f  OP_Return) is to
22fd0 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68   .    ** fall th
22fe0 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
22ff0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a  t instruction, j
23000 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78  ust as an OP_Nex
23010 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a  t does if.    **
23020 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e   called on an un
23030 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73  initialized curs
23040 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
23050 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
23060 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
23070 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30  UPLICATES_OK)==0
23080 20 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f 77   ){.      regRow
23090 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
230a0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52  nMem;.      regR
230b0 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
230c0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
230d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
230e0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
230f0 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a  gRowset);.    }.
23100 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20 73      iRetInit = s
23110 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23120 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
23130 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a  0, regReturn);..
23140 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 72      /* If the or
23150 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61  iginal WHERE cla
23160 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68 65 20  use is z of the 
23170 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20 78 32  form:  (x1 OR x2
23180 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20   OR ...) AND y. 
23190 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65     ** Then for e
231a0 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20 65 76  very term xN, ev
231b0 61 6c 75 61 74 65 20 61 73 20 74 68 65 20 73 75  aluate as the su
231c0 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20  bexpression: xN 
231d0 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61  AND z.    ** Tha
231e0 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69 6e 20  t way, terms in 
231f0 79 20 74 68 61 74 20 61 72 65 20 66 61 63 74 6f  y that are facto
23200 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64 69 73  red into the dis
23210 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20  junction will.  
23220 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64 20 75    ** be picked u
23230 70 20 62 79 20 74 68 65 20 72 65 63 75 72 73 69  p by the recursi
23240 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ve calls to sqli
23250 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
23260 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20  below..    **.  
23270 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65    ** Actually, e
23280 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f  ach subexpressio
23290 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74  n is converted t
232a0 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77 68 65  o "xN AND w" whe
232b0 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a 20 74  re w is.    ** t
232c0 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e 67 22  he "interesting"
232d0 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65   terms of z - te
232e0 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e 6f 74  rms that did not
232f0 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68   originate in th
23300 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55  e.    ** ON or U
23310 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  SING clause of a
23320 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20   LEFT JOIN, and 
23330 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 75  terms that are u
23340 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a  sable as .    **
23350 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a   indices..    **
23360 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 70 74  .    ** This opt
23370 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f 20 6f  imization also o
23380 6e 6c 79 20 61 70 70 6c 69 65 73 20 69 66 20 74  nly applies if t
23390 68 65 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20  he (x1 OR x2 OR 
233a0 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20 2a 2a  ...) term.    **
233b0 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
233c0 64 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  d in the ON clau
233d0 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
233e0 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 69  N..    ** See ti
233f0 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e  cket http://www.
23400 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69  sqlite.org/src/i
23410 6e 66 6f 2f 66 32 33 36 39 33 30 34 65 34 0a 20  nfo/f2369304e4. 
23420 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57     */.    if( pW
23430 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20  C->nTerm>1 ){.  
23440 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20      int iTerm;. 
23450 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d 3d 30       for(iTerm=0
23460 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54 65  ; iTerm<pWC->nTe
23470 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20  rm; iTerm++){.  
23480 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
23490 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d  r = pWC->a[iTerm
234a0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
234b0 20 69 66 28 20 26 70 57 43 2d 3e 61 5b 69 54 65   if( &pWC->a[iTe
234c0 72 6d 5d 20 3d 3d 20 70 54 65 72 6d 20 29 20 63  rm] == pTerm ) c
234d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
234e0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
234f0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
23500 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74 69  romJoin) ) conti
23510 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
23520 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77   pWC->a[iTerm].w
23530 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 4f  tFlags & (TERM_O
23540 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74 69 6e 75  RINFO) ) continu
23550 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
23560 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f  pWC->a[iTerm].eO
23570 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
23580 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
23590 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d  .        pExpr =
235a0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
235b0 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
235c0 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20         pAndExpr 
235d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
235e0 28 64 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70  (db, pAndExpr, p
235f0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
23600 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70       if( pAndExp
23610 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e  r ){.        pAn
23620 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  dExpr = sqlite3P
23630 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
23640 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45 78 70 72  AND, 0, pAndExpr
23650 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
23660 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d    }..    for(ii=
23670 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65  0; ii<pOrWc->nTe
23680 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  rm; ii++){.     
23690 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
236a0 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  erm = &pOrWc->a[
236b0 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ii];.      if( p
236c0 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
236d0 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72  or==iCur || (pOr
236e0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
236f0 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a  & WO_AND)!=0 ){.
23700 20 20 20 20 20 20 20 20 57 68 65 72 65 49 6e 66          WhereInf
23710 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20  o *pSubWInfo;   
23720 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66         /* Info f
23730 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72  or single OR-ter
23740 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  m scan */.      
23750 20 20 45 78 70 72 20 2a 70 4f 72 45 78 70 72 20    Expr *pOrExpr 
23760 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  = pOrTerm->pExpr
23770 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
23780 6e 64 45 78 70 72 20 26 26 20 21 45 78 70 72 48  ndExpr && !ExprH
23790 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72 45 78  asProperty(pOrEx
237a0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
237b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41   ){.          pA
237c0 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ndExpr->pLeft = 
237d0 70 4f 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20  pOrExpr;.       
237e0 20 20 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e     pOrExpr = pAn
237f0 64 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  dExpr;.        }
23800 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
23810 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65   through table e
23820 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63  ntries that matc
23830 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20  h term pOrTerm. 
23840 2a 2f 0a 20 20 20 20 20 20 20 20 70 53 75 62 57  */.        pSubW
23850 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
23860 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
23870 20 70 4f 72 54 61 62 2c 20 70 4f 72 45 78 70 72   pOrTab, pOrExpr
23880 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
23890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238a0 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
238b0 43 4c 4f 53 45 20 7c 20 57 48 45 52 45 5f 41 4e  CLOSE | WHERE_AN
238c0 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20  D_ONLY |.       
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238e0 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
238f0 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41  LE | WHERE_ONETA
23900 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43 75  BLE_ONLY, iCovCu
23910 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
23920 72 74 28 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c  rt( pSubWInfo ||
23930 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
23940 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
23950 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  d );.        if(
23960 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20   pSubWInfo ){.  
23970 20 20 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f          WhereLoo
23980 70 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a 20 20 20  p *pSubLoop;.   
23990 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e         explainOn
239a0 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 20  eScan(.         
239b0 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4f 72       pParse, pOr
239c0 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d  Tab, &pSubWInfo-
239d0 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70  >a[0], iLevel, p
239e0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a  Level->iFrom, 0.
239f0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
23a00 20 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e         if( (pWIn
23a10 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
23a20 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45   WHERE_DUPLICATE
23a30 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  S_OK)==0 ){.    
23a40 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 74          int iSet
23a50 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e   = ((ii==pOrWc->
23a60 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b  nTerm-1)?-1:ii);
23a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
23a80 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   r;.            
23a90 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  r = sqlite3ExprC
23aa0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
23ab0 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70  rse, pTabItem->p
23ac0 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a  Tab, -1, iCur, .
23ad0 20 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 72 65 67 52 6f 77 69           regRowi
23b00 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  d, 0);.         
23b10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23b20 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f  dOp4Int(v, OP_Ro
23b30 77 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77  wSetTest, regRow
23b40 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  set,.           
23b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23b70 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
23b80 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a 20 20 20  2, r, iSet);.   
23b90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23ba0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23bb0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
23bc0 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f  , regReturn, iLo
23bd0 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20  opBody);..      
23be0 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57      /* The pSubW
23bf0 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
23c00 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  rms flag means t
23c10 68 61 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d  hat this OR term
23c20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
23c30 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d  ntained one or m
23c40 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f  ore AND term fro
23c50 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62  m a notReady tab
23c60 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  le.  The.       
23c70 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d     ** terms from
23c80 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61   the notReady ta
23c90 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ble could not be
23ca0 20 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c   tested and will
23cb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  .          ** ne
23cc0 65 64 20 74 6f 20 62 65 20 74 65 73 74 65 64 20  ed to be tested 
23cd0 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20  later..         
23ce0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
23cf0 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74  ( pSubWInfo->unt
23d00 65 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74  estedTerms ) unt
23d10 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
23d20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
23d30 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63   all of the OR-c
23d40 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61  onnected terms a
23d50 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  re optimized usi
23d60 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  ng the same.    
23d70 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20        ** index, 
23d80 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 73  and the index is
23d90 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68   opened using th
23da0 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75  e same cursor nu
23db0 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  mber.          *
23dc0 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74  * by each call t
23dd0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
23de0 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68  gin() made by th
23df0 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a  is loop, it may.
23e00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
23e10 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
23e20 74 68 61 74 20 69 6e 64 65 78 20 61 73 20 61 20  that index as a 
23e30 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a  covering index..
23e40 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
23e50 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
23e60 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
23e70 57 68 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f  WhereBegin() abo
23e80 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61  ve resulted in a
23e90 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20   scan that.     
23ea0 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20       ** uses an 
23eb0 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20  index, and this 
23ec0 69 73 20 65 69 74 68 65 72 20 74 68 65 20 66 69  is either the fi
23ed0 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  rst OR-connected
23ee0 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
23ef0 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20  ** processed or 
23f00 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 68 65  the index is the
23f10 20 73 61 6d 65 20 61 73 20 74 68 61 74 20 75 73   same as that us
23f20 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f  ed by all previo
23f30 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
23f40 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20  terms, set pCov 
23f50 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  to the candidate
23f60 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
23f70 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
23f80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43  .          ** pC
23f90 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e  ov to NULL to in
23fa0 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63  dicate that no c
23fb0 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e  andidate coverin
23fc0 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20  g index will .  
23fd0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76          ** be av
23fe0 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20  ailable..       
23ff0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
24000 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57  pSubLoop = pSubW
24010 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
24020 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
24030 65 72 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e  ert( (pSubLoop->
24040 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
24050 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29  AUTO_INDEX)==0 )
24060 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
24070 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61  (pSubLoop->wsFla
24080 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
24090 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)!=0.         
240a0 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70    && (ii==0 || p
240b0 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  SubLoop->u.btree
240c0 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20  .pIndex==pCov). 
240d0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
240e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
240f0 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  pSubWInfo->a[0].
24100 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72  iIdxCur==iCovCur
24110 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
24120 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d  pCov = pSubLoop-
24130 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
24140 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
24150 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
24160 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ov = 0;.        
24170 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
24180 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f  * Finish the loo
24190 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  p through table 
241a0 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74  entries that mat
241b0 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e  ch term pOrTerm.
241c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
241d0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53  lite3WhereEnd(pS
241e0 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  ubWInfo);.      
241f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24200 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
24210 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a  pCovidx = pCov;.
24220 20 20 20 20 69 66 28 20 70 43 6f 76 20 29 20 70      if( pCov ) p
24230 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
24240 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66   iCovCur;.    if
24250 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
24260 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c      pAndExpr->pL
24270 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  eft = 0;.      s
24280 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
24290 28 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a  (db, pAndExpr);.
242a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
242b0 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
242c0 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74   iRetInit, sqlit
242d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
242e0 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  r(v));.    sqlit
242f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
24300 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
24310 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
24320 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
24330 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f  olveLabel(v, iLo
24340 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66  opBody);..    if
24350 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
24360 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74 61 63  >1 ) sqlite3Stac
24370 6b 46 72 65 65 28 64 62 2c 20 70 4f 72 54 61 62  kFree(db, pOrTab
24380 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65  );.    if( !unte
24390 73 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61  stedTerms ) disa
243a0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
243b0 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a  pTerm);.  }else.
243c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
243d0 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
243e0 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20  ATION */..  {.  
243f0 20 20 2f 2a 20 43 61 73 65 20 36 3a 20 20 54 68    /* Case 6:  Th
24400 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65  ere is no usable
24410 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74   index.  We must
24420 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20   do a complete. 
24430 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73     **          s
24440 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  can of the entir
24450 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
24460 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
24470 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20   u8 aStep[] = { 
24480 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76  OP_Next, OP_Prev
24490 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
244a0 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d  onst u8 aStart[]
244b0 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20   = { OP_Rewind, 
244c0 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61  OP_Last };.    a
244d0 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c  ssert( bRev==0 |
244e0 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20  | bRev==1 );.   
244f0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53   pLevel->op = aS
24500 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70  tep[bRev];.    p
24510 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
24520 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
24530 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
24540 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61  beAddOp2(v, aSta
24550 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20  rt[bRev], iCur, 
24560 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c  addrBrk);.    pL
24570 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54  evel->p5 = SQLIT
24580 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
24590 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a  LSCAN_STEP;.  }.
245a0 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64  .  /* Insert cod
245b0 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20  e to test every 
245c0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68  subexpression th
245d0 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  at can be comple
245e0 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74  tely.  ** comput
245f0 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 75 72  ed using the cur
24600 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c  rent set of tabl
24610 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  es..  */.  for(p
24620 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70  Term=pWC->a, j=p
24630 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20  WC->nTerm; j>0; 
24640 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j--, pTerm++){. 
24650 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
24660 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
24670 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
24680 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
24690 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
246a0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
246b0 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28  CODED );.    if(
246c0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
246d0 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
246e0 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
246f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
24700 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
24710 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  l & pLevel->notR
24720 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20  eady)!=0 ){.    
24730 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e    testcase( pWIn
24740 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
24750 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  s==0.           
24760 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
24770 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
24780 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
24790 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57  )!=0 );.      pW
247a0 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
247b0 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63  rms = 1;.      c
247c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
247d0 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70     pE = pTerm->p
247e0 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
247f0 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pE!=0 );.    i
24800 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
24810 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73  Join && !ExprHas
24820 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
24830 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
24840 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
24850 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
24860 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
24870 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20  , pE, addrCont, 
24880 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
24890 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77  L);.    pTerm->w
248a0 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
248b0 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ODED;.  }..  /* 
248c0 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74  Insert code to t
248d0 65 73 74 20 66 6f 72 20 69 6d 70 6c 69 65 64 20  est for implied 
248e0 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 61 73 65  constraints base
248f0 64 20 6f 6e 20 74 72 61 6e 73 69 74 69 76 69 74  d on transitivit
24900 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d  y.  ** of the "=
24910 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  =" operator..  *
24920 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20  *.  ** Example: 
24930 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
24940 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 22 74 31  use contains "t1
24950 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20 22 74 32  .a=t2.b" and "t2
24960 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64  .b=123".  ** and
24970 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 74   we are coding t
24980 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74  he t1 loop and t
24990 68 65 20 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e  he t2 loop has n
249a0 6f 74 20 79 65 74 20 63 6f 64 65 64 2c 0a 20 20  ot yet coded,.  
249b0 2a 2a 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f  ** then we canno
249c0 74 20 75 73 65 20 74 68 65 20 22 74 31 2e 61 3d  t use the "t1.a=
249d0 74 32 2e 62 22 20 63 6f 6e 73 74 72 61 69 6e 74  t2.b" constraint
249e0 2c 20 62 75 74 20 77 65 20 63 61 6e 20 63 6f 64  , but we can cod
249f0 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69  e.  ** the impli
24a00 65 64 20 22 74 31 2e 61 3d 31 32 33 22 20 63 6f  ed "t1.a=123" co
24a10 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20  nstraint..  */. 
24a20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
24a30 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, j=pWC->nTerm;
24a40 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d   j>0; j--, pTerm
24a50 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
24a60 45 2c 20 2a 70 45 41 6c 74 3b 0a 20 20 20 20 57  E, *pEAlt;.    W
24a70 68 65 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a  hereTerm *pAlt;.
24a80 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
24a90 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
24aa0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
24ab0 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
24ac0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
24ad0 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55  perator!=(WO_EQU
24ae0 49 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74  IV|WO_EQ) ) cont
24af0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
24b00 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
24b10 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
24b20 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
24b30 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63 6f  ->iLeftJoin ) co
24b40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d  ntinue;.    pE =
24b50 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
24b60 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
24b70 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
24b80 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a  EP_FromJoin) );.
24b90 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
24ba0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
24bb0 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61  & pLevel->notRea
24bc0 64 79 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 41  dy)!=0 );.    pA
24bd0 6c 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  lt = findTerm(pW
24be0 43 2c 20 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e  C, iCur, pTerm->
24bf0 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f  u.leftColumn, no
24c00 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  tReady, WO_EQ|WO
24c10 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  _IN, 0);.    if(
24c20 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69   pAlt==0 ) conti
24c30 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 41 6c  nue;.    if( pAl
24c40 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  t->wtFlags & (TE
24c50 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
24c60 69 6e 75 65 3b 0a 20 20 20 20 74 65 73 74 63 61  inue;.    testca
24c70 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61  se( pAlt->eOpera
24c80 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
24c90 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 6c     testcase( pAl
24ca0 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
24cb0 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 56 64 62 65  O_IN );.    Vdbe
24cc0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
24cd0 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76  "begin transitiv
24ce0 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b  e constraint"));
24cf0 0a 20 20 20 20 70 45 41 6c 74 20 3d 20 73 71 6c  .    pEAlt = sql
24d00 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61  ite3StackAllocRa
24d10 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45  w(db, sizeof(*pE
24d20 41 6c 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70  Alt));.    if( p
24d30 45 41 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  EAlt ){.      *p
24d40 45 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45  EAlt = *pAlt->pE
24d50 78 70 72 3b 0a 20 20 20 20 20 20 70 45 41 6c 74  xpr;.      pEAlt
24d60 2d 3e 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c  ->pLeft = pE->pL
24d70 65 66 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eft;.      sqlit
24d80 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
24d90 61 72 73 65 2c 20 70 45 41 6c 74 2c 20 61 64 64  arse, pEAlt, add
24da0 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
24db0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
24dc0 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65   sqlite3StackFre
24dd0 65 28 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20  e(db, pEAlt);.  
24de0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f    }.  }..  /* Fo
24df0 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  r a LEFT OUTER J
24e00 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  OIN, generate co
24e10 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63  de that will rec
24e20 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
24e30 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20  t.  ** at least 
24e40 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
24e50 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d  ight table has m
24e60 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20  atched the left 
24e70 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20  table.  .  */.  
24e80 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
24e90 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65  tJoin ){.    pLe
24ea0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d  vel->addrFirst =
24eb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
24ec0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
24ed0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24ee0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
24ef0 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   1, pLevel->iLef
24f00 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
24f10 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63  Comment((v, "rec
24f20 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69  ord LEFT JOIN hi
24f30 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t"));.    sqlite
24f40 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
24f50 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72  pParse);.    for
24f60 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
24f70 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d  =0; j<pWC->nTerm
24f80 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
24f90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24fa0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
24fb0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
24fc0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
24fd0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
24fe0 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
24ff0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
25000 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
25010 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
25020 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
25030 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
25040 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
25050 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
25060 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
25070 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
25080 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b  untestedTerms );
25090 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
250a0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
250b0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
250c0 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73  pExpr );.      s
250d0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
250e0 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  e(pParse, pTerm-
250f0 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74  >pExpr, addrCont
25100 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
25110 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72  ULL);.      pTer
25120 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
25130 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
25140 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
25150 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
25160 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  se, iReleaseReg)
25170 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 65 76  ;..  return pLev
25180 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a  el->notReady;.}.
25190 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
251a0 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
251b0 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c 6f   Print a WhereLo
251c0 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64 65  op object for de
251d0 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73  bugging purposes
251e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
251f0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57  whereLoopPrint(W
25200 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 53 72 63  hereLoop *p, Src
25210 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 29 7b  List *pTabList){
25220 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70  .  int nb = 1+(p
25230 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29  TabList->nSrc+7)
25240 2f 38 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  /8;.  struct Src
25250 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
25260 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b   = pTabList->a +
25270 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c   p->iTab;.  Tabl
25280 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  e *pTab = pItem-
25290 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  >pTab;.  sqlite3
252a0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 63 25  DebugPrintf("%c%
252b0 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78  2d.%0*llx.%0*llx
252c0 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20  ", p->cId,.     
252d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252e0 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e  p->iTab, nb, p->
252f0 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d  maskSelf, nb, p-
25300 3e 70 72 65 72 65 71 29 3b 0a 20 20 73 71 6c 69  >prereq);.  sqli
25310 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25320 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20 20   %12s",.        
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
25340 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74  em->zAlias ? pIt
25350 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61  em->zAlias : pTa
25360 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
25370 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
25380 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
25390 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  E)==0 ){.    if(
253a0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
253b0 65 78 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ex ){.      cons
253c0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
253d0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
253e0 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  x->zName;.      
253f0 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 7a  if( zName==0 ) z
25400 4e 61 6d 65 20 3d 20 22 69 70 6b 22 3b 0a 20 20  Name = "ipk";.  
25410 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
25420 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
25430 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d  utoindex_", 17)=
25440 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
25450 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t i = sqlite3Str
25460 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31  len30(zName) - 1
25470 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
25480 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29   zName[i]!='_' )
25490 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e   i--;.        zN
254a0 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20  ame += i;.      
254b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
254c0 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31  ebugPrintf(".%-1
254d0 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20  6s %2d", zName, 
254e0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b  p->u.btree.nEq);
254f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25500 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25510 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b  intf("%20s","");
25520 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
25530 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
25540 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69   if( p->u.vtab.i
25550 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a  dxStr ){.      z
25560 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
25570 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25  tf("(%d,\"%s\",%
25580 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x)",.           
25590 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
255a0 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
255b0 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74  .idxStr, p->u.vt
255c0 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
255d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
255e0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
255f0 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d  tf("(%d,%x)", p-
25600 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
25610 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
25620 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sk);.    }.    s
25630 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25640 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a  f(" %-19s", z);.
25650 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25660 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (z);.  }.  sqlit
25670 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
25680 66 20 25 30 34 78 20 4e 20 25 64 22 2c 20 70 2d  f %04x N %d", p-
25690 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54  >wsFlags, p->nLT
256a0 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  erm);.  sqlite3D
256b0 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73  ebugPrintf(" cos
256c0 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70  t %d,%d,%d\n", p
256d0 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
256e0 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 7d 0a 23  n, p->nOut);.}.#
256f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
25700 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79  vert bulk memory
25710 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57 68   into a valid Wh
25720 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e  ereLoop that can
25730 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f   be passed.** to
25740 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20   whereLoopClear 
25750 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73  harmlessly..*/.s
25760 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
25770 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c 6f  LoopInit(WhereLo
25780 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54  op *p){.  p->aLT
25790 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53  erm = p->aLTermS
257a0 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72  pace;.  p->nLTer
257b0 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  m = 0;.  p->nLSl
257c0 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70  ot = ArraySize(p
257d0 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a  ->aLTermSpace);.
257e0 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30    p->wsFlags = 0
257f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
25800 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75   the WhereLoop.u
25810 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57   union.  Leave W
25820 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20  hereLoop.pLTerm 
25830 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  intact..*/.stati
25840 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
25850 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74  ClearUnion(sqlit
25860 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
25870 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
25880 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
25890 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57 48  _VIRTUALTABLE|WH
258a0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20  ERE_AUTO_INDEX) 
258b0 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77  ){.    if( (p->w
258c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
258d0 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
258e0 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  && p->u.vtab.nee
258f0 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73  dFree ){.      s
25900 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 75  qlite3_free(p->u
25910 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
25920 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e       p->u.vtab.n
25930 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  eedFree = 0;.   
25940 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
25950 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Str = 0;.    }el
25960 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  se if( (p->wsFla
25970 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
25980 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d 3e  INDEX)!=0 && p->
25990 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d  u.btree.pIndex!=
259a0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
259b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
259c0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
259d0 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20  zColAff);.      
259e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
259f0 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
25a00 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75  dex);.      p->u
25a10 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
25a20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
25a30 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
25a40 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79   internal memory
25a50 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72 65   used by a Where
25a60 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
25a70 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
25a80 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65  LoopClear(sqlite
25a90 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
25aa0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61   *p){.  if( p->a
25ab0 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d  LTerm!=p->aLTerm
25ac0 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44  Space ) sqlite3D
25ad0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54  bFree(db, p->aLT
25ae0 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  erm);.  whereLoo
25af0 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20  pClearUnion(db, 
25b00 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49  p);.  whereLoopI
25b10 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nit(p);.}../*.**
25b20 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65   Increase the me
25b30 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
25b40 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  for pLoop->aLTer
25b50 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61  m[] to be at lea
25b60 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  st n..*/.static 
25b70 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  int whereLoopRes
25b80 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ize(sqlite3 *db,
25b90 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69   WhereLoop *p, i
25ba0 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65  nt n){.  WhereTe
25bb0 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66  rm **paNew;.  if
25bc0 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29  ( p->nLSlot>=n )
25bd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25be0 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e  K;.  n = (n+7)&~
25bf0 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c  7;.  paNew = sql
25c00 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
25c10 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  db, sizeof(p->aL
25c20 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69  Term[0])*n);.  i
25c30 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65  f( paNew==0 ) re
25c40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
25c50 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65  M;.  memcpy(paNe
25c60 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69  w, p->aLTerm, si
25c70 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
25c80 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20  ])*p->nLSlot);. 
25c90 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
25ca0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
25cb0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
25cc0 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
25cd0 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e   p->aLTerm = paN
25ce0 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20  ew;.  p->nLSlot 
25cf0 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = n;.  return SQ
25d00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25d10 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65  * Transfer conte
25d20 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  nt from the seco
25d30 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68  nd pLoop into th
25d40 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  e first..*/.stat
25d50 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
25d60 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Xfer(sqlite3 *db
25d70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f  , WhereLoop *pTo
25d80 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72  , WhereLoop *pFr
25d90 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  om){.  whereLoop
25da0 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70  ClearUnion(db, p
25db0 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65  To);.  if( where
25dc0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
25dd0 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72  To, pFrom->nLTer
25de0 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  m) ){.    memset
25df0 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a  (&pTo->u, 0, siz
25e00 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20  eof(pTo->u));.  
25e10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25e20 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
25e30 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20  cpy(pTo, pFrom, 
25e40 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f  WHERE_LOOP_XFER_
25e50 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  SZ);.  memcpy(pT
25e60 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d  o->aLTerm, pFrom
25e70 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e  ->aLTerm, pTo->n
25e80 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f  LTerm*sizeof(pTo
25e90 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20  ->aLTerm[0]));. 
25ea0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c   if( pFrom->wsFl
25eb0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
25ec0 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
25ed0 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65  pFrom->u.vtab.ne
25ee0 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  edFree = 0;.  }e
25ef0 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e  lse if( (pFrom->
25f00 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25f10 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
25f20 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62  {.    pFrom->u.b
25f30 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
25f40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
25f50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25f60 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72 65  * Delete a Where
25f70 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
25f80 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
25f90 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74  LoopDelete(sqlit
25fa0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
25fb0 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f  p *p){.  whereLo
25fc0 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a  opClear(db, p);.
25fd0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
25fe0 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
25ff0 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66   Free a WhereInf
26000 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73  o structure.*/.s
26010 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
26020 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33  InfoFree(sqlite3
26030 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20   *db, WhereInfo 
26040 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20  *pWInfo){.  if( 
26050 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29  ALWAYS(pWInfo) )
26060 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
26070 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e  eClear(&pWInfo->
26080 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  sWC);.    while(
26090 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
260a0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f  ){.      WhereLo
260b0 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  op *p = pWInfo->
260c0 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57  pLoops;.      pW
260d0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70  Info->pLoops = p
260e0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
260f0 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65     whereLoopDele
26100 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d  te(db, p);.    }
26110 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
26120 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
26130 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73    }.}../*.** Ins
26140 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61  ert or replace a
26150 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
26160 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c   using the templ
26170 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a  ate supplied..**
26180 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20  .** An existing 
26190 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20  WhereLoop entry 
261a0 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72 69  might be overwri
261b0 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20  tten if the new 
261c0 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62  template.** is b
261d0 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66 65  etter and has fe
261e0 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
261f0 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61  .  Or the templa
26200 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  te will be ignor
26210 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73  ed.** and no ins
26220 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69  ert will occur i
26230 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  f an existing Wh
26240 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65  ereLoop is faste
26250 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77  r and has.** few
26260 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
26270 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  than the templat
26280 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 20  e.  Otherwise a 
26290 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  new WhereLoop is
262a0 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64 20  .** added based 
262b0 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  on the template.
262c0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64  .**.** If pBuild
262d0 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f  er->pOrSet is no
262e0 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 6f  t NULL then we o
262f0 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 6f  nly care about o
26300 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65  nly the.** prere
26310 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75  quisites and rRu
26320 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73  n and nOut costs
26330 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c   of the N best l
26340 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69  oops.  That.** i
26350 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61  nformation is ga
26360 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42  thered in the pB
26370 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f  uilder->pOrSet o
26380 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65  bject.  This spe
26390 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69  cial.** processi
263a0 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
263b0 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75  only for OR clau
263c0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
263d0 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75  *.** When accumu
263e0 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  lating multiple 
263f0 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69  loops (when pBui
26400 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
26410 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c  NULL) we.** stil
26420 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  l might overwrit
26430 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20  e similar loops 
26440 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d  with the new tem
26450 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  plate if the.** 
26460 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74  template is bett
26470 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62  er.  Loops may b
26480 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
26490 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   the following .
264a0 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72  ** conditions ar
264b0 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  e met:.**.**    
264c0 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (1)  They have t
264d0 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a  he same iTab..**
264e0 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61      (2)  They ha
264f0 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72  ve the same iSor
26500 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20  tIdx..**    (3) 
26510 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
26520 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20  s same or fewer 
26530 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
26540 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
26550 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68  op.**    (4)  Th
26560 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74  e template has t
26570 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
26580 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63   cost than the c
26590 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20  urrent loop.**  
265a0 20 20 28 35 29 20 20 54 68 65 20 74 65 6d 70 6c    (5)  The templ
265b0 61 74 65 20 75 73 65 73 20 6d 6f 72 65 20 74 65  ate uses more te
265c0 72 6d 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  rms of the same 
265d0 69 6e 64 65 78 20 62 75 74 20 68 61 73 20 6e 6f  index but has no
265e0 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 20   additional.**  
265f0 20 20 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63         dependenc
26600 69 65 73 20 20 20 20 20 20 20 20 20 20 0a 2a 2f  ies          .*/
26610 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
26620 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72  eLoopInsert(Wher
26630 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
26640 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f  uilder, WhereLoo
26650 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20  p *pTemplate){. 
26660 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
26670 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65 78 74 20  rev, *p, *pNext 
26680 3d 20 30 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f  = 0;.  WhereInfo
26690 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
266a0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73  der->pWInfo;.  s
266b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
266c0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
266d0 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64  ..  /* If pBuild
266e0 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65  er->pOrSet is de
266f0 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79  fined, then only
26700 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   keep track of t
26710 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e  he costs.  ** an
26720 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a  d prereqs..  */.
26730 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
26740 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23 69 66  pOrSet!=0 ){.#if
26750 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
26760 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20 3d 20  LED.    u16 n = 
26770 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
26780 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ->n;.    int x =
26790 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65 72  .#endif.    wher
267a0 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64  eOrInsert(pBuild
267b0 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d  er->pOrSet, pTem
267c0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70  plate->prereq, p
267d0 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a  Template->rRun,.
267e0 20 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 70 54 65 6d 70 6c 61 74 65 2d 3e 6e      pTemplate->n
26810 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54  Out);.#if WHERET
26820 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
26830 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
26840 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
26850 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
26860 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f  ugPrintf(x?"   o
26870 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d  r-%d:  ":"   or-
26880 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20  X:  ", n);.     
26890 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
268a0 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66  pTemplate, pWInf
268b0 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  o->pTabList);.  
268c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
268d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
268e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
268f0 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
26900 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 6f  g WhereLoop to o
26910 76 65 72 77 72 69 74 65 2c 20 6f 72 20 77 68 69  verwrite, or whi
26920 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a 20 70 72  ch takes.  ** pr
26930 69 6f 72 69 74 79 20 6f 76 65 72 20 70 54 65 6d  iority over pTem
26940 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f  plate..  */.  fo
26950 72 28 70 70 50 72 65 76 3d 26 70 57 49 6e 66 6f  r(ppPrev=&pWInfo
26960 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70 50  ->pLoops, p=*ppP
26970 72 65 76 3b 20 70 3b 20 70 70 50 72 65 76 3d 26  rev; p; ppPrev=&
26980 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d  p->pNextLoop, p=
26990 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66  *ppPrev){.    if
269a0 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70  ( p->iTab!=pTemp
269b0 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d  late->iTab || p-
269c0 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70  >iSortIdx!=pTemp
269d0 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29  late->iSortIdx )
269e0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69  {.      /* If ei
269f0 74 68 65 72 20 74 68 65 20 69 54 61 62 20 6f 72  ther the iTab or
26a00 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73   iSortIdx values
26a10 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f   for two WhereLo
26a20 6f 70 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  op are different
26a30 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
26a40 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20  hose WhereLoops 
26a50 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69  need to be consi
26a60 64 65 72 65 64 20 73 65 70 61 72 61 74 65 6c 79  dered separately
26a70 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20  .  Neither is.  
26a80 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61      ** a candida
26a90 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68  te to replace th
26aa0 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  e other. */.    
26ab0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
26ac0 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20  }.    /* In the 
26ad0 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
26ae0 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74  tation, the rSet
26af0 75 70 20 76 61 6c 75 65 20 69 73 20 65 69 74 68  up value is eith
26b00 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f  er zero.    ** o
26b10 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75  r the cost of bu
26b20 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61  ilding an automa
26b30 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e  tic index (NlogN
26b40 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a  ) and the NlogN.
26b50 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61      ** is the sa
26b60 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c  me for compatibl
26b70 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f  e WhereLoops. */
26b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
26b90 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65  rSetup==0 || pTe
26ba0 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d  mplate->rSetup==
26bb0 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0 .             
26bc0 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70      || p->rSetup
26bd0 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  ==pTemplate->rSe
26be0 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77  tup );..    /* w
26bf0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
26c00 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61  () always genera
26c10 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20  tes and inserts 
26c20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
26c30 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  dex.    ** case 
26c40 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f  first.  Hence co
26c50 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61  mpatible candida
26c60 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65  te WhereLoops ne
26c70 76 65 72 20 68 61 76 65 20 61 20 6c 61 72 67 65  ver have a large
26c80 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e  r.    ** rSetup.
26c90 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50   Call this SETUP
26ca0 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20  -INVARIANT */.  
26cb0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65    assert( p->rSe
26cc0 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup>=pTemplate->
26cd0 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 69  rSetup );..    i
26ce0 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
26cf0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
26d00 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20 20  q)==p->prereq.  
26d10 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c     && p->rSetup<
26d20 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
26d30 75 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52  up.     && p->rR
26d40 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un<=pTemplate->r
26d50 52 75 6e 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e  Run.     && p->n
26d60 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Out<=pTemplate->
26d70 6e 4f 75 74 0a 20 20 20 20 29 7b 0a 20 20 20 20  nOut.    ){.    
26d80 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
26d90 20 74 61 6b 65 6e 20 77 68 65 6e 20 70 20 69 73   taken when p is
26da0 20 65 71 75 61 6c 20 6f 72 20 62 65 74 74 65 72   equal or better
26db0 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 20   than pTemplate 
26dc0 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  in .      ** all
26dd0 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64 65 6e   of (1) dependen
26de0 63 69 65 73 20 28 32 29 20 73 65 74 75 70 2d 63  cies (2) setup-c
26df0 6f 73 74 2c 20 28 33 29 20 72 75 6e 2d 63 6f 73  ost, (3) run-cos
26e00 74 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  t, and.      ** 
26e10 28 34 29 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  (4) number of ou
26e20 74 70 75 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20  tput rows. */.  
26e30 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
26e40 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65  Setup==pTemplate
26e50 2d 3e 72 53 65 74 75 70 20 29 3b 0a 20 20 20 20  ->rSetup );.    
26e60 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 3d    if( p->prereq=
26e70 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72  =pTemplate->prer
26e80 65 71 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e  eq.       && p->
26e90 6e 4c 54 65 72 6d 3c 70 54 65 6d 70 6c 61 74 65  nLTerm<pTemplate
26ea0 2d 3e 6e 4c 54 65 72 6d 0a 20 20 20 20 20 20 20  ->nLTerm.       
26eb0 26 26 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  && (p->wsFlags &
26ec0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c   pTemplate->wsFl
26ed0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
26ee0 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26  XED)!=0.       &
26ef0 26 20 28 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  & (p->u.btree.pI
26f00 6e 64 65 78 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  ndex==pTemplate-
26f10 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 0a  >u.btree.pIndex.
26f20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 65            || pTe
26f30 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2b 70 2d 3e  mplate->rRun+p->
26f40 6e 4c 54 65 72 6d 3c 3d 70 2d 3e 72 52 75 6e 2b  nLTerm<=p->rRun+
26f50 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72  pTemplate->nLTer
26f60 6d 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  m).      ){.    
26f70 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65      /* Overwrite
26f80 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
26f90 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 73  reLoop with an s
26fa0 69 6d 69 6c 61 72 20 6f 6e 65 20 74 68 61 74 20  imilar one that 
26fb0 75 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  uses.        ** 
26fc0 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68  more terms of th
26fd0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  e index */.     
26fe0 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
26ff0 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  extLoop;.       
27000 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
27010 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
27020 70 54 65 6d 70 6c 61 74 65 20 69 73 20 6e 6f 74  pTemplate is not
27030 20 68 65 6c 70 66 75 6c 2e 0a 20 20 20 20 20 20   helpful..      
27040 20 20 2a 2a 20 52 65 74 75 72 6e 20 77 69 74 68    ** Return with
27050 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 6f 72 20  out changing or 
27060 61 64 64 69 6e 67 20 61 6e 79 74 68 69 6e 67 20  adding anything 
27070 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  */.        goto 
27080 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f  whereLoopInsert_
27090 6e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  noop;.      }.  
270a0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e    }.    if( (p->
270b0 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
270c0 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65  te->prereq)==pTe
270d0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20  mplate->prereq. 
270e0 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d      && p->rRun>=
270f0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a  pTemplate->rRun.
27100 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e       && p->nOut>
27110 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74  =pTemplate->nOut
27120 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
27130 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78   Overwrite an ex
27140 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
27150 20 77 69 74 68 20 61 20 62 65 74 74 65 72 20 6f   with a better o
27160 6e 65 3a 20 6f 6e 65 20 74 68 61 74 20 69 73 0a  ne: one that is.
27170 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20        ** better 
27180 61 74 20 6f 6e 65 20 6f 66 20 28 31 29 20 64 65  at one of (1) de
27190 70 65 6e 64 65 6e 63 69 65 73 2c 20 28 32 29 20  pendencies, (2) 
271a0 73 65 74 75 70 2d 63 6f 73 74 2c 20 28 33 29 20  setup-cost, (3) 
271b0 72 75 6e 2d 63 6f 73 74 0a 20 20 20 20 20 20 2a  run-cost.      *
271c0 2a 20 6f 72 20 28 34 29 20 6e 75 6d 62 65 72 20  * or (4) number 
271d0 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2c 20  of output rows, 
271e0 61 6e 64 20 69 73 20 6e 6f 20 77 6f 72 73 65 20  and is no worse 
271f0 69 6e 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 0a  in any of those.
27200 20 20 20 20 20 20 2a 2a 20 63 61 74 65 67 6f 72        ** categor
27210 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ies. */.      as
27220 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e  sert( p->rSetup>
27230 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
27240 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49  up ); /* SETUP-I
27250 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a  NVARIANT above *
27260 2f 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  /.      pNext = 
27270 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
27280 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
27290 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
272a0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
272b0 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  t it means that 
272c0 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c  either p[] shoul
272d0 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  d be overwritten
272e0 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70  .  ** with pTemp
272f0 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78  late[] if p[] ex
27300 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e  ists, or if p==N
27310 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ULL then allocat
27320 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65  e a new.  ** Whe
27330 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72  reLoop and inser
27340 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57  t it..  */.#if W
27350 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
27360 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  D.  if( sqlite3W
27370 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
27380 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20  ){.    if( p!=0 
27390 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
273a0 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73  DebugPrintf("ins
273b0 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20  -del:  ");.     
273c0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
273d0 70 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  p, pWInfo->pTabL
273e0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
273f0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
27400 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22 29  tf("ins-new:  ")
27410 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50  ;.    whereLoopP
27420 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
27430 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
27440 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
27450 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
27460 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
27470 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
27480 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20  f(WhereLoop));. 
27490 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
274a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
274b0 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  M;.    whereLoop
274c0 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 77  Init(p);.  }.  w
274d0 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c  hereLoopXfer(db,
274e0 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a   p, pTemplate);.
274f0 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d    p->pNextLoop =
27500 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70 50 72 65   pNext;.  *ppPre
27510 76 20 3d 20 70 3b 0a 20 20 69 66 28 20 28 70 2d  v = p;.  if( (p-
27520 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27530 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
27540 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  0 ){.    Index *
27550 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74  pIndex = p->u.bt
27560 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
27570 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49  if( pIndex && pI
27580 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b  ndex->tnum==0 ){
27590 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
275a0 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
275b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
275c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
275d0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
275e0 68 65 20 69 6e 73 65 72 74 20 69 73 20 61 20 6e  he insert is a n
275f0 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65 4c 6f 6f  o-op */.whereLoo
27600 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a 0a 23 69  pInsert_noop:.#i
27610 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
27620 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
27630 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
27640 78 38 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  x8 ){.    sqlite
27650 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
27660 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20 20  s-noop: ");.    
27670 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
27680 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f  Template, pWInfo
27690 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 7d  ->pTabList);.  }
276a0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
276b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 7d 0a   SQLITE_OK;  .}.
276c0 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
276d0 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74  e WhereLoop.nOut
276e0 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72 64 20   value downward 
276f0 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
27700 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57  erms of the.** W
27710 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
27720 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 6c   reference the l
27730 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20 61 72  oop but which ar
27740 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20 61 6e  e not used by an
27750 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  .** index..**.**
27760 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
27770 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
27780 74 68 65 20 66 69 72 73 74 20 65 78 74 72 61 20  the first extra 
27790 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
277a0 6d 20 72 65 64 75 63 65 73 0a 2a 2a 20 74 68 65  m reduces.** the
277b0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
277c0 74 20 72 6f 77 73 20 62 79 20 61 20 66 61 63 74  t rows by a fact
277d0 6f 72 20 6f 66 20 31 30 20 61 6e 64 20 65 61 63  or of 10 and eac
277e0 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 74 65 72  h additional ter
277f0 6d 0a 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65  m.** reduces the
27800 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
27810 74 20 72 6f 77 73 20 62 79 20 73 71 72 74 28 32  t rows by sqrt(2
27820 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
27830 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75  d whereLoopOutpu
27840 74 41 64 6a 75 73 74 28 57 68 65 72 65 43 6c 61  tAdjust(WhereCla
27850 75 73 65 20 2a 70 57 43 2c 20 57 68 65 72 65 4c  use *pWC, WhereL
27860 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 69 6e 74 20  oop *pLoop, int 
27870 69 43 75 72 29 7b 0a 20 20 57 68 65 72 65 54 65  iCur){.  WhereTe
27880 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a  rm *pTerm, *pX;.
27890 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c    Bitmask notAll
278a0 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e  owed = ~(pLoop->
278b0 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61  prereq|pLoop->ma
278c0 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69  skSelf);.  int i
278d0 2c 20 6a 3b 0a 0a 20 20 69 66 28 20 21 4f 70 74  , j;..  if( !Opt
278e0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
278f0 28 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50  (pWC->pWInfo->pP
27900 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
27910 5f 41 64 6a 75 73 74 4f 75 74 45 73 74 29 20 29  _AdjustOutEst) )
27920 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
27930 7d 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e  }.  for(i=pWC->n
27940 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d  Term, pTerm=pWC-
27950 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54  >a; i>0; i--, pT
27960 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
27970 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
27980 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21  & TERM_VIRTUAL)!
27990 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
279a0 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
279b0 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d  eqAll & pLoop->m
279c0 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f  askSelf)==0 ) co
279d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
279e0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
279f0 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21  l & notAllowed)!
27a00 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
27a10 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e     for(j=pLoop->
27a20 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20  nLTerm-1; j>=0; 
27a30 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d  j--){.      pX =
27a40 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
27a50 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ];.      if( pX=
27a60 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a  =pTerm ) break;.
27a70 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50        if( pX->iP
27a80 61 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57  arent>=0 && (&pW
27a90 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74  C->a[pX->iParent
27aa0 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61  ])==pTerm ) brea
27ab0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
27ac0 20 6a 3c 30 20 29 20 70 4c 6f 6f 70 2d 3e 6e 4f   j<0 ) pLoop->nO
27ad0 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
27ae0 74 68 50 72 6f 62 3b 0a 20 20 7d 0a 7d 0a 0a 2f  thProb;.  }.}../
27af0 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20  *.** We have so 
27b00 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75 69  far matched pBui
27b10 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
27b20 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66  ree.nEq terms of
27b30 20 74 68 65 20 69 6e 64 65 78 20 70 49 6e 64 65   the index pInde
27b40 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 61 74  x..** Try to mat
27b50 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a  ch one more..**.
27b60 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e  ** If pProbe->tn
27b70 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e  um==0, that mean
27b80 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66 61  s pIndex is a fa
27b90 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66 6f  ke index used fo
27ba0 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  r the.** INTEGER
27bb0 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f   PRIMARY KEY..*/
27bc0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
27bd0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
27be0 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ex(.  WhereLoopB
27bf0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
27c00 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ,     /* The Whe
27c10 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a  reLoop factory *
27c20 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
27c30 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
27c40 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
27c50 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e  se term being an
27c60 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65  alyzed */.  Inde
27c70 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20 20  x *pProbe,      
27c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
27c90 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63 20  n index on pSrc 
27ca0 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e  */.  WhereCost n
27cb0 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20  InMul           
27cc0 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62       /* log(Numb
27cd0 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
27ce0 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29   due to IN) */.)
27cf0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
27d00 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
27d10 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48  ->pWInfo;  /* WH
27d20 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74  ERE analyse cont
27d30 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
27d40 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
27d50 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  >pParse;        
27d60 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
27d70 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
27d80 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
27d90 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
27da0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  ase connection m
27db0 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f  alloc context */
27dc0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
27dd0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
27de0 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57     /* Template W
27df0 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63  hereLoop under c
27e00 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
27e10 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
27e20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
27e30 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20   /* A WhereTerm 
27e40 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74  under considerat
27e50 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d  ion */.  int opM
27e60 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
27e70 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69           /* Vali
27e80 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20  d operators for 
27e90 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
27ea0 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b   WhereScan scan;
27eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ec0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
27ed0 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a   WHERE terms */.
27ee0 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64 5f    Bitmask saved_
27ef0 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20 20  prereq;         
27f00 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
27f10 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65  lue of pNew->pre
27f20 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  req */.  u16 sav
27f30 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20  ed_nLTerm;      
27f40 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
27f50 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
27f60 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20  ew->nLTerm */.  
27f70 69 6e 74 20 73 61 76 65 64 5f 6e 45 71 3b 20 20  int saved_nEq;  
27f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f90 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
27fa0 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72  e of pNew->u.btr
27fb0 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 33 32 20  ee.nEq */.  u32 
27fc0 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20  saved_wsFlags;  
27fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
27fe0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
27ff0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a   pNew->wsFlags *
28000 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 73 61  /.  WhereCost sa
28010 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20  ved_nOut;       
28020 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
28030 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
28040 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  Out */.  int iCo
28050 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
28060 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
28070 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
28080 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
28090 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
280a0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
280b0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
280c0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
280d0 6e 52 6f 77 45 73 74 3b 20 20 20 20 20 20 20 20  nRowEst;        
280e0 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74        /* Estimat
280f0 65 64 20 69 6e 64 65 78 20 73 65 6c 65 63 74 69  ed index selecti
28100 76 69 74 79 20 2a 2f 0a 20 20 57 68 65 72 65 43  vity */.  WhereC
28110 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  ost rLogSize;   
28120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
28130 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20  arithm of table 
28140 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  size */.  WhereT
28150 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a  erm *pTop = 0, *
28160 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70  pBtm = 0; /* Top
28170 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67   and bottom rang
28180 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
28190 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ..  pNew = pBuil
281a0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28  der->pNew;.  if(
281b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
281c0 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
281d0 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65  E_NOMEM;..  asse
281e0 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
281f0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
28200 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20  ALTABLE)==0 );. 
28210 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
28220 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28230 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b  TOP_LIMIT)==0 );
28240 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46  .  if( pNew->wsF
28250 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
28260 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70  _LIMIT ){.    op
28270 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f  Mask = WO_LT|WO_
28280 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
28290 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
282a0 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79  || (pSrc->jointy
282b0 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
282c0 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   ){.    opMask =
282d0 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
282e0 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
282f0 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  O_LE;.  }else{. 
28300 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
28310 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c  Q|WO_IN|WO_ISNUL
28320 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  L|WO_GT|WO_GE|WO
28330 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20  _LT|WO_LE;.  }. 
28340 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e   if( pProbe->bUn
28350 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b  ordered ) opMask
28360 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47   &= ~(WO_GT|WO_G
28370 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a  E|WO_LT|WO_LE);.
28380 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
28390 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50  >u.btree.nEq<=pP
283a0 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  robe->nColumn );
283b0 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 62  .  if( pNew->u.b
283c0 74 72 65 65 2e 6e 45 71 20 3c 20 70 50 72 6f 62  tree.nEq < pProb
283d0 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  e->nColumn ){.  
283e0 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d    iCol = pProbe-
283f0 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e  >aiColumn[pNew->
28400 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 20 20  u.btree.nEq];.  
28410 20 20 6e 52 6f 77 45 73 74 20 3d 20 77 68 65 72    nRowEst = wher
28420 65 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e 61 69  eCost(pProbe->ai
28430 52 6f 77 45 73 74 5b 70 4e 65 77 2d 3e 75 2e 62  RowEst[pNew->u.b
28440 74 72 65 65 2e 6e 45 71 2b 31 5d 29 3b 0a 20 20  tree.nEq+1]);.  
28450 20 20 69 66 28 20 6e 52 6f 77 45 73 74 3d 3d 30    if( nRowEst==0
28460 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72   && pProbe->onEr
28470 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 6e  ror==OE_None ) n
28480 52 6f 77 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65  RowEst = 1;.  }e
28490 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  lse{.    iCol = 
284a0 2d 31 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  -1;.    nRowEst 
284b0 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 0;.  }.  pTerm
284c0 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74   = whereScanInit
284d0 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72  (&scan, pBuilder
284e0 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75  ->pWC, pSrc->iCu
284f0 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20  rsor, iCol,.    
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28510 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f      opMask, pPro
28520 62 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45 71  be);.  saved_nEq
28530 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   = pNew->u.btree
28540 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4c  .nEq;.  saved_nL
28550 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54  Term = pNew->nLT
28560 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46  erm;.  saved_wsF
28570 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46  lags = pNew->wsF
28580 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72  lags;.  saved_pr
28590 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65  ereq = pNew->pre
285a0 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75  req;.  saved_nOu
285b0 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a  t = pNew->nOut;.
285c0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
285d0 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d   0;.  rLogSize =
285e0 20 65 73 74 4c 6f 67 28 77 68 65 72 65 43 6f 73   estLog(whereCos
285f0 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45  t(pProbe->aiRowE
28600 73 74 5b 30 5d 29 29 3b 0a 20 20 66 6f 72 28 3b  st[0]));.  for(;
28610 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
28620 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72  & pTerm!=0; pTer
28630 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  m = whereScanNex
28640 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 69  t(&scan)){.    i
28650 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64  nt nIn = 0;.#ifd
28660 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
28670 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
28680 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69      int nRecVali
28690 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
286a0 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a  ecValid;.#endif.
286b0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
286c0 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53  eOperator==WO_IS
286d0 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e  NULL || (pTerm->
286e0 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55  wtFlags&TERM_VNU
286f0 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  LL)!=0).     && 
28700 28 69 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63 2d  (iCol<0 || pSrc-
28710 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  >pTab->aCol[iCol
28720 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20 29  ].notNull).    )
28730 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
28740 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b  ; /* ignore IS [
28750 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  NOT] NULL constr
28760 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c  aints on NOT NUL
28770 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  L columns */.   
28780 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d   }.    if( pTerm
28790 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
287a0 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
287b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
287c0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
287d0 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
287e0 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  ;..    pNew->wsF
287f0 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
28800 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lags;.    pNew->
28810 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
28820 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65  ved_nEq;.    pNe
28830 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
28840 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66  d_nLTerm;.    if
28850 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
28860 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
28870 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72  ->nLTerm+1) ) br
28880 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20  eak; /* OOM */. 
28890 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
288a0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
288b0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65  = pTerm;.    pNe
288c0 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76  w->prereq = (sav
288d0 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72  ed_prereq | pTer
288e0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20  m->prereqRight) 
288f0 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  & ~pNew->maskSel
28900 66 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  f;.    pNew->rRu
28910 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 3b 20 2f 2a  n = rLogSize; /*
28920 20 42 61 73 65 6c 69 6e 65 20 63 6f 73 74 20 69   Baseline cost i
28930 73 20 6c 6f 67 32 28 4e 29 2e 20 20 41 64 6a 75  s log2(N).  Adju
28940 73 74 6d 65 6e 74 73 20 62 65 6c 6f 77 20 2a 2f  stments below */
28950 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
28960 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
28970 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N ){.      Expr 
28980 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
28990 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
289a0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
289b0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
289c0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
289d0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
289e0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
289f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
28a00 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a  N (SELECT ...)":
28a10 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45    TUNING: the SE
28a20 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20  LECT returns 25 
28a30 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rows */.        
28a40 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72  nIn = 46;  asser
28a50 74 28 20 34 36 3d 3d 77 68 65 72 65 43 6f 73 74  t( 46==whereCost
28a60 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d 65  (25) );.      }e
28a70 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
28a80 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26  Expr->x.pList &&
28a90 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
28aa0 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
28ab0 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c     /* "x IN (val
28ac0 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22  ue, value, ...)"
28ad0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
28ae0 3d 20 77 68 65 72 65 43 6f 73 74 28 70 45 78 70  = whereCost(pExp
28af0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
28b00 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
28b10 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20    pNew->rRun += 
28b20 6e 49 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  nIn;.      pNew-
28b30 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
28b40 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
28b50 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e   = nRowEst + nIn
28b60 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d  Mul + nIn;.    }
28b70 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
28b80 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
28b90 45 51 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  EQ) ){.      ass
28ba0 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c  ert( (pNew->wsFl
28bb0 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
28bc0 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43  UMN_NULL|WHERE_C
28bd0 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 30 0a 20 20  OLUMN_IN))!=0.  
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bf0 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30 20 29 3b 0a  || nInMul==0 );.
28c00 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
28c10 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
28c20 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66  UMN_EQ;.      if
28c30 28 20 69 43 6f 6c 3c 30 20 20 0a 20 20 20 20 20  ( iCol<0  .     
28c40 20 20 7c 7c 20 28 70 50 72 6f 62 65 2d 3e 6f 6e    || (pProbe->on
28c50 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26  Error!=OE_None &
28c60 26 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20  & nInMul==0.    
28c70 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e         && pNew->
28c80 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50 72  u.btree.nEq==pPr
28c90 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 29 0a  obe->nColumn-1).
28ca0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
28cb0 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
28cc0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28cd0 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 7c 7c  COLUMN_IN)==0 ||
28ce0 20 69 43 6f 6c 3c 30 20 29 3b 0a 20 20 20 20 20   iCol<0 );.     
28cf0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
28d00 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57   |= WHERE_ONEROW
28d10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28d20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28d30 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  q++;.      pNew-
28d40 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20  >nOut = nRowEst 
28d50 2b 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20 7d 65  + nInMul;.    }e
28d60 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  lse if( pTerm->e
28d70 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
28d80 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  SNULL) ){.      
28d90 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
28da0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
28db0 4c 4c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  LL;.      pNew->
28dc0 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20  u.btree.nEq++;. 
28dd0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
28de0 49 53 20 4e 55 4c 4c 20 73 65 6c 65 63 74 73 20  IS NULL selects 
28df0 32 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  2 rows */.      
28e00 6e 49 6e 20 3d 20 31 30 3b 20 20 61 73 73 65 72  nIn = 10;  asser
28e10 74 28 20 31 30 3d 3d 77 68 65 72 65 43 6f 73 74  t( 10==whereCost
28e20 28 32 29 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  (2) );.      pNe
28e30 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73  w->nOut = nRowEs
28e40 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e  t + nInMul + nIn
28e50 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
28e60 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
28e70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
28e80 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
28e90 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
28ea0 61 74 6f 72 20 26 20 57 4f 5f 47 54 20 29 3b 0a  ator & WO_GT );.
28eb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28ec0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
28ed0 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
28ee0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
28ef0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
28f00 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f  RANGE|WHERE_BTM_
28f10 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 42 74  LIMIT;.      pBt
28f20 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  m = pTerm;.     
28f30 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d   pTop = 0;.    }
28f40 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
28f50 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
28f60 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ator & (WO_LT|WO
28f70 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65  _LE) );.      te
28f80 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
28f90 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 54  Operator & WO_LT
28fa0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28fb0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
28fc0 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a  ator & WO_LE );.
28fd0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
28fe0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
28ff0 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
29000 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
29010 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20   pTop = pTerm;. 
29020 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65       pBtm = (pNe
29030 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
29040 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30  RE_BTM_LIMIT)!=0
29050 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
29060 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c          pNew->aL
29070 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
29080 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a  m-2] : 0;.    }.
29090 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
290a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
290b0 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
290c0 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f      /* Adjust nO
290d0 75 74 20 61 6e 64 20 72 52 75 6e 20 66 6f 72 20  ut and rRun for 
290e0 53 54 41 54 33 20 72 61 6e 67 65 20 76 61 6c 75  STAT3 range valu
290f0 65 73 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  es */.      asse
29100 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
29110 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20  saved_nOut );.  
29120 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63      whereRangeSc
29130 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
29140 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54  uilder, pBtm, pT
29150 6f 70 2c 20 26 70 4e 65 77 2d 3e 6e 4f 75 74 29  op, &pNew->nOut)
29160 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
29170 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
29180 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
29190 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20  if( nInMul==0 . 
291a0 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e      && pProbe->n
291b0 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 26 26 20  Sample .     && 
291c0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
291d0 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70  q<=pProbe->nSamp
291e0 6c 65 43 6f 6c 0a 20 20 20 20 20 26 26 20 4f 70  leCol.     && Op
291f0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
29200 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61  d(db, SQLITE_Sta
29210 74 33 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  t3) .    ){.    
29220 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
29230 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
29240 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74      tRowcnt nOut
29250 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
29260 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
29270 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
29280 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20  NULL))!=0 ){.   
29290 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
292a0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
292b0 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
292c0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
292d0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
292e0 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
292f0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45       rc = whereE
29300 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
29310 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45  se, pBuilder, pE
29320 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f  xpr->pRight, &nO
29330 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ut);.      }else
29340 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
29350 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 0a  erator & WO_IN).
29360 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
29370 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
29380 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
29390 65 6c 65 63 74 29 20 20 29 7b 0a 20 20 20 20 20  elect)  ){.     
293a0 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53     rc = whereInS
293b0 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
293c0 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e  Builder, pExpr->
293d0 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b  x.pList, &nOut);
293e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
293f0 73 73 65 72 74 28 20 6e 4f 75 74 3d 3d 30 20 7c  ssert( nOut==0 |
29400 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
29410 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 75  );.      if( nOu
29420 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 75  t ){.        nOu
29430 74 20 3d 20 77 68 65 72 65 43 6f 73 74 28 6e 4f  t = whereCost(nO
29440 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ut);.        pNe
29450 77 2d 3e 6e 4f 75 74 20 3d 20 4d 49 4e 28 6e 4f  w->nOut = MIN(nO
29460 75 74 2c 20 73 61 76 65 64 5f 6e 4f 75 74 29 3b  ut, saved_nOut);
29470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
29480 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70  endif.    if( (p
29490 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
294a0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
294b0 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b  HERE_IPK))==0 ){
294c0 0a 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 72  .      /* Each r
294d0 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61 20 73 74  ow involves a st
294e0 65 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ep of the index,
294f0 20 74 68 65 6e 20 61 20 62 69 6e 61 72 79 20 73   then a binary s
29500 65 61 72 63 68 20 6f 66 0a 20 20 20 20 20 20 2a  earch of.      *
29510 2a 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  * the main table
29520 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
29530 72 52 75 6e 20 3d 20 20 77 68 65 72 65 43 6f 73  rRun =  whereCos
29540 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
29550 20 72 4c 6f 67 53 69 7a 65 3e 32 37 20 3f 20 72   rLogSize>27 ? r
29560 4c 6f 67 53 69 7a 65 2d 31 37 20 3a 20 31 30 29  LogSize-17 : 10)
29570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 53  ;.    }.    /* S
29580 74 65 70 20 63 6f 73 74 20 66 6f 72 20 65 61 63  tep cost for eac
29590 68 20 6f 75 74 70 75 74 20 72 6f 77 20 2a 2f 0a  h output row */.
295a0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
295b0 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 70 4e   whereCostAdd(pN
295c0 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e  ew->rRun, pNew->
295d0 6e 4f 75 74 29 3b 0a 20 20 20 20 77 68 65 72 65  nOut);.    where
295e0 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
295f0 28 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20  (pBuilder->pWC, 
29600 70 4e 65 77 2c 20 70 53 72 63 2d 3e 69 43 75 72  pNew, pSrc->iCur
29610 73 6f 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  sor);.    rc = w
29620 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
29630 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
29640 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77      if( (pNew->w
29650 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
29660 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20  OP_LIMIT)==0.   
29670 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
29680 65 65 2e 6e 45 71 3c 28 70 50 72 6f 62 65 2d 3e  ee.nEq<(pProbe->
29690 6e 43 6f 6c 75 6d 6e 20 2b 20 28 70 50 72 6f 62  nColumn + (pProb
296a0 65 2d 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a 20 20  e->zName!=0)).  
296b0 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65    ){.      where
296c0 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
296d0 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
296e0 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c  , pProbe, nInMul
296f0 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  +nIn);.    }.   
29700 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
29710 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66  ved_nOut;.#ifdef
29720 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
29730 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
29740 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
29750 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69  Valid = nRecVali
29760 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  d;.#endif.  }.  
29770 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
29780 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70  aved_prereq;.  p
29790 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
297a0 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
297b0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
297c0 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
297d0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
297e0 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ved_nOut;.  pNew
297f0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
29800 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75 72  _nLTerm;.  retur
29810 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
29820 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74  eturn True if it
29830 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
29840 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62  t pIndex might b
29850 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69  e useful in.** i
29860 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  mplementing the 
29870 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
29880 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a  in pBuilder..**.
29890 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20  ** Return False 
298a0 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73  if pBuilder does
298b0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20   not contain an 
298c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
298d0 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  or.** if there i
298e0 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e  s no way for pIn
298f0 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c  dex to be useful
29900 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   in implementing
29910 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42   that.** ORDER B
29920 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61  Y clause..*/.sta
29930 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67  tic int indexMig
29940 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42  htHelpWithOrderB
29950 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  y(.  WhereLoopBu
29960 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
29970 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
29980 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a  ,.  int iCursor.
29990 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
299a0 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a  OB;.  int ii, jj
299b0 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d  ;..  if( pIndex-
299c0 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65  >bUnordered ) re
299d0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
299e0 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  OB = pBuilder->p
299f0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29  WInfo->pOrderBy)
29a00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
29a10 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
29a20 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  OB->nExpr; ii++)
29a30 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
29a40 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
29a50 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e  kipCollate(pOB->
29a60 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  a[ii].pExpr);.  
29a70 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
29a80 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
29a90 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
29aa0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43  Expr->iTable==iC
29ab0 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 66  ursor ){.      f
29ac0 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
29ad0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 6a 2b  ex->nColumn; jj+
29ae0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
29af0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
29b00 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
29b10 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b  [jj] ) return 1;
29b20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29b30 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
29b40 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
29b50 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31   bitmask where 1
29b60 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
29b70 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
29b80 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  g column of.** t
29b90 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64  he table is used
29ba0 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f   by an index.  O
29bb0 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33  nly the first 63
29bc0 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e   columns are con
29bd0 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  sidered..*/.stat
29be0 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d  ic Bitmask colum
29bf0 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20  nsInIndex(Index 
29c00 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73  *pIdx){.  Bitmas
29c10 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  k m = 0;.  int j
29c20 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e  ;.  for(j=pIdx->
29c30 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b  nColumn-1; j>=0;
29c40 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78   j--){.    int x
29c50 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
29c60 6e 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  n[j];.    assert
29c70 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 74 65  ( x>=0 );.    te
29c80 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31  stcase( x==BMS-1
29c90 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
29ca0 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  ( x==BMS-2 );.  
29cb0 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20    if( x<BMS-1 ) 
29cc0 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b  m |= MASKBIT(x);
29cd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
29ce0 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
29cf0 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
29d00 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
29d10 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
29d20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
29d30 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
29d40 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
29d50 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
29d60 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
29d70 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
29d80 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
29d90 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
29da0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
29db0 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
29dc0 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
29dd0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f 72  rm *pTerm;.  for
29de0 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  (i=0, pTerm=pWC-
29df0 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
29e00 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
29e10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
29e20 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
29e30 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70 57  pTerm->pExpr, pW
29e40 68 65 72 65 2c 20 69 54 61 62 29 20 29 20 72 65  here, iTab) ) re
29e50 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
29e60 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
29e70 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
29e80 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
29e90 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66   single table of
29ea0 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20   the join where 
29eb0 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  the table.** is 
29ec0 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69  idenfied by pBui
29ed0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
29ee0 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
29ef0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
29f00 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61  e.** a b-tree ta
29f10 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75  ble, not a virtu
29f20 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
29f30 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
29f40 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65  pAddBtree(.  Whe
29f50 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
29f60 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52  Builder, /* WHER
29f70 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
29f80 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
29f90 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20  k mExtra        
29fa0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
29fb0 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72  rerequesites for
29fc0 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c   using this tabl
29fd0 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
29fe0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
29ff0 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
2a000 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
2a010 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
2a020 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
2a030 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
2a040 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
2a050 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20  /.  Index sPk;  
2a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a070 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20  /* A fake index 
2a080 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70  object for the p
2a090 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
2a0a0 74 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73 74  tRowcnt aiRowEst
2a0b0 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54  Pk[2];      /* T
2a0c0 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61  he aiRowEst[] va
2a0d0 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
2a0e0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61  index */.  int a
2a0f0 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20  iColumnPk = -1; 
2a100 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43         /* The aC
2a110 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f  olumn[] value fo
2a120 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
2a130 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
2a140 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
2a150 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
2a160 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
2a170 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
2a180 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc;  /* The FROM
2a190 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65   clause btree te
2a1a0 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57  rm to add */.  W
2a1b0 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
2a1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
2a1d0 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
2a1e0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
2a1f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a200 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2a210 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2a220 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20   iSortIdx = 1;  
2a230 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2a240 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  x number */.  in
2a250 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  t b;            
2a260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62            /* A b
2a270 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a  oolean value */.
2a280 20 20 57 68 65 72 65 43 6f 73 74 20 72 53 69 7a    WhereCost rSiz
2a290 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2a2a0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
2a2b0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
2a2c0 20 20 57 68 65 72 65 43 6f 73 74 20 72 4c 6f 67    WhereCost rLog
2a2d0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Size;         /*
2a2e0 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   Logarithm of th
2a2f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
2a300 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
2a310 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2a320 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pWC;           /
2a330 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45  * The parsed WHE
2a340 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 0a  RE clause */.  .
2a350 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
2a360 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66  r->pNew;.  pWInf
2a370 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
2a380 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74  Info;.  pTabList
2a390 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2a3a0 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70 54  ist;.  pSrc = pT
2a3b0 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77  abList->a + pNew
2a3c0 2d 3e 69 54 61 62 3b 0a 20 20 70 57 43 20 3d 20  ->iTab;.  pWC = 
2a3d0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
2a3e0 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74   assert( !IsVirt
2a3f0 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20  ual(pSrc->pTab) 
2a400 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  );..  if( pSrc->
2a410 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  pIndex ){.    /*
2a420 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
2a430 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
2a440 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
2a450 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
2a460 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
2a470 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b  pIndex;.  }else{
2a480 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73  .    /* There is
2a490 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63   no INDEXED BY c
2a4a0 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61  lause.  Create a
2a4b0 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65   fake Index obje
2a4c0 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20  ct in local.    
2a4d0 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20  ** variable sPk 
2a4e0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  to represent the
2a4f0 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b   rowid primary k
2a500 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  ey index.  Make 
2a510 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65  this.    ** fake
2a520 20 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74   index the first
2a530 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49   in a chain of I
2a540 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74  ndex objects wit
2a550 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61  h all of the rea
2a560 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73  l.    ** indices
2a570 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20   to follow */.  
2a580 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b    Index *pFirst;
2a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5a0 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65    /* First of re
2a5b0 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  al indices on th
2a5c0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d  e table */.    m
2a5d0 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73  emset(&sPk, 0, s
2a5e0 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20  izeof(Index));. 
2a5f0 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d     sPk.nColumn =
2a600 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f   1;.    sPk.aiCo
2a610 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e  lumn = &aiColumn
2a620 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f  Pk;.    sPk.aiRo
2a630 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50  wEst = aiRowEstP
2a640 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72  k;.    sPk.onErr
2a650 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  or = OE_Replace;
2a660 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20  .    sPk.pTable 
2a670 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
2a680 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20    aiRowEstPk[0] 
2a690 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52  = pSrc->pTab->nR
2a6a0 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77  owEst;.    aiRow
2a6b0 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20  EstPk[1] = 1;.  
2a6c0 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d    pFirst = pSrc-
2a6d0 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
2a6e0 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74     if( pSrc->not
2a6f0 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20  Indexed==0 ){.  
2a700 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20      /* The real 
2a710 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74  indices of the t
2a720 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f  able are only co
2a730 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a  nsidered if the.
2a740 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44        ** NOT IND
2a750 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69  EXED qualifier i
2a760 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  s omitted from t
2a770 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
2a780 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78  /.      sPk.pNex
2a790 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20  t = pFirst;.    
2a7a0 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26  }.    pProbe = &
2a7b0 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65  sPk;.  }.  rSize
2a7c0 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70 53 72   = whereCost(pSr
2a7d0 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  c->pTab->nRowEst
2a7e0 29 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  );.  rLogSize = 
2a7f0 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a  estLog(rSize);..
2a800 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a810 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
2a820 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74  DEX.  /* Automat
2a830 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  ic indexes */.  
2a840 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70  if( !pBuilder->p
2a850 4f 72 53 65 74 0a 20 20 20 26 26 20 28 70 57 49  OrSet.   && (pWI
2a860 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  nfo->pParse->db-
2a870 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2a880 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20  AutoIndex)!=0.  
2a890 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65 78   && pSrc->pIndex
2a8a0 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63 2d  ==0.   && !pSrc-
2a8b0 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20  >viaCoroutine.  
2a8c0 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e   && !pSrc->notIn
2a8d0 64 65 78 65 64 0a 20 20 20 26 26 20 21 70 53 72  dexed.   && !pSr
2a8e0 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 0a  c->isCorrelated.
2a8f0 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65    ){.    /* Gene
2a900 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20  rate auto-index 
2a910 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20  WhereLoops */.  
2a920 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2a930 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  rm;.    WhereTer
2a940 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d  m *pWCEnd = pWC-
2a950 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b  >a + pWC->nTerm;
2a960 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
2a970 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54  WC->a; rc==SQLIT
2a980 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57  E_OK && pTerm<pW
2a990 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
2a9a0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
2a9b0 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
2a9c0 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
2a9d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2a9e0 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
2a9f0 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
2aa00 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 0) ){.       
2aa10 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
2aa20 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  Eq = 1;.        
2aa30 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
2aa40 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
2aa50 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2aa60 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
2aa70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
2aa80 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  erm;.        /* 
2aa90 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65  TUNING: One-time
2aaa0 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74   cost for comput
2aab0 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ing the automati
2aac0 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20  c index is.     
2aad0 20 20 20 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74     ** approximat
2aae0 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32 28 4e 29 20  ely 7*N*log2(N) 
2aaf0 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
2ab00 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
2ab10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2ab20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
2ab30 78 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  xed. */.        
2ab40 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72  pNew->rSetup = r
2ab50 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20  LogSize + rSize 
2ab60 2b 20 32 38 3b 20 20 61 73 73 65 72 74 28 20 32  + 28;  assert( 2
2ab70 38 3d 3d 77 68 65 72 65 43 6f 73 74 28 37 29 20  8==whereCost(7) 
2ab80 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  );.        /* TU
2ab90 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78  NING: Each index
2aba0 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32   lookup yields 2
2abb0 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  0 rows in the ta
2abc0 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20  ble.  This.     
2abd0 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68     ** is more th
2abe0 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65  an the usual gue
2abf0 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73  ss of 10 rows, s
2ac00 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20  ince we have no 
2ac10 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  way.        ** o
2ac20 66 20 6b 6e 6f 77 6e 69 6e 67 20 68 6f 77 20 73  f knowning how s
2ac30 65 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64  elective the ind
2ac40 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65  ex will ultimate
2ac50 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64  ly be.  It would
2ac60 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
2ac70 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  be unreasonable 
2ac80 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c  to make this val
2ac90 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20  ue much larger. 
2aca0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
2acb0 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73  >nOut = 43;  ass
2acc0 65 72 74 28 20 34 33 3d 3d 77 68 65 72 65 43 6f  ert( 43==whereCo
2acd0 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20  st(20) );.      
2ace0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77    pNew->rRun = w
2acf0 68 65 72 65 43 6f 73 74 41 64 64 28 72 4c 6f 67  hereCostAdd(rLog
2ad00 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29  Size,pNew->nOut)
2ad10 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2ad20 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
2ad30 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20  AUTO_INDEX;.    
2ad40 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2ad50 20 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72   = mExtra | pTer
2ad60 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
2ad70 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
2ad80 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2ad90 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2ada0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2adb0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2adc0 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
2add0 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c  INDEX */..  /* L
2ade0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
2adf0 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ices.  */.  for(
2ae00 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
2ae10 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62  && pProbe; pProb
2ae20 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c  e=pProbe->pNext,
2ae30 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20   iSortIdx++){.  
2ae40 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50    if( pProbe->pP
2ae50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20  artIdxWhere!=0. 
2ae60 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61      && !whereUsa
2ae70 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
2ae80 70 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c  pNew->iTab, pWC,
2ae90 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
2aea0 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20  xWhere) ){.     
2aeb0 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50   continue;  /* P
2aec0 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61  artial index ina
2aed0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
2aee0 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  his query */.   
2aef0 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62   }.    pNew->u.b
2af00 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20  tree.nEq = 0;.  
2af10 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2af20 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53   0;.    pNew->iS
2af30 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
2af40 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
2af50 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
2af60 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20  eq = mExtra;.   
2af70 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
2af80 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ize;.    pNew->u
2af90 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
2afa0 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20  pProbe;.    b = 
2afb0 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
2afc0 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64  thOrderBy(pBuild
2afd0 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63  er, pProbe, pSrc
2afe0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2aff0 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44  /* The ONEPASS_D
2b000 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76  ESIRED flags nev
2b010 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68  er occurs togeth
2b020 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59  er with ORDER BY
2b030 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2b040 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2b050 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2b060 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
2b070 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69  || b==0 );.    i
2b080 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c  f( pProbe->tnum<
2b090 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
2b0a0 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
2b0b0 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ey index */.    
2b0c0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2b0d0 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20  = WHERE_IPK;..  
2b0e0 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c      /* Full tabl
2b0f0 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  e scan */.      
2b100 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
2b110 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
2b120 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  0;.      /* TUNI
2b130 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c  NG: Cost of full
2b140 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 33   table scan is 3
2b150 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a  *(N + log2(N))..
2b160 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65        **  +  The
2b170 20 65 78 74 72 61 20 33 20 66 61 63 74 6f 72 20   extra 3 factor 
2b180 69 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20  is to encourage 
2b190 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78  the use of index
2b1a0 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20  ed lookups.     
2b1b0 20 2a 2a 20 20 20 20 20 6f 76 65 72 20 66 75 6c   **     over ful
2b1c0 6c 20 73 63 61 6e 73 2e 20 20 41 20 73 6d 61 6c  l scans.  A smal
2b1d0 6c 65 72 20 63 6f 6e 73 74 61 6e 74 20 32 20 69  ler constant 2 i
2b1e0 73 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72  s used for cover
2b1f0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ing.      **    
2b200 20 69 6e 64 65 78 20 73 63 61 6e 73 20 73 6f 20   index scans so 
2b210 74 68 61 74 20 61 20 63 6f 76 65 72 69 6e 67 20  that a covering 
2b220 69 6e 64 65 78 20 73 63 61 6e 20 77 69 6c 6c 20  index scan will 
2b230 62 65 20 66 61 76 6f 72 65 64 20 6f 76 65 72 0a  be favored over.
2b240 20 20 20 20 20 20 2a 2a 20 20 20 20 20 61 20 74        **     a t
2b250 61 62 6c 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  able scan. */.  
2b260 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2b270 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 53   whereCostAdd(rS
2b280 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b 20  ize,rLogSize) + 
2b290 31 36 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  16;.      whereL
2b2a0 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
2b2b0 70 57 43 2c 20 70 4e 65 77 2c 20 70 53 72 63 2d  pWC, pNew, pSrc-
2b2c0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2b2d0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
2b2e0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
2b2f0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65  pNew);.      pNe
2b300 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
2b310 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2b320 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
2b330 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
2b340 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
2b350 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
2b360 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20  dex(pProbe);.   
2b370 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2b380 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45   = (m==0) ? (WHE
2b390 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52  RE_IDX_ONLY|WHER
2b3a0 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45  E_INDEXED) : WHE
2b3b0 52 45 5f 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20  RE_INDEXED;..   
2b3c0 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20     /* Full scan 
2b3d0 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  via index */.   
2b3e0 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20     if( b.       
2b3f0 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20  || ( m==0.      
2b400 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55     && pProbe->bU
2b410 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20  nordered==0.    
2b420 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
2b430 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2b440 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
2b450 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  RED)==0.        
2b460 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
2b470 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a  lConfig.bUseCis.
2b480 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
2b490 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
2b4a0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
2b4b0 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72  db, SQLITE_Cover
2b4c0 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20  IdxScan).       
2b4d0 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20     ).      ){.  
2b4e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
2b4f0 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
2b500 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  Idx : 0;.       
2b510 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20   if( m==0 ){.   
2b520 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
2b530 3a 20 43 6f 73 74 20 6f 66 20 61 20 63 6f 76 65  : Cost of a cove
2b540 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20  ring index scan 
2b550 69 73 20 32 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e  is 2*(N + log2(N
2b560 29 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ))..          **
2b570 20 20 2b 20 20 54 68 65 20 65 78 74 72 61 20 32    +  The extra 2
2b580 20 66 61 63 74 6f 72 20 69 73 20 74 6f 20 65 6e   factor is to en
2b590 63 6f 75 72 61 67 65 20 74 68 65 20 75 73 65 20  courage the use 
2b5a0 6f 66 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75  of indexed looku
2b5b0 70 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ps.          ** 
2b5c0 20 20 20 20 6f 76 65 72 20 69 6e 64 65 78 20 73      over index s
2b5d0 63 61 6e 73 2e 20 20 41 20 74 61 62 6c 65 20 73  cans.  A table s
2b5e0 63 61 6e 20 75 73 65 73 20 61 20 66 61 63 74 6f  can uses a facto
2b5f0 72 20 6f 66 20 33 20 73 6f 20 74 68 61 74 0a 20  r of 3 so that. 
2b600 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20           **     
2b610 69 6e 64 65 78 20 73 63 61 6e 73 20 61 72 65 20  index scans are 
2b620 66 61 76 6f 72 65 64 20 6f 76 65 72 20 74 61 62  favored over tab
2b630 6c 65 20 73 63 61 6e 73 2e 0a 20 20 20 20 20 20  le scans..      
2b640 20 20 20 20 2a 2a 20 20 2b 20 20 49 66 20 74 68      **  +  If th
2b650 69 73 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  is covering inde
2b660 78 20 6d 69 67 68 74 20 61 6c 73 6f 20 68 65 6c  x might also hel
2b670 70 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  p satisfy the OR
2b680 44 45 52 20 42 59 0a 20 20 20 20 20 20 20 20 20  DER BY.         
2b690 20 2a 2a 20 20 20 20 20 63 6c 61 75 73 65 2c 20   **     clause, 
2b6a0 74 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73  then the cost is
2b6b0 20 66 75 64 67 65 64 20 64 6f 77 6e 20 73 6c 69   fudged down sli
2b6c0 67 68 74 6c 79 20 73 6f 20 74 68 61 74 20 74 68  ghtly so that th
2b6d0 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
2b6e0 20 20 20 20 69 6e 64 65 78 20 69 73 20 66 61 76      index is fav
2b6f0 6f 72 65 64 20 61 62 6f 76 65 20 6f 74 68 65 72  ored above other
2b700 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 68 61   indices that ha
2b710 76 65 20 6e 6f 20 68 6f 70 65 20 6f 66 0a 20 20  ve no hope of.  
2b720 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 68          **     h
2b730 65 6c 70 69 6e 67 20 77 69 74 68 20 74 68 65 20  elping with the 
2b740 4f 52 44 45 52 20 42 59 2e 20 2a 2f 0a 20 20 20  ORDER BY. */.   
2b750 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
2b760 6e 20 3d 20 31 30 20 2b 20 77 68 65 72 65 43 6f  n = 10 + whereCo
2b770 73 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67  stAdd(rSize,rLog
2b780 53 69 7a 65 29 20 2d 20 62 3b 0a 20 20 20 20 20  Size) - b;.     
2b790 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b7a0 20 20 20 20 61 73 73 65 72 74 28 20 62 21 3d 30      assert( b!=0
2b7b0 20 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20 2f   ); .          /
2b7c0 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
2b7d0 66 20 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f 6e  f scanning a non
2b7e0 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20  -covering index 
2b7f0 69 73 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e 29  is (N+1)*log2(N)
2b800 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68  .          ** wh
2b810 69 63 68 20 77 65 20 77 69 6c 6c 20 73 69 6d 70  ich we will simp
2b820 6c 69 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a 6c  lify to just N*l
2b830 6f 67 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20 20  og2(N) */.      
2b840 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2b850 20 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a   rSize + rLogSiz
2b860 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2b870 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
2b880 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
2b890 70 4e 65 77 2c 20 70 53 72 63 2d 3e 69 43 75 72  pNew, pSrc->iCur
2b8a0 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63  sor);.        rc
2b8b0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
2b8c0 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
2b8d0 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  w);.        pNew
2b8e0 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
2b8f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2b900 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2b910 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
2b920 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
2b930 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c  eIndex(pBuilder,
2b940 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 30   pSrc, pProbe, 0
2b950 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
2b960 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
2b970 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74  _STAT4.    sqlit
2b980 65 33 53 74 61 74 34 50 72 6f 62 65 46 72 65 65  e3Stat4ProbeFree
2b990 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29  (pBuilder->pRec)
2b9a0 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ;.    pBuilder->
2b9b0 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20  nRecValid = 0;. 
2b9c0 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65     pBuilder->pRe
2b9d0 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  c = 0;.#endif.. 
2b9e0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
2b9f0 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  as an INDEXED BY
2ba00 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e   clause, then on
2ba10 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65  ly that one inde
2ba20 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  x is.    ** cons
2ba30 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  idered. */.    i
2ba40 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  f( pSrc->pIndex 
2ba50 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
2ba60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
2ba70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ba80 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
2ba90 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
2baa0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
2bab0 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  r a table of the
2bac0 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64   join identified
2bad0 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d   by.** pBuilder-
2bae0 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
2baf0 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
2bb00 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76  anteed to be a v
2bb10 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
2bb20 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2bb30 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
2bb40 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
2bb50 64 65 72 20 2a 70 42 75 69 6c 64 65 72 20 20 20  der *pBuilder   
2bb60 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
2bb70 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 29  information */.)
2bb80 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
2bb90 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
2bba0 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
2bbb0 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
2bbc0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
2bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bbe0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
2bbf0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
2bc00 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
2bc10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
2bc20 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
2bc30 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2bc40 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54  em *pSrc;   /* T
2bc50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
2bc60 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
2bc70 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
2bc80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2bc90 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
2bca0 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20  nfo *pIdxInfo;. 
2bcb0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
2bcc0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
2bcd0 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
2bce0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2bcf0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
2bd00 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
2bd10 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
2bd20 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
2bd30 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d  nt iTerm, mxTerm
2bd40 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  ;.  int nConstra
2bd50 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49  int;.  int seenI
2bd60 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
2bd70 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2bd80 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  n IN operator is
2bd90 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73   seen */.  int s
2bda0 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20  eenVar = 0;     
2bdb0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2bdc0 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  if a non-constan
2bdd0 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  t constraint is 
2bde0 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50  seen */.  int iP
2bdf0 68 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  hase;           
2be00 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e         /* 0: con
2be10 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f  st w/o IN, 1: co
2be20 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20  nst, 2: no IN,  
2be30 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65  2: IN */.  Where
2be40 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Loop *pNew;.  in
2be50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2be60 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  ;..  pWInfo = pB
2be70 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
2be80 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
2be90 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  o->pParse;.  db 
2bea0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2beb0 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
2bec0 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  pWC;.  pNew = pB
2bed0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
2bee0 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  pSrc = &pWInfo->
2bef0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77  pTabList->a[pNew
2bf00 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20  ->iTab];.  pTab 
2bf10 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
2bf20 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61  assert( IsVirtua
2bf30 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64  l(pTab) );.  pId
2bf40 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65  xInfo = allocate
2bf50 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65  IndexInfo(pParse
2bf60 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75  , pWC, pSrc, pBu
2bf70 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29  ilder->pOrderBy)
2bf80 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
2bf90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2bfa0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65  ITE_NOMEM;.  pNe
2bfb0 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20  w->prereq = 0;. 
2bfc0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2bfd0 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  0;.  pNew->wsFla
2bfe0 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55  gs = WHERE_VIRTU
2bff0 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d  ALTABLE;.  pNew-
2c000 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
2c010 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2c020 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61  Free = 0;.  pUsa
2c030 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  ge = pIdxInfo->a
2c040 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
2c050 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  .  nConstraint =
2c060 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73   pIdxInfo->nCons
2c070 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68  traint;.  if( wh
2c080 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
2c090 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61  , pNew, nConstra
2c0a0 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  int) ){.    sqli
2c0b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
2c0c0 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74  dxInfo);.    ret
2c0d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2c0e0 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68  ;.  }..  for(iPh
2c0f0 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33  ase=0; iPhase<=3
2c100 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20  ; iPhase++){.   
2c110 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20   if( !seenIn && 
2c120 28 69 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b  (iPhase&1)!=0 ){
2c130 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b  .      iPhase++;
2c140 0a 20 20 20 20 20 20 69 66 28 20 69 50 68 61 73  .      if( iPhas
2c150 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e>3 ) break;.   
2c160 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e   }.    if( !seen
2c170 56 61 72 20 26 26 20 69 50 68 61 73 65 3e 31 20  Var && iPhase>1 
2c180 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64  ) break;.    pId
2c190 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
2c1a0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
2c1b0 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
2c1c0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
2c1d0 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  nt;.    for(i=0;
2c1e0 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
2c1f0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
2c200 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
2c210 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
2c220 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
2c230 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
2c240 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69  >a[j];.      swi
2c250 74 63 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20  tch( iPhase ){. 
2c260 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20         case 0:  
2c270 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77    /* Constants w
2c280 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74  ithout IN operat
2c290 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
2c2a0 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
2c2b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2c2c0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2c2d0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
2c2e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c2f0 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20   seenIn = 1;.   
2c300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c310 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
2c320 65 72 65 71 52 69 67 68 74 21 3d 30 20 29 7b 0a  ereqRight!=0 ){.
2c330 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e              seen
2c340 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Var = 1;.       
2c350 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54     }else if( (pT
2c360 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2c370 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20   WO_IN)==0 ){.  
2c380 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2c390 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a  ns->usable = 1;.
2c3a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c3b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c3c0 20 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 20       case 1:    
2c3d0 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74  /* Constants wit
2c3e0 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a  h IN operators *
2c3f0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
2c400 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20  rt( seenIn );.  
2c410 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2c420 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
2c430 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d  m->prereqRight==
2c440 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
2c450 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
2c460 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61  e 2:    /* Varia
2c470 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20  bles without IN 
2c480 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
2c490 65 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a  ert( seenVar );.
2c4a0 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2c4b0 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54  ns->usable = (pT
2c4c0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2c4d0 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20   WO_IN)==0;.    
2c4e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c4f0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20       default:   
2c500 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74  /* Variables wit
2c510 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  h IN */.        
2c520 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61    assert( seenVa
2c530 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20  r && seenIn );. 
2c540 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
2c550 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20  s->usable = 1;. 
2c560 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2c570 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c580 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c    memset(pUsage,
2c590 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67   0, sizeof(pUsag
2c5a0 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e  e[0])*pIdxInfo->
2c5b0 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
2c5c0 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
2c5d0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2c5e0 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
2c5f0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
2c600 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  );.    pIdxInfo-
2c610 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  >idxStr = 0;.   
2c620 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
2c630 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  m = 0;.    pIdxI
2c640 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2c650 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
2c660 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2c670 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
2c680 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
2c690 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49  matedCost = SQLI
2c6a0 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f  TE_BIG_DBL / (do
2c6b0 75 62 6c 65 29 32 3b 0a 20 20 20 20 72 63 20 3d  uble)2;.    rc =
2c6c0 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70   vtabBestIndex(p
2c6d0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64  Parse, pTab, pId
2c6e0 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20  xInfo);.    if( 
2c6f0 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c  rc ) goto whereL
2c700 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
2c710 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
2c720 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
2c730 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
2c740 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
2c750 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
2c760 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30  pNew->prereq = 0
2c770 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d  ;.    mxTerm = -
2c780 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
2c790 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f  New->nLSlot>=nCo
2c7a0 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20  nstraint );.    
2c7b0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
2c7c0 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65  traint; i++) pNe
2c7d0 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30  w->aLTerm[i] = 0
2c7e0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74  ;.    pNew->u.vt
2c7f0 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b  ab.omitMask = 0;
2c800 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2c810 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
2c820 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
2c830 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20       if( (iTerm 
2c840 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  = pUsage[i].argv
2c850 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b  Index - 1)>=0 ){
2c860 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64  .        j = pId
2c870 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
2c880 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
2c890 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69  iTerm>=nConstrai
2c8a0 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  nt.         || j
2c8b0 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  <0.         || j
2c8c0 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20  >=pWC->nTerm.   
2c8d0 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61        || pNew->a
2c8e0 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a  LTerm[iTerm]!=0.
2c8f0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2c900 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c910 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
2c920 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2c930 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42  g(pParse, "%s.xB
2c940 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75  estIndex() malfu
2c950 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a  nction", pTab->z
2c960 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2c970 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
2c980 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
2c990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
2c9a0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
2c9b0 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
2c9c0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2c9d0 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( j==0 );.     
2c9e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
2c9f0 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a  pWC->nTerm-1 );.
2ca00 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
2ca10 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
2ca20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2ca30 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65   |= pTerm->prere
2ca40 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
2ca50 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e  assert( iTerm<pN
2ca60 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
2ca70 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
2ca80 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72  rm[iTerm] = pTer
2ca90 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  m;.        if( i
2caa0 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78  Term>mxTerm ) mx
2cab0 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20  Term = iTerm;.  
2cac0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2cad0 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
2cae0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2caf0 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20  Term==16 );.    
2cb00 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36      if( iTerm<16
2cb10 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d   && pUsage[i].om
2cb20 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61  it ) pNew->u.vta
2cb30 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c  b.omitMask |= 1<
2cb40 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  <iTerm;.        
2cb50 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2cb60 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
2cb70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
2cb80 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  f( pUsage[i].omi
2cb90 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
2cba0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74      /* Do not at
2cbb0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20  tempt to use an 
2cbc0 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66  IN constraint if
2cbd0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
2cbe0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
2cbf0 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20  * says that the 
2cc00 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f  equivalent EQ co
2cc10 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
2cc20 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65  be safely omitte
2cc30 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  d..            *
2cc40 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d  * If we do attem
2cc50 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20 61  pt to use such a
2cc60 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d   constraint, som
2cc70 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a  e rows might be.
2cc80 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
2cc90 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f  epeated in the o
2cca0 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20  utput. */.      
2ccb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2ccc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ccd0 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20     /* A virtual 
2cce0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f  table that is co
2ccf0 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20  nstrained by an 
2cd00 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f  IN clause may no
2cd10 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
2cd20 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52  onsume the ORDER
2cd30 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61 75   BY clause becau
2cd40 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65 72  se (1) the order
2cd50 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20   of IN terms.   
2cd60 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
2cd70 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
2cd80 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
2cd90 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
2cda0 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  s and.          
2cdb0 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20  ** (2) Multiple 
2cdc0 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73  outputs from a s
2cdd0 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77  ingle IN value w
2cde0 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20  ill not merge.  
2cdf0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74          ** toget
2ce00 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  her.  */.       
2ce10 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
2ce20 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
2ce30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ce40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2ce50 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ( i>=nConstraint
2ce60 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
2ce70 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b  nLTerm = mxTerm+
2ce80 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
2ce90 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70   pNew->nLTerm<=p
2cea0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
2ceb0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
2cec0 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49  b.idxNum = pIdxI
2ced0 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20  nfo->idxNum;.   
2cee0 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2cef0 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49  needFree = pIdxI
2cf00 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2cf10 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64  dxStr;.      pId
2cf20 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2cf30 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
2cf40 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2cf50 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66  idxStr = pIdxInf
2cf60 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20  o->idxStr;.     
2cf70 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73   pNew->u.vtab.is
2cf80 4f 72 64 65 72 65 64 20 3d 20 28 75 38 29 28 28  Ordered = (u8)((
2cf90 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
2cfa0 42 79 21 3d 30 29 0a 20 20 20 20 20 20 20 20 20  By!=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 26 26 20 70              && p
2cfd0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2cfe0 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20 20  Consumed);.     
2cff0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2d000 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  0;.      pNew->r
2d010 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 46  Run = whereCostF
2d020 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e  romDouble(pIdxIn
2d030 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
2d040 74 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e  t);.      /* TUN
2d050 49 4e 47 3a 20 45 76 65 72 79 20 76 69 72 74 75  ING: Every virtu
2d060 61 6c 20 74 61 62 6c 65 20 71 75 65 72 79 20 72  al table query r
2d070 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a  eturns 25 rows *
2d080 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  /.      pNew->nO
2d090 75 74 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74  ut = 46;  assert
2d0a0 28 20 34 36 3d 3d 77 68 65 72 65 43 6f 73 74 28  ( 46==whereCost(
2d0b0 32 35 29 20 29 3b 0a 20 20 20 20 20 20 77 68 65  25) );.      whe
2d0c0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2d0d0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2d0e0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
2d0f0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
2d100 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d110 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74  _free(pNew->u.vt
2d120 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
2d130 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2d140 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
2d150 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2d160 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64    ..whereLoopAdd
2d170 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28  Vtab_exit:.  if(
2d180 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
2d190 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
2d1a0 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
2d1b0 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
2d1c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2d1d0 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72  , pIdxInfo);.  r
2d1e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
2d1f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2d200 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
2d210 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65  /../*.** Add Whe
2d220 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74  reLoop entries t
2d230 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d  o handle OR term
2d240 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66  s.  This works f
2d250 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72  or either.** btr
2d260 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ees or virtual t
2d270 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
2d280 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2d290 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  dOr(WhereLoopBui
2d2a0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
2d2b0 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b  Bitmask mExtra){
2d2c0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2d2d0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2d2e0 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65  >pWInfo;.  Where
2d2f0 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
2d300 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
2d310 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2d320 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69  rm, *pWCEnd;.  i
2d330 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d340 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  K;.  int iCur;. 
2d350 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d   WhereClause tem
2d360 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
2d370 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c  Builder sSubBuil
2d380 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20  d;.  WhereOrSet 
2d390 73 53 75 6d 2c 20 73 43 75 72 2c 20 73 50 72 65  sSum, sCur, sPre
2d3a0 76 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  v;.  struct SrcL
2d3b0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2d3c0 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69  .  .  pWC = pBui
2d3d0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28  lder->pWC;.  if(
2d3e0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2d3f0 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f  ags & WHERE_AND_
2d400 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53 51  ONLY ) return SQ
2d410 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e  LITE_OK;.  pWCEn
2d420 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
2d430 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
2d440 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2d450 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d  ;.  memset(&sSum
2d460 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d  , 0, sizeof(sSum
2d470 29 29 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d  ));..  for(pTerm
2d480 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
2d490 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c  WCEnd && rc==SQL
2d4a0 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29  ITE_OK; pTerm++)
2d4b0 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
2d4c0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2d4d0 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20  _OR)!=0.     && 
2d4e0 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  (pTerm->u.pOrInf
2d4f0 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70  o->indexable & p
2d500 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  New->maskSelf)!=
2d510 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
2d520 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f  WhereClause * co
2d530 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65  nst pOrWC = &pTe
2d540 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
2d550 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  c;.      WhereTe
2d560 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  rm * const pOrWC
2d570 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b  End = &pOrWC->a[
2d580 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  pOrWC->nTerm];. 
2d590 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
2d5a0 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  pOrTerm;.      i
2d5b0 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20  nt once = 1;.   
2d5c0 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
2d5d0 20 0a 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20   .      pItem = 
2d5e0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2d5f0 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62  ->a + pNew->iTab
2d600 3b 0a 20 20 20 20 20 20 69 43 75 72 20 3d 20 70  ;.      iCur = p
2d610 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
2d620 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d       sSubBuild =
2d630 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20   *pBuilder;.    
2d640 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64    sSubBuild.pOrd
2d650 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
2d660 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74  sSubBuild.pOrSet
2d670 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20   = &sCur;..     
2d680 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72   for(pOrTerm=pOr
2d690 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70  WC->a; pOrTerm<p
2d6a0 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d  OrWCEnd; pOrTerm
2d6b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
2d6c0 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
2d6d0 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d  ator & WO_AND)!=
2d6e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
2d6f0 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
2d700 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49  pOrTerm->u.pAndI
2d710 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20  nfo->wc;.       
2d720 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
2d730 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
2d740 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
2d750 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20    tempWC.pWInfo 
2d760 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20  = pWC->pWInfo;. 
2d770 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2d780 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20  pOuter = pWC;.  
2d790 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f          tempWC.o
2d7a0 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20  p = TK_AND;.    
2d7b0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65        tempWC.nTe
2d7c0 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
2d7d0 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72    tempWC.a = pOr
2d7e0 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
2d7f0 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
2d800 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20  &tempWC;.       
2d810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d820 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2d830 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43      }.        sC
2d840 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 6e 64 65  ur.n = 0;.#ifnde
2d850 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2d860 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
2d870 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
2d880 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  (pItem->pTab) ){
2d890 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2d8a0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
2d8b0 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64 29 3b  ual(&sSubBuild);
2d8c0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
2d8d0 3d 30 3b 20 69 3c 73 43 75 72 2e 6e 3b 20 69 2b  =0; i<sCur.n; i+
2d8e0 2b 29 20 73 43 75 72 2e 61 5b 69 5d 2e 70 72 65  +) sCur.a[i].pre
2d8f0 72 65 71 20 7c 3d 20 6d 45 78 74 72 61 3b 0a 20  req |= mExtra;. 
2d900 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
2d910 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
2d920 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
2d930 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26  reLoopAddBtree(&
2d940 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72  sSubBuild, mExtr
2d950 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  a);.        }.  
2d960 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2d970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  ==SQLITE_OK || s
2d980 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  Cur.n==0 );.    
2d990 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d      if( sCur.n==
2d9a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
2d9b0 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  Sum.n = 0;.     
2d9c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2d9d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
2d9e0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
2d9f0 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75  whereOrMove(&sSu
2da00 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20  m, &sCur);.     
2da10 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
2da20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2da30 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
2da40 6f 76 65 28 26 73 50 72 65 76 2c 20 26 73 53 75  ove(&sPrev, &sSu
2da50 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53  m);.          sS
2da60 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
2da70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
2da80 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Prev.n; i++){.  
2da90 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
2daa0 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b  0; j<sCur.n; j++
2dab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2dac0 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26   whereOrInsert(&
2dad0 73 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d  sSum, sPrev.a[i]
2dae0 2e 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61  .prereq | sCur.a
2daf0 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20  [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 77 68 65 72 65 43 6f 73          whereCos
2db20 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
2db30 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  rRun, sCur.a[j].
2db40 72 52 75 6e 29 2c 0a 20 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 77 68 65 72 65 43 6f 73 74 41 64 64 28     whereCostAdd(
2db70 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c  sPrev.a[i].nOut,
2db80 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29   sCur.a[j].nOut)
2db90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2dba0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2dbb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2dbc0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
2dbd0 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65  m = 1;.      pNe
2dbe0 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
2dbf0 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77  Term;.      pNew
2dc00 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
2dc10 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20  E_MULTI_OR;.    
2dc20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
2dc30 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
2dc40 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20  iSortIdx = 0;.  
2dc50 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77      memset(&pNew
2dc60 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ->u, 0, sizeof(p
2dc70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20  New->u));.      
2dc80 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
2dc90 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d  ITE_OK && i<sSum
2dca0 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
2dcb0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 75 6c    /* TUNING: Mul
2dcc0 74 69 70 6c 65 20 62 79 20 33 2e 35 20 66 6f 72  tiple by 3.5 for
2dcd0 20 74 68 65 20 73 65 63 6f 6e 64 61 72 79 20 74   the secondary t
2dce0 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20  able lookup */. 
2dcf0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
2dd00 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  n = sSum.a[i].rR
2dd10 75 6e 20 2b 20 31 38 3b 0a 20 20 20 20 20 20 20  un + 18;.       
2dd20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53   pNew->nOut = sS
2dd30 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20  um.a[i].nOut;.  
2dd40 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
2dd50 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70  eq = sSum.a[i].p
2dd60 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72  rereq;.        r
2dd70 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2dd80 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2dd90 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
2dda0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2ddb0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
2ddc0 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
2ddd0 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74  bjects for all t
2dde0 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63  ables .*/.static
2ddf0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2de00 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75  dAll(WhereLoopBu
2de10 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
2de20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
2de30 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
2de40 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d  ->pWInfo;.  Bitm
2de50 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a  ask mExtra = 0;.
2de60 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72    Bitmask mPrior
2de70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62   = 0;.  int iTab
2de80 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
2de90 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
2dea0 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
2deb0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2dec0 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
2ded0 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
2dee0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
2def0 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49  t nTabList = pWI
2df00 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69  nfo->nLevel;.  i
2df10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2df20 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  K;.  u8 priorJoi
2df30 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65  nType = 0;.  Whe
2df40 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20  reLoop *pNew;.. 
2df50 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68   /* Loop over th
2df60 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
2df70 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20  join, from left 
2df80 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e  to right */.  pN
2df90 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
2dfa0 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  New;.  whereLoop
2dfb0 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f  Init(pNew);.  fo
2dfc0 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d  r(iTab=0, pItem=
2dfd0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61  pTabList->a; iTa
2dfe0 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61 62  b<nTabList; iTab
2dff0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2e000 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69    pNew->iTab = i
2e010 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d  Tab;.    pNew->m
2e020 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73  askSelf = getMas
2e030 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
2e040 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Set, pItem->iCur
2e050 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28  sor);.    if( ((
2e060 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c  pItem->jointype|
2e070 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26  priorJoinType) &
2e080 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
2e090 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  SS))!=0 ){.     
2e0a0 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72   mExtra = mPrior
2e0b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f  ;.    }.    prio
2e0c0 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74 65  rJoinType = pIte
2e0d0 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
2e0e0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2e0f0 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
2e100 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2e110 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42  oopAddVirtual(pB
2e120 75 69 6c 64 65 72 29 3b 0a 20 20 20 20 7d 65 6c  uilder);.    }el
2e130 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  se{.      rc = w
2e140 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
2e150 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
2e160 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  a);.    }.    if
2e170 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e180 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
2e190 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75  ereLoopAddOr(pBu
2e1a0 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
2e1b0 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72      }.    mPrior
2e1c0 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   |= pNew->maskSe
2e1d0 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c  lf;.    if( rc |
2e1e0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2e1f0 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ed ) break;.  }.
2e200 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
2e210 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  (db, pNew);.  re
2e220 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2e230 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72  * Examine a Wher
2e240 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20  ePath (with the 
2e250 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  addition of the 
2e260 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20  extra WhereLoop 
2e270 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61  of the 5th.** pa
2e280 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65  rameters) to see
2e290 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72   if it outputs r
2e2a0 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65  ows in the reque
2e2b0 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a  sted ORDER BY.**
2e2c0 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77   (or GROUP BY) w
2e2d0 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67  ithout requiring
2e2e0 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74   a separate sort
2e2f0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74   operation.  Ret
2e300 75 72 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30  urn:.** .**    0
2e310 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73 20 6e  :  ORDER BY is n
2e320 6f 74 20 73 61 74 69 73 66 69 65 64 2e 20 20 53  ot satisfied.  S
2e330 6f 72 74 69 6e 67 20 72 65 71 75 69 72 65 64 0a  orting required.
2e340 2a 2a 20 20 20 20 31 3a 20 20 4f 52 44 45 52 20  **    1:  ORDER 
2e350 42 59 20 69 73 20 73 61 74 69 73 66 69 65 64 2e  BY is satisfied.
2e360 20 20 20 20 20 20 4f 6d 69 74 20 73 6f 72 74 69        Omit sorti
2e370 6e 67 0a 2a 2a 20 20 20 2d 31 3a 20 20 55 6e 6b  ng.**   -1:  Unk
2e380 6e 6f 77 6e 20 61 74 20 74 68 69 73 20 74 69 6d  nown at this tim
2e390 65 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  e.**.** Note tha
2e3a0 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  t processing for
2e3b0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61   WHERE_GROUPBY a
2e3c0 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  nd WHERE_DISTINC
2e3d0 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a  TBY is not as.**
2e3e0 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47   strict.  With G
2e3f0 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
2e400 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65  INCT the only re
2e410 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61  quirement is tha
2e420 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  t.** equivalent 
2e430 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65  rows appear imme
2e440 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74  diately adjacent
2e450 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e   to one another.
2e460 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e    GROUP BY.** an
2e470 64 20 44 49 53 54 49 4e 54 20 64 6f 20 6e 6f 74  d DISTINT do not
2e480 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f   require rows to
2e490 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70   appear in any p
2e4a0 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20  articular order 
2e4b0 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71  as long.** as eq
2e4c0 75 69 76 65 6c 65 6e 74 20 72 6f 77 73 20 61 72  uivelent rows ar
2e4d0 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
2e4e0 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52  er.  Thus for GR
2e4f0 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49  OUP BY and DISTI
2e500 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65  NCT.** the pOrde
2e510 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65  rBy terms can be
2e520 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20   matched in any 
2e530 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44  order.  With ORD
2e540 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70  ER BY, the .** p
2e550 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75  OrderBy terms mu
2e560 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e  st be matched in
2e570 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d   strict left-to-
2e580 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a  right order..*/.
2e590 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
2e5a0 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
2e5b0 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66  erBy(.  WhereInf
2e5c0 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a  o *pWInfo,    /*
2e5d0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
2e5e0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
2e5f0 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
2e600 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
2e610 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54  P BY or DISTINCT
2e620 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b   clause to check
2e630 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2e640 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54  *pPath,     /* T
2e650 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20  he WherePath to 
2e660 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77  check */.  u16 w
2e670 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
2e680 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69   /* Might contai
2e690 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  n WHERE_GROUPBY 
2e6a0 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  or WHERE_DISTINC
2e6b0 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f  TBY */.  u16 nLo
2e6c0 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  op,            /
2e6d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
2e6e0 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c  ies in pPath->aL
2e6f0 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  oop[] */.  Where
2e700 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20  Loop *pLast,    
2e710 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65   /* Add this Whe
2e720 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e  reLoop to the en
2e730 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  d of pPath->aLoo
2e740 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  p[] */.  Bitmask
2e750 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f   *pRevMask     /
2e760 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57  * OUT: Mask of W
2e770 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e  hereLoops to run
2e780 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
2e790 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76  r */.){.  u8 rev
2e7a0 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Set;            
2e7b0 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69  /* True if rev i
2e7c0 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20  s known */.  u8 
2e7d0 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
2e7e0 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20     /* Composite 
2e7f0 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
2e800 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20  u8 revIdx;      
2e810 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
2e820 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
2e830 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  8 isOrderDistinc
2e840 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f  t;   /* All prio
2e850 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65  r WhereLoops are
2e860 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
2e870 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74  */.  u8 distinct
2e880 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72  Columns;   /* Tr
2e890 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68  ue if the loop h
2e8a0 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55  as UNIQUE NOT NU
2e8b0 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
2e8c0 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20  u8 isMatch;     
2e8d0 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e        /* iColumn
2e8e0 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20   matches a term 
2e8f0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
2e900 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
2e910 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  nColumn;        
2e920 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2e930 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78  olumns in pIndex
2e940 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72   */.  u16 nOrder
2e950 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
2e960 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74  umber terms in t
2e970 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2e980 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  se */.  int iLoo
2e990 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
2e9a0 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c   Index of WhereL
2e9b0 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69  oop in pPath bei
2e9c0 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ng processed */.
2e9d0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2e9e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2e9f0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
2ea00 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
2ea10 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
2ea20 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74  mber for current
2ea30 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20   WhereLoop */.  
2ea40 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
2ea50 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d        /* A colum
2ea60 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20  n number within 
2ea70 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20  table iCur */.  
2ea80 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
2ea90 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74   = 0; /* Current
2eaa0 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67   WhereLoop being
2eab0 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20   processed. */. 
2eac0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2ead0 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67  m;     /* A sing
2eae0 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
2eaf0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2eb00 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20   Expr *pOBExpr; 
2eb10 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
2eb20 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
2eb30 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2eb40 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
2eb50 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43  Coll;       /* C
2eb60 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20  OLLATE function 
2eb70 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59  from an ORDER BY
2eb80 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
2eb90 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
2eba0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
2ebb0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
2ebc0 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  with pLoop */.  
2ebd0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
2ebe0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
2ebf0 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
2ec00 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42  onnection */.  B
2ec10 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30  itmask obSat = 0
2ec20 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
2ec30 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73  ORDER BY terms s
2ec40 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20  atisfied so far 
2ec50 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44  */.  Bitmask obD
2ec60 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  one;       /* Ma
2ec70 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20  sk of all ORDER 
2ec80 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  BY terms */.  Bi
2ec90 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69  tmask orderDisti
2eca0 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73  nctMask;  /* Mas
2ecb0 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72  k of all well-or
2ecc0 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20  dered loops */. 
2ecd0 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20   Bitmask ready; 
2ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ecf0 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f  Mask of inner lo
2ed00 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ops */..  /*.  *
2ed10 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65  * We say the Whe
2ed20 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72  reLoop is "one-r
2ed30 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61  ow" if it genera
2ed40 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  tes no more than
2ed50 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   one.  ** row of
2ed60 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72   output.  A Wher
2ed70 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77  eLoop is one-row
2ed80 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
2ed90 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
2eda0 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c  e:.  **  (a) All
2edb0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d   index columns m
2edc0 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f  atch with WHERE_
2edd0 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20  COLUMN_EQ..  ** 
2ede0 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69   (b) The index i
2edf0 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e  s unique.  ** An
2ee00 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  y WhereLoop with
2ee10 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   an WHERE_COLUMN
2ee20 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  _EQ constraint o
2ee30 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f  n the rowid is o
2ee40 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65  ne-row..  ** Eve
2ee50 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
2ee60 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74  Loop will have t
2ee70 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
2ee80 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61  bit set in wsFla
2ee90 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  gs..  **.  ** We
2eea0 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
2eeb0 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73  op is "order-dis
2eec0 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65  tinct" if the se
2eed0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  t of columns fro
2eee0 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72  m.  ** that Wher
2eef0 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69  eLoop that are i
2ef00 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
2ef10 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72  lause are differ
2ef20 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20  ent for every.  
2ef30 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68  ** row of the Wh
2ef40 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20  ereLoop.  Every 
2ef50 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
2ef60 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  p is automatical
2ef70 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69  ly.  ** order-di
2ef80 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72  stinct.   A Wher
2ef90 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e  eLoop that has n
2efa0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  o columns in the
2efb0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2efc0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64  .  ** is not ord
2efd0 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20  er-distinct. To 
2efe0 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
2eff0 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74  t is not quite t
2f000 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67  he same as being
2f010 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e  .  ** UNIQUE sin
2f020 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75  ce a UNIQUE colu
2f030 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  mn or index can 
2f040 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  have multiple ro
2f050 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72  ws that .  ** ar
2f060 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20  e NULL and NULL 
2f070 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76  values are equiv
2f080 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75  alent for the pu
2f090 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64  rpose of order-d
2f0a0 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f  istinct..  ** To
2f0b0 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
2f0c0 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ct, the columns 
2f0d0 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61  must be UNIQUE a
2f0e0 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a  nd NOT NULL..  *
2f0f0 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64  *.  ** The rowid
2f100 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20   for a table is 
2f110 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e  always UNIQUE an
2f120 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68  d NOT NULL so wh
2f130 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20  enever the.  ** 
2f140 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e  rowid appears in
2f150 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2f160 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73  ause, the corres
2f170 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f  ponding WhereLoo
2f180 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  p is.  ** automa
2f190 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69  tically order-di
2f1a0 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20  stinct..  */..  
2f1b0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
2f1c0 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72  !=0 );..  /* Sor
2f1d0 74 61 62 69 6c 69 74 79 20 6f 66 20 76 69 72 74  tability of virt
2f1e0 75 61 6c 20 74 61 62 6c 65 73 20 69 73 20 64 65  ual tables is de
2f1f0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
2f200 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
2f210 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 76 69  d.  ** of the vi
2f220 72 74 75 61 6c 20 74 61 62 6c 65 20 69 74 73 65  rtual table itse
2f230 6c 66 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73  lf */.  if( pLas
2f240 74 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  t->wsFlags & WHE
2f250 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
2f260 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ){.    testcase(
2f270 20 6e 4c 6f 6f 70 3e 30 20 29 3b 20 20 2f 2a 20   nLoop>0 );  /* 
2f280 54 72 75 65 20 77 68 65 6e 20 6f 75 74 65 72 20  True when outer 
2f290 6c 6f 6f 70 73 20 61 72 65 20 6f 6e 65 2d 72 6f  loops are one-ro
2f2a0 77 20 61 6e 64 20 6d 61 74 63 68 20 0a 20 20 20  w 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 2a 2a 20 6e 6f 20 4f 52 44         ** no ORD
2f2d0 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
2f2e0 20 20 20 72 65 74 75 72 6e 20 70 4c 61 73 74 2d     return pLast-
2f2f0 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65  >u.vtab.isOrdere
2f300 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f  d;.  }.  if( nLo
2f310 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  op && Optimizati
2f320 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
2f330 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78  QLITE_OrderByIdx
2f340 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
2f350 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  ;..  nOrderBy = 
2f360 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
2f370 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72  .  testcase( nOr
2f380 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a  derBy==BMS-1 );.
2f390 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42    if( nOrderBy>B
2f3a0 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  MS-1 ) return 0;
2f3b0 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69    /* Cannot opti
2f3c0 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67  mize overly larg
2f3d0 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20  e ORDER BYs */. 
2f3e0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2f3f0 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d   = 1;.  obDone =
2f400 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42   MASKBIT(nOrderB
2f410 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73  y)-1;.  orderDis
2f420 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  tinctMask = 0;. 
2f430 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f   ready = 0;.  fo
2f440 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64  r(iLoop=0; isOrd
2f450 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62  erDistinct && ob
2f460 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c  Sat<obDone && iL
2f470 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  oop<=nLoop; iLoo
2f480 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c  p++){.    if( iL
2f490 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d  oop>0 ) ready |=
2f4a0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
2f4b0 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c  ;.    pLoop = iL
2f4c0 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74  oop<nLoop ? pPat
2f4d0 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  h->aLoop[iLoop] 
2f4e0 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 61 73 73  : pLast;.    ass
2f4f0 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
2f500 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2f510 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
2f520 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e  .    iCur = pWIn
2f530 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
2f540 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75  pLoop->iTab].iCu
2f550 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  rsor;..    /* Ma
2f560 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52  rk off any ORDER
2f570 20 42 59 20 74 65 72 6d 20 58 20 74 68 61 74 20   BY term X that 
2f580 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  is a column in t
2f590 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20  he table of.    
2f5a0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ** the current l
2f5b0 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74 68  oop for which th
2f5c0 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74  ere is term in t
2f5d0 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20  he WHERE.    ** 
2f5e0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
2f5f0 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20  rm X IS NULL or 
2f600 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e  X=? that referen
2f610 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20  ce only outer.  
2f620 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20    ** loops..    
2f630 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
2f640 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
2f650 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b  {.      if( MASK
2f660 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
2f670 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2f680 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
2f690 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
2f6a0 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
2f6b0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  .pExpr);.      i
2f6c0 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d  f( pOBExpr->op!=
2f6d0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74  TK_COLUMN ) cont
2f6e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
2f6f0 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
2f700 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
2f710 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
2f720 66 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f  findTerm(&pWInfo
2f730 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42  ->sWC, iCur, pOB
2f740 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20  Expr->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 7e 72 65 61 64 79 2c 20 57 4f        ~ready, WO
2f770 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30  _EQ|WO_ISNULL, 0
2f780 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
2f790 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
2f7a0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
2f7b0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f  rm->eOperator&WO
2f7c0 5f 45 51 29 21 3d 30 20 26 26 20 70 4f 42 45 78  _EQ)!=0 && pOBEx
2f7d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  pr->iColumn>=0 )
2f7e0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
2f7f0 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20  char *z1, *z2;. 
2f800 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
2f810 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2f820 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
2f830 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
2f840 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
2f850 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
2f860 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
2f870 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20  oll;.        z1 
2f880 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  = pColl->zName;.
2f890 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
2f8a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2f8b0 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
2f8c0 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29  e, pTerm->pExpr)
2f8d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
2f8e0 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
2f8f0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
2f900 20 20 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c        z2 = pColl
2f910 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
2f920 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
2f930 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29  Cmp(z1, z2)!=0 )
2f940 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2f950 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c   }.      obSat |
2f960 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
2f970 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c    }..    if( (pL
2f980 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2f990 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20  HERE_ONEROW)==0 
2f9a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  ){.      if( pLo
2f9b0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2f9c0 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20  ERE_IPK ){.     
2f9d0 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
2f9e0 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
2f9f0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
2fa00 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c  if( (pIndex = pL
2fa10 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
2fa20 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65  dex)==0 || pInde
2fa30 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b  x->bUnordered ){
2fa40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2fa50 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
2fa60 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
2fa70 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  = pIndex->nColum
2fa80 6e 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64  n;.        isOrd
2fa90 65 72 44 69 73 74 69 6e 63 74 20 3d 20 70 49 6e  erDistinct = pIn
2faa0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
2fab0 5f 4e 6f 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  _None;.      }..
2fac0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
2fad0 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e  rough all column
2fae0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  s of the index a
2faf0 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74 68 65  nd deal with the
2fb00 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74   ones.      ** t
2fb10 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73  hat are not cons
2fb20 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72  trained by == or
2fb30 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   IN..      */.  
2fb40 20 20 20 20 72 65 76 20 3d 20 72 65 76 53 65 74      rev = revSet
2fb50 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74   = 0;.      dist
2fb60 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b  inctColumns = 0;
2fb70 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
2fb80 6a 3c 3d 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  j<=nColumn; j++)
2fb90 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e  {.        u8 bOn
2fba0 63 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 74 6f  ce;   /* True to
2fbb0 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42   run the ORDER B
2fbc0 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f  Y search loop */
2fbd0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69  ..        /* Ski
2fbe0 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53  p over == and IS
2fbf0 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20   NULL terms */. 
2fc00 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f         if( j<pLo
2fc10 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a  op->u.btree.nEq.
2fc20 20 20 20 20 20 20 20 20 20 26 26 20 28 28 69 20           && ((i 
2fc30 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
2fc40 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20 26  j]->eOperator) &
2fc50 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c   (WO_EQ|WO_ISNUL
2fc60 4c 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29  L))!=0.        )
2fc70 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2fc80 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  i & WO_ISNULL ){
2fc90 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
2fca0 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
2fcb0 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
2fcc0 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
2fcd0 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
2fce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2fcf0 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20   continue;  .   
2fd00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2fd10 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d  /* Get the colum
2fd20 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  n number in the 
2fd30 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20  table (iColumn) 
2fd40 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20  and sort order. 
2fd50 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64         ** (revId
2fd60 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20  x) for the j-th 
2fd70 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
2fd80 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  dex..        */.
2fd90 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 6e 43          if( j<nC
2fda0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
2fdb0 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 69 6e 64     /* Normal ind
2fdc0 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ex columns */.  
2fdd0 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
2fde0 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  = pIndex->aiColu
2fdf0 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  mn[j];.         
2fe00 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78   revIdx = pIndex
2fe10 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b  ->aSortOrder[j];
2fe20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2fe30 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
2fe40 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20  pTable->iPKey ) 
2fe50 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
2fe60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fe70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 52 4f         /* The RO
2fe80 57 49 44 20 63 6f 6c 75 6d 6e 20 61 74 20 74 68  WID column at th
2fe90 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  e end */.       
2fea0 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43     assert( j==nC
2feb0 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20  olumn );.       
2fec0 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b     iColumn = -1;
2fed0 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
2fee0 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  x = 0;.        }
2fef0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ..        /* An 
2ff00 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f  unconstrained co
2ff10 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20  lumn that might 
2ff20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68  be NULL means th
2ff30 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  at this.        
2ff40 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ** WhereLoop is 
2ff50 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64  not well-ordered
2ff60 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
2ff70 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
2ff80 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20  Distinct.       
2ff90 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a    && iColumn>=0.
2ffa0 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70           && j>=p
2ffb0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
2ffc0 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49  q.         && pI
2ffd0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  ndex->pTable->aC
2ffe0 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e  ol[iColumn].notN
2fff0 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29  ull==0.        )
30000 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72  {.          isOr
30010 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
30020 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
30030 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
30040 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68  ORDER BY term th
30050 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
30060 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d  o the j-th colum
30070 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  n.        ** of 
30080 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 61 6e  the index and an
30090 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45  d mark that ORDE
300a0 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20  R BY term off . 
300b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
300c0 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20    bOnce = 1;.   
300d0 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30       isMatch = 0
300e0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
300f0 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f  0; bOnce && i<nO
30100 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
30110 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
30120 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
30130 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
30140 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73       pOBExpr = s
30150 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
30160 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
30170 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
30180 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
30190 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
301a0 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20  ERE_GROUPBY );. 
301b0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
301c0 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  e( wctrlFlags & 
301d0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
301e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
301f0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
30200 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57  (WHERE_GROUPBY|W
30210 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29  HERE_DISTINCTBY)
30220 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30  )==0 ) bOnce = 0
30230 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30240 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
30250 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75  COLUMN ) continu
30260 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
30270 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65   pOBExpr->iTable
30280 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
30290 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
302a0 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
302b0 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  n!=iColumn ) con
302c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
302d0 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20   if( iColumn>=0 
302e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
302f0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
30300 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
30310 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
30320 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
30330 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30340 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
30350 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
30360 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30370 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
30380 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
30390 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  ndex->azColl[j])
303a0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
303b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
303c0 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
303d0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
303e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
303f0 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
30400 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  h ){.          i
30410 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  f( iColumn<0 ){.
30420 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
30430 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f  case( distinctCo
30440 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20  lumns==0 );.    
30450 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74          distinct
30460 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20  Columns = 1;.   
30470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30480 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
30490 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
304a0 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
304b0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
304c0 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b  E_GROUPBY)==0 ){
304d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
304e0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f  Make sure the so
304f0 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70  rt order is comp
30500 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44  atible in an ORD
30510 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
30520 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72            ** Sor
30530 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c  t order is irrel
30540 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55  evant for a GROU
30550 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a  P BY clause. */.
30560 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30570 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20  revSet ){.      
30580 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76          if( (rev
30590 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64   ^ revIdx)!=pOrd
305a0 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
305b0 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rder ) return 0;
305c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
305d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
305e0 20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e    rev = revIdx ^
305f0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
30600 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  sortOrder;.     
30610 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
30620 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20   ) *pRevMask |= 
30630 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a  MASKBIT(iLoop);.
30640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
30650 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  vSet = 1;.      
30660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30670 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
30680 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
30690 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a  No match found *
306a0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
306b0 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 43 6f 6c 75 6d  j==0 || j<nColum
306c0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
306d0 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
306e0 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b  erDistinct!=0 );
306f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
30700 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
30710 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30720 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
30730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
30740 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65   /* end Loop ove
30750 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  r all index colu
30760 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  mns */.      if(
30770 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
30780 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
30790 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
307a0 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
307b0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
307c0 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nct = 1;.      }
307d0 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66  .    } /* end-if
307e0 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a   not one-row */.
307f0 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
30800 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52   any other ORDER
30810 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72   BY terms that r
30820 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a  eference pLoop *
30830 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65  /.    if( isOrde
30840 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
30850 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74     orderDistinct
30860 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  Mask |= pLoop->m
30870 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66  askSelf;.      f
30880 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
30890 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
308a0 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20    Expr *p;.     
308b0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
308c0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
308d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20  inue;.        p 
308e0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
308f0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
30900 69 66 28 20 28 65 78 70 72 54 61 62 6c 65 55 73  if( (exprTableUs
30910 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  age(&pWInfo->sMa
30920 73 6b 53 65 74 2c 20 70 29 26 7e 6f 72 64 65 72  skSet, p)&~order
30930 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30  DistinctMask)==0
30940 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62   ){.          ob
30950 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
30960 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
30970 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f     }.    }.  } /
30980 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f  * End the loop o
30990 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  ver all WhereLoo
309a0 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f  ps from outer-mo
309b0 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72  st down to inner
309c0 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f  -most */.  if( o
309d0 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72  bSat==obDone ) r
309e0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21  eturn 1;.  if( !
309f0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
30a00 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
30a10 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64  turn -1;.}..#ifd
30a20 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
30a30 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62  ABLED./* For deb
30a40 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a  ugging use only:
30a50 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
30a60 20 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68   char *wherePath
30a70 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a  Name(WherePath *
30a80 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70  pPath, int nLoop
30a90 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61  , WhereLoop *pLa
30aa0 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  st){.  static ch
30ab0 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20  ar zName[65];.  
30ac0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
30ad0 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b  ; i<nLoop; i++){
30ae0 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74   zName[i] = pPat
30af0 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64  h->aLoop[i]->cId
30b00 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20  ; }.  if( pLast 
30b10 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70  ) zName[i++] = p
30b20 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61  Last->cId;.  zNa
30b30 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74  me[i] = 0;.  ret
30b40 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e  urn zName;.}.#en
30b50 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  dif.../*.** Give
30b60 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68  n the list of Wh
30b70 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
30b80 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  at pWInfo->pLoop
30b90 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  s, this routine.
30ba0 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ** attempts to f
30bb0 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
30bc0 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69  ost path that vi
30bd0 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c  sits each WhereL
30be0 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68  oop.** once.  Th
30bf0 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20  is path is then 
30c00 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20  loaded into the 
30c10 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f  pWInfo->a[].pWLo
30c20 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a  op fields..**.**
30c30 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   Assume that the
30c40 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
30c50 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68 61   output rows tha
30c60 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  t will need to b
30c70 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c  e sorted.** will
30c80 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20   be nRowEst (in 
30c90 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72  the 10*log2 repr
30ca0 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72  esentation).  Or
30cb0 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67  , ignore sorting
30cc0 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f  .** costs if nRo
30cd0 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52  wEst==0..**.** R
30ce0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
30cf0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53 51  on success or SQ
30d00 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20  LITE_NOMEM of a 
30d10 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
30d20 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  n.** error occur
30d30 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
30d40 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
30d50 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
30d60 66 6f 2c 20 57 68 65 72 65 43 6f 73 74 20 6e 52  fo, WhereCost nR
30d70 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78  owEst){.  int mx
30d80 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20  Choice;         
30d90 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
30da0 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61  umber of simulta
30db0 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61 63  neous paths trac
30dc0 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ked */.  int nLo
30dd0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
30de0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30df0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69  terms in the joi
30e00 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  n */.  Parse *pP
30e10 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
30e20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
30e30 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
30e40 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
30e50 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
30e60 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
30e70 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20  .  int iLoop;   
30e80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30e90 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65  Loop counter ove
30ea0 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  r the terms of t
30eb0 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74  he join */.  int
30ec0 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20   ii, jj;        
30ed0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
30ee0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
30ef0 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20   mxI = 0;       
30f00 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
30f10 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f  of next entry to
30f20 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 57 68   replace */.  Wh
30f30 65 72 65 43 6f 73 74 20 72 43 6f 73 74 3b 20 20  ereCost rCost;  
30f40 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
30f50 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a 20 20 57  of a path */.  W
30f60 68 65 72 65 43 6f 73 74 20 6e 4f 75 74 3b 20 20  hereCost nOut;  
30f70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30f80 65 72 20 6f 66 20 6f 75 74 70 75 74 73 20 2a 2f  er of outputs */
30f90 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6d 78 43  .  WhereCost mxC
30fa0 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ost = 0;     /* 
30fb0 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20  Maximum cost of 
30fc0 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a  a set of paths *
30fd0 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6d 78  /.  WhereCost mx
30fe0 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Out = 0;      /*
30ff0 20 4d 61 78 69 6d 75 6d 20 6e 4f 75 74 20 76 61   Maximum nOut va
31000 6c 75 65 20 6f 6e 20 74 68 65 20 73 65 74 20 6f  lue on the set o
31010 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 57 68 65  f paths */.  Whe
31020 72 65 43 6f 73 74 20 72 53 6f 72 74 43 6f 73 74  reCost rSortCost
31030 3b 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 74  ;      /* Cost t
31040 6f 20 64 6f 20 61 20 73 6f 72 74 20 2a 2f 0a 20  o do a sort */. 
31050 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b   int nTo, nFrom;
31060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
31070 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e  mber of valid en
31080 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61  tries in aTo[] a
31090 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20  nd aFrom[] */.  
310a0 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d  WherePath *aFrom
310b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ;         /* All
310c0 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20   nFrom paths at 
310d0 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76  the previous lev
310e0 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  el */.  WherePat
310f0 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20  h *aTo;         
31100 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73    /* The nTo bes
31110 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20 63  t paths at the c
31120 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a  urrent level */.
31130 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46 72    WherePath *pFr
31140 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
31150 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72  n element of aFr
31160 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65  om[] that we are
31170 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
31180 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b   WherePath *pTo;
31190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
311a0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b   element of aTo[
311b0 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f  ] that we are wo
311c0 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68  rking on */.  Wh
311d0 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b  ereLoop *pWLoop;
311e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
311f0 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
31200 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65  objects */.  Whe
31210 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20  reLoop **pX;    
31220 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
31230 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70 53  o divy up the pS
31240 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  pace memory */. 
31250 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20   char *pSpace;  
31260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
31270 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75  mporary memory u
31280 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  sed by this rout
31290 69 6e 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ine */..  pParse
312a0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
312b0 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
312c0 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20  ->db;.  nLoop = 
312d0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a  pWInfo->nLevel;.
312e0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72    /* TUNING: For
312f0 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c   simple queries,
31300 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70   only the best p
31310 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a  ath is tracked..
31320 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a    ** For 2-way j
31330 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74  oins, the 5 best
31340 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f   paths are follo
31350 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f  wed..  ** For jo
31360 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65  ins of 3 or more
31370 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74   tables, track t
31380 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73  he 10 best paths
31390 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d   */.  mxChoice =
313a0 20 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20 31 20   (nLoop==1) ? 1 
313b0 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20  : (nLoop==2 ? 5 
313c0 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28  : 10);.  assert(
313d0 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e   nLoop<=pWInfo->
313e0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
313f0 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
31400 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67  x002, ("---- beg
31410 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a  in solver\n"));.
31420 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
31430 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70  nd initialize sp
31440 61 63 65 20 66 6f 72 20 61 54 6f 20 61 6e 64 20  ace for aTo and 
31450 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d 20  aFrom */.  ii = 
31460 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74  (sizeof(WherePat
31470 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  h)+sizeof(WhereL
31480 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43  oop*)*nLoop)*mxC
31490 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53 70 61 63  hoice*2;.  pSpac
314a0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
314b0 6c 6f 63 52 61 77 28 64 62 2c 20 69 69 29 3b 0a  locRaw(db, ii);.
314c0 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20    if( pSpace==0 
314d0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
314e0 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28  NOMEM;.  aTo = (
314f0 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63  WherePath*)pSpac
31500 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f  e;.  aFrom = aTo
31510 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d  +mxChoice;.  mem
31520 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69  set(aFrom, 0, si
31530 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b  zeof(aFrom[0]));
31540 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f  .  pX = (WhereLo
31550 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68  op**)(aFrom+mxCh
31560 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  oice);.  for(ii=
31570 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f  mxChoice*2, pFro
31580 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d  m=aTo; ii>0; ii-
31590 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b  -, pFrom++, pX +
315a0 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46  = nLoop){.    pF
315b0 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b  rom->aLoop = pX;
315c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 64 20  .  }..  /* Seed 
315d0 74 68 65 20 73 65 61 72 63 68 20 77 69 74 68 20  the search with 
315e0 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61  a single WherePa
315f0 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65  th containing ze
31600 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20  ro WhereLoops.. 
31610 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a   **.  ** TUNING:
31620 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20   Do not let the 
31630 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74  number of iterat
31640 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 35  ions go above 25
31650 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20  .  If the cost. 
31660 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67   ** of computing
31670 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
31680 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20  dex is not paid 
31690 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20  back within the 
316a0 66 69 72 73 74 20 32 35 0a 20 20 2a 2a 20 72 6f  first 25.  ** ro
316b0 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ws, then do not 
316c0 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  use the automati
316d0 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46  c index. */.  aF
316e0 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49  rom[0].nRow = MI
316f0 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  N(pParse->nQuery
31700 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73 73 65  Loop, 46);  asse
31710 72 74 28 20 34 36 3d 3d 77 68 65 72 65 43 6f 73  rt( 46==whereCos
31720 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72 6f 6d  t(25) );.  nFrom
31730 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50 72 65 63   = 1;..  /* Prec
31740 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 73 74 20  ompute the cost 
31750 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20 66  of sorting the f
31760 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 65 74 2c  inal result set,
31770 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 0a 20   if the caller. 
31780 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 57 68   ** to sqlite3Wh
31790 65 72 65 42 65 67 69 6e 28 29 20 77 61 73 20 63  ereBegin() was c
317a0 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 73  oncerned about s
317b0 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 72 53 6f 72  orting */.  rSor
317c0 74 43 6f 73 74 20 3d 20 30 3b 0a 20 20 69 66 28  tCost = 0;.  if(
317d0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
317e0 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d  y==0 || nRowEst=
317f0 3d 30 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 5b  =0 ){.    aFrom[
31800 30 5d 2e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  0].isOrderedVali
31810 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
31820 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45      /* TUNING: E
31830 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66  stimated cost of
31840 20 73 6f 72 74 69 6e 67 20 69 73 20 4e 2a 6c 6f   sorting is N*lo
31850 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73  g2(N) where N is
31860 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
31870 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
31880 73 2e 20 2a 2f 0a 20 20 20 20 72 53 6f 72 74 43  s. */.    rSortC
31890 6f 73 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20  ost = nRowEst + 
318a0 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73 74 29 3b  estLog(nRowEst);
318b0 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
318c0 30 78 30 30 32 2c 28 22 2d 2d 2d 2d 20 73 6f 72  0x002,("---- sor
318d0 74 20 63 6f 73 74 3d 25 2d 33 64 5c 6e 22 2c 20  t cost=%-3d\n", 
318e0 72 53 6f 72 74 43 6f 73 74 29 29 3b 0a 20 20 7d  rSortCost));.  }
318f0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73  ..  /* Compute s
31900 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67  uccessively long
31910 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73  er WherePaths us
31920 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73  ing the previous
31930 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a   generation.  **
31940 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61   of WherePaths a
31950 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20  s the basis for 
31960 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20  the next.  Keep 
31970 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43  track of the mxC
31980 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20  hoice.  ** best 
31990 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65  paths at each ge
319a0 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f  neration */.  fo
319b0 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70  r(iLoop=0; iLoop
319c0 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  <nLoop; iLoop++)
319d0 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20  {.    nTo = 0;. 
319e0 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72     for(ii=0, pFr
319f0 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72  om=aFrom; ii<nFr
31a00 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b  om; ii++, pFrom+
31a10 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57  +){.      for(pW
31a20 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Loop=pWInfo->pLo
31a30 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c  ops; pWLoop; pWL
31a40 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78  oop=pWLoop->pNex
31a50 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20  tLoop){.        
31a60 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b  Bitmask maskNew;
31a70 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
31a80 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20   revMask = 0;.  
31a90 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65 72        u8 isOrder
31aa0 65 64 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d 2d  edValid = pFrom-
31ab0 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b  >isOrderedValid;
31ac0 0a 20 20 20 20 20 20 20 20 75 38 20 69 73 4f 72  .        u8 isOr
31ad0 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69  dered = pFrom->i
31ae0 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20  sOrdered;.      
31af0 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70    if( (pWLoop->p
31b00 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e  rereq & ~pFrom->
31b10 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
31b20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
31b30 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61   if( (pWLoop->ma
31b40 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e  skSelf & pFrom->
31b50 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
31b60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
31b70 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
31b80 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63  t, pWLoop is a c
31b90 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74  andidate to be t
31ba0 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20  he next loop. . 
31bb0 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74         ** Comput
31bc0 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20  e its cost */.  
31bd0 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68        rCost = wh
31be0 65 72 65 43 6f 73 74 41 64 64 28 70 57 4c 6f 6f  ereCostAdd(pWLoo
31bf0 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70  p->rSetup,pWLoop
31c00 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e  ->rRun + pFrom->
31c10 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72  nRow);.        r
31c20 43 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74  Cost = whereCost
31c30 41 64 64 28 72 43 6f 73 74 2c 20 70 46 72 6f 6d  Add(rCost, pFrom
31c40 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  ->rCost);.      
31c50 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e    nOut = pFrom->
31c60 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e  nRow + pWLoop->n
31c70 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73  Out;.        mas
31c80 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61  kNew = pFrom->ma
31c90 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d  skLoop | pWLoop-
31ca0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
31cb0 20 20 20 69 66 28 20 21 69 73 4f 72 64 65 72 65     if( !isOrdere
31cc0 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  dValid ){.      
31cd0 20 20 20 20 73 77 69 74 63 68 28 20 77 68 65 72      switch( wher
31ce0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
31cf0 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20  derBy(pWInfo,.  
31d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d10 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
31d20 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57  derBy, pFrom, pW
31d30 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
31d40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31d50 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20           iLoop, 
31d60 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b  pWLoop, &revMask
31d70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
31d80 20 63 61 73 65 20 31 3a 20 20 2f 2a 20 59 65 73   case 1:  /* Yes
31d90 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20  .  pFrom+pWLoop 
31da0 64 6f 65 73 20 73 61 74 69 73 66 79 20 74 68 65  does satisfy the
31db0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
31dc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
31dd0 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 31 3b    isOrdered = 1;
31de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
31df0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20  sOrderedValid = 
31e00 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
31e10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
31e20 20 20 20 20 63 61 73 65 20 30 3a 20 20 2f 2a 20      case 0:  /* 
31e30 4e 6f 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f  No.  pFrom+pWLoo
31e40 70 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  p will require a
31e50 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 2a   separate sort *
31e60 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
31e70 69 73 4f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20  isOrdered = 0;. 
31e80 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
31e90 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b  rderedValid = 1;
31ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
31eb0 43 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74  Cost = whereCost
31ec0 41 64 64 28 72 43 6f 73 74 2c 20 72 53 6f 72 74  Add(rCost, rSort
31ed0 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Cost);.         
31ee0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
31ef0 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
31f00 20 2f 2a 20 43 61 6e 6e 6f 74 20 74 65 6c 6c 20   /* Cannot tell 
31f10 79 65 74 2e 20 20 54 72 79 20 61 67 61 69 6e 20  yet.  Try again 
31f20 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  on the next iter
31f30 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
31f40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
31f50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31f70 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72     revMask = pFr
31f80 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20  om->revLoop;.   
31f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
31fa0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
31fb0 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20  f pWLoop should 
31fc0 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
31fd0 6d 78 43 68 6f 69 63 65 20 62 65 73 74 20 73 6f  mxChoice best so
31fe0 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
31ff0 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54  for(jj=0, pTo=aT
32000 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c  o; jj<nTo; jj++,
32010 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
32020 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b     if( pTo->mask
32030 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20  Loop==maskNew.  
32040 20 20 20 20 20 20 20 20 20 26 26 20 70 54 6f 2d           && pTo-
32050 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3d  >isOrderedValid=
32060 3d 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 0a  =isOrderedValid.
32070 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28             && ((
32080 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73  pTo->rCost<=rCos
32090 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d  t && pTo->nRow<=
320a0 6e 4f 75 74 29 20 7c 7c 0a 20 20 20 20 20 20 20  nOut) ||.       
320b0 20 20 20 20 20 20 20 20 20 28 70 54 6f 2d 3e 72           (pTo->r
320c0 43 6f 73 74 3e 3d 72 43 6f 73 74 20 26 26 20 70  Cost>=rCost && p
320d0 54 6f 2d 3e 6e 52 6f 77 3e 3d 6e 4f 75 74 29 29  To->nRow>=nOut))
320e0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
320f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
32100 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b  se( jj==nTo-1 );
32110 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
32120 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
32130 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32140 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b    if( jj>=nTo ){
32150 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
32160 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 26 26 20  To>=mxChoice && 
32170 72 43 6f 73 74 3e 3d 6d 78 43 6f 73 74 20 29 7b  rCost>=mxCost ){
32180 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
32190 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
321a0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
321b0 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
321c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
321d0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
321e0 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20  intf("Skip   %s 
321f0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
32200 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
32210 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
32220 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
32230 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
32240 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
32250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32260 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
32270 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27  ? (isOrdered ? '
32280 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
32290 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
322a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
322b0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
322c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
322d0 20 20 20 2f 2a 20 41 64 64 20 61 20 6e 65 77 20     /* Add a new 
322e0 50 61 74 68 20 74 6f 20 74 68 65 20 61 54 6f 5b  Path to the aTo[
322f0 5d 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 20  ] set */.       
32300 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f     if( nTo<mxCho
32310 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
32320 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74     /* Increase t
32330 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
32340 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f  To set by one */
32350 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
32360 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  = nTo++;.       
32370 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32380 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74        /* New pat
32390 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 70  h replaces the p
323a0 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65  rior worst to ke
323b0 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d  ep count below m
323c0 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20  xChoice */.     
323d0 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b         jj = mxI;
323e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
323f0 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54         pTo = &aT
32400 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48  o[jj];.#ifdef WH
32410 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
32420 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
32430 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
32440 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
32450 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
32460 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25  Printf("New    %
32470 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
32480 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
32490 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
324a0 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
324b0 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
324c0 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
324d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
324e0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
324f0 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  (isOrdered ? 'Y'
32500 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
32510 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
32520 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  if.        }else
32530 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
32540 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73  pTo->rCost<=rCos
32550 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d  t && pTo->nRow<=
32560 6e 4f 75 74 20 29 7b 0a 23 69 66 64 65 66 20 57  nOut ){.#ifdef W
32570 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
32580 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  D.            if
32590 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
325a0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
325b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
325c0 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
325d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
325e0 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25  Skip   %s cost=%
325f0 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
32600 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
32610 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
32620 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
32630 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
32640 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
32650 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
32660 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64  edValid ? (isOrd
32670 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
32680 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
32690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
326a0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76  ebugPrintf("   v
326b0 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  s %s cost=%-3d,%
326c0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
326d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326e0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
326f0 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
32700 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
32710 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
32720 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
32730 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
32740 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20  (pTo->isOrdered 
32750 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
32760 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
32770 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
32780 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
32790 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73  pTo->rCost==rCos
327a0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t );.           
327b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
327c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
327d0 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e   testcase( pTo->
327e0 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29  rCost==rCost+1 )
327f0 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;.          /* A
32800 20 6e 65 77 20 61 6e 64 20 62 65 74 74 65 72 20   new and better 
32810 73 63 6f 72 65 20 66 6f 72 20 61 20 70 72 65 76  score for a prev
32820 69 6f 75 73 6c 79 20 63 72 65 61 74 65 64 20 65  iously created e
32830 71 75 69 76 61 6c 65 6e 74 20 70 61 74 68 20 2a  quivalent path *
32840 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
32850 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
32860 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
32870 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
32880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
32890 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
328a0 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
328b0 20 20 20 22 55 70 64 61 74 65 20 25 73 20 63 6f     "Update %s co
328c0 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65  st=%-3d,%3d orde
328d0 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
328e0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
328f0 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
32900 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
32910 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
32920 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
32930 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64  edValid ? (isOrd
32940 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
32950 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
32960 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
32970 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20  ugPrintf("  was 
32980 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
32990 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
329a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
329b0 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
329c0 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
329d0 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
329e0 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
329f0 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
32a00 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d  redValid ? (pTo-
32a10 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  >isOrdered ? 'Y'
32a20 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
32a30 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
32a40 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
32a50 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69       /* pWLoop i
32a60 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64  s a winner.  Add
32a70 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f   it to the set o
32a80 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f  f best so far */
32a90 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61  .        pTo->ma
32aa0 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  skLoop = pFrom->
32ab0 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
32ac0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
32ad0 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f       pTo->revLoo
32ae0 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  p = revMask;.   
32af0 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d       pTo->nRow =
32b00 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70   nOut;.        p
32b10 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73  To->rCost = rCos
32b20 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
32b30 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
32b40 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b   isOrderedValid;
32b50 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73  .        pTo->is
32b60 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65  Ordered = isOrde
32b70 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  red;.        mem
32b80 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20  cpy(pTo->aLoop, 
32b90 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69  pFrom->aLoop, si
32ba0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29  zeof(WhereLoop*)
32bb0 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  *iLoop);.       
32bc0 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f   pTo->aLoop[iLoo
32bd0 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20  p] = pWLoop;.   
32be0 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
32bf0 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
32c00 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20      mxI = 0;.   
32c10 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
32c20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20  aTo[0].rCost;.  
32c30 20 20 20 20 20 20 20 20 6d 78 4f 75 74 20 3d 20          mxOut = 
32c40 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20  aTo[0].nRow;.   
32c50 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c         for(jj=1,
32c60 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a   pTo=&aTo[1]; jj
32c70 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c  <mxChoice; jj++,
32c80 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
32c90 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
32ca0 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 70  ost>mxCost || (p
32cb0 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73  To->rCost==mxCos
32cc0 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3e 6d  t && pTo->nRow>m
32cd0 78 4f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 20  xOut) ){.       
32ce0 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
32cf0 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20  pTo->rCost;.    
32d00 20 20 20 20 20 20 20 20 20 20 6d 78 4f 75 74 20            mxOut 
32d10 3d 20 70 54 6f 2d 3e 6e 52 6f 77 3b 0a 20 20 20  = pTo->nRow;.   
32d20 20 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d             mxI =
32d30 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20   jj;.           
32d40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
32d50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32d60 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57  .    }..#ifdef W
32d70 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
32d80 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
32d90 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20 29  3WhereTrace>=2 )
32da0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
32db0 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d  ebugPrintf("----
32dc0 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20   after round %d 
32dd0 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b  ----\n", iLoop);
32de0 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c  .      for(ii=0,
32df0 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f   pTo=aTo; ii<nTo
32e00 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; ii++, pTo++){.
32e10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
32e20 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73 20  ebugPrintf(" %s 
32e30 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25  cost=%-3d nrow=%
32e40 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  -3d order=%c",. 
32e50 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
32e60 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
32e70 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
32e80 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
32e90 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d  .           pTo-
32ea0 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  >isOrderedValid 
32eb0 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
32ec0 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
32ed0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69   '?');.        i
32ee0 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  f( pTo->isOrdere
32ef0 64 56 61 6c 69 64 20 26 26 20 70 54 6f 2d 3e 69  dValid && pTo->i
32f00 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20  sOrdered ){.    
32f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
32f20 75 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30  ugPrintf(" rev=0
32f30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72  x%llx\n", pTo->r
32f40 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  evLoop);.       
32f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32f60 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
32f70 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
32f80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
32f90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
32fa0 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65  /* Swap the role
32fb0 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61  s of aFrom and a
32fc0 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  To for the next 
32fd0 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
32fe0 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20    pFrom = aTo;. 
32ff0 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a     aTo = aFrom;.
33000 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f      aFrom = pFro
33010 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e  m;.    nFrom = n
33020 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e  To;.  }..  if( n
33030 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  From==0 ){.    s
33040 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
33050 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79  Parse, "no query
33060 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20   solution");.   
33070 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
33080 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20  b, pSpace);.    
33090 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
330a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ROR;.  }.  .  /*
330b0 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74   Find the lowest
330c0 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72   cost path.  pFr
330d0 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20  om will be left 
330e0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74  pointing to that
330f0 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d   path */.  pFrom
33100 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28   = aFrom;.  for(
33110 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  ii=1; ii<nFrom; 
33120 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
33130 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f  From->rCost>aFro
33140 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46  m[ii].rCost ) pF
33150 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d  rom = &aFrom[ii]
33160 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
33170 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
33180 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f  nLoop );.  /* Lo
33190 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  ad the lowest co
331a0 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49  st path into pWI
331b0 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  nfo */.  for(iLo
331c0 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
331d0 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
331e0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
331f0 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20  vel = pWInfo->a 
33200 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65  + iLoop;.    pLe
33210 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57  vel->pWLoop = pW
33220 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c  Loop = pFrom->aL
33230 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20  oop[iLoop];.    
33240 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20  pLevel->iFrom = 
33250 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20  pWLoop->iTab;.  
33260 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75    pLevel->iTabCu
33270 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  r = pWInfo->pTab
33280 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
33290 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a  iFrom].iCursor;.
332a0 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66    }.  if( (pWInf
332b0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
332c0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
332d0 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70  NCT)!=0.   && (p
332e0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
332f0 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
33300 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70  CTBY)==0.   && p
33310 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
33320 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
33330 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77  _NOOP.   && nRow
33340 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74  Est.  ){.    Bit
33350 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20  mask notUsed;.  
33360 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65    int rc = where
33370 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
33380 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49  erBy(pWInfo, pWI
33390 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c  nfo->pResultSet,
333a0 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20   pFrom,.        
333b0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 44           WHERE_D
333c0 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70  ISTINCTBY, nLoop
333d0 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  -1, pFrom->aLoop
333e0 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55  [nLoop-1], &notU
333f0 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sed);.    if( rc
33400 3d 3d 31 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44  ==1 ) pWInfo->eD
33410 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
33420 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
33430 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 6f  ;.  }.  if( pFro
33440 6d 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a  m->isOrdered ){.
33450 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
33460 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
33470 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b  RE_DISTINCTBY ){
33480 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
33490 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
334a0 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
334b0 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
334c0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53      pWInfo->bOBS
334d0 61 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 57  at = 1;.      pW
334e0 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
334f0 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
33500 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e      }.  }.  pWIn
33510 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46  fo->nRowOut = pF
33520 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a  rom->nRow;..  /*
33530 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20   Free temporary 
33540 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72  memory and retur
33550 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73  n success */.  s
33560 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
33570 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75   pSpace);.  retu
33580 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
33590 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72  ./*.** Most quer
335a0 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73  ies use only a s
335b0 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65  ingle table (the
335c0 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29  y are not joins)
335d0 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d   and have.** sim
335e0 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ple == constrain
335f0 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78  ts against index
33600 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73  ed fields.  This
33610 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
33620 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f  s.** to plan tho
33630 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20  se simple cases 
33640 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20  using much less 
33650 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68  ceremony than th
33660 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72  e.** general-pur
33670 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e  pose query plann
33680 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20  er, and thereby 
33690 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c  yield faster sql
336a0 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a  ite3_prepare().*
336b0 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20  * times for the 
336c0 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a  common case..**.
336d0 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
336e0 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69  ro on success, i
336f0 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  f this query can
33700 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74   be handled by t
33710 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73  his.** no-frills
33720 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20   query planner. 
33730 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20   Return zero if 
33740 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73  this query needs
33750 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c   the .** general
33760 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70  -purpose query p
33770 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  lanner..*/.stati
33780 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74  c int whereShort
33790 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  Cut(WhereLoopBui
337a0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
337b0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
337c0 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53  Info;.  struct S
337d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
337e0 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  em;.  WhereClaus
337f0 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54  e *pWC;.  WhereT
33800 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68  erm *pTerm;.  Wh
33810 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a  ereLoop *pLoop;.
33820 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e    int iCur;.  in
33830 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  t j;.  Table *pT
33840 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
33850 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d  x;.  .  pWInfo =
33860 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
33870 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  o;.  if( pWInfo-
33880 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
33890 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20  ERE_FORCE_TABLE 
338a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
338b0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54  sert( pWInfo->pT
338c0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20  abList->nSrc>=1 
338d0 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49  );.  pItem = pWI
338e0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
338f0 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d  ;.  pTab = pItem
33900 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73  ->pTab;.  if( Is
33910 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
33920 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
33930 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20  pItem->zIndex ) 
33940 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72  return 0;.  iCur
33950 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
33960 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  r;.  pWC = &pWIn
33970 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70  fo->sWC;.  pLoop
33980 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
33990 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  w;.  pLoop->wsFl
339a0 61 67 73 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d  ags = 0;.  pTerm
339b0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
339c0 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
339d0 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  _EQ, 0);.  if( p
339e0 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  Term ){.    pLoo
339f0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
33a00 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
33a10 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45  RE_IPK|WHERE_ONE
33a20 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  ROW;.    pLoop->
33a30 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
33a40 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  m;.    pLoop->nL
33a50 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c  Term = 1;.    pL
33a60 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
33a70 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e   = 1;.    /* TUN
33a80 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72  ING: Cost of a r
33a90 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31  owid lookup is 1
33aa0 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 */.    pLoop->
33ab0 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33  rRun = 33;  /* 3
33ac0 33 3d 3d 77 68 65 72 65 43 6f 73 74 28 31 30 29  3==whereCost(10)
33ad0 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
33ae0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
33af0 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
33b00 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
33b10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33b20 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
33b30 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  e==pLoop->aLTerm
33b40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
33b50 28 20 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f  ( ArraySize(pLoo
33b60 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3d  p->aLTermSpace)=
33b70 3d 34 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =4 );.      if( 
33b80 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
33b90 45 5f 4e 6f 6e 65 20 0a 20 20 20 20 20 20 20 7c  E_None .       |
33ba0 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  | pIdx->pPartIdx
33bb0 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20  Where!=0 .      
33bc0 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   || pIdx->nColum
33bd0 6e 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f  n>ArraySize(pLoo
33be0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20  p->aLTermSpace) 
33bf0 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75  .      ) continu
33c00 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  e;.      for(j=0
33c10 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; j<pIdx->nColum
33c20 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
33c30 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
33c40 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 49 64  m(pWC, iCur, pId
33c50 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20  x->aiColumn[j], 
33c60 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b  0, WO_EQ, pIdx);
33c70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
33c80 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rm==0 ) break;. 
33c90 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
33ca0 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b  Term[j] = pTerm;
33cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
33cc0 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 43 6f 6c  f( j!=pIdx->nCol
33cd0 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
33ce0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46        pLoop->wsF
33cf0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
33d00 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45  UMN_EQ|WHERE_ONE
33d10 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45  ROW|WHERE_INDEXE
33d20 44 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 49  D;.      if( (pI
33d30 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e  tem->colUsed & ~
33d40 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70  columnsInIndex(p
33d50 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Idx))==0 ){.    
33d60 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
33d70 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f  gs |= WHERE_IDX_
33d80 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ONLY;.      }.  
33d90 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
33da0 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  m = j;.      pLo
33db0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
33dc0 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  = j;.      pLoop
33dd0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
33de0 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f   = pIdx;.      /
33df0 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
33e00 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  f a unique index
33e10 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f   lookup is 15 */
33e20 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  .      pLoop->rR
33e30 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d  un = 39;  /* 39=
33e40 3d 77 68 65 72 65 43 6f 73 74 28 31 35 29 20 2a  =whereCost(15) *
33e50 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
33e60 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
33e70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b  Loop->wsFlags ){
33e80 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  .    pLoop->nOut
33e90 20 3d 20 28 57 68 65 72 65 43 6f 73 74 29 31 3b   = (WhereCost)1;
33ea0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
33eb0 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70  ].pWLoop = pLoop
33ec0 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73  ;.    pLoop->mas
33ed0 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28  kSelf = getMask(
33ee0 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
33ef0 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57  t, iCur);.    pW
33f00 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43  Info->a[0].iTabC
33f10 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  ur = iCur;.    p
33f20 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d  WInfo->nRowOut =
33f30 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   1;.    if( pWIn
33f40 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70  fo->pOrderBy ) p
33f50 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20  WInfo->bOBSat = 
33f60 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   1;.    if( pWIn
33f70 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
33f80 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
33f90 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57  INCT ){.      pW
33fa0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
33fb0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
33fc0 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23  _UNIQUE;.    }.#
33fd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
33fe0 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49  UG.    pLoop->cI
33ff0 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a  d = '0';.#endif.
34000 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
34010 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
34020 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
34030 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
34040 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66   the loop used f
34050 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  or WHERE clause 
34060 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54  processing..** T
34070 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
34080 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
34090 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74  an opaque struct
340a0 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ure that contain
340b0 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  s.** information
340c0 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69   needed to termi
340d0 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20  nate the loop.  
340e0 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69  Later, the calli
340f0 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68  ng routine.** sh
34100 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69  ould invoke sqli
34110 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69  te3WhereEnd() wi
34120 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  th the return va
34130 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
34140 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  tion.** in order
34150 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
34160 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
34170 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
34180 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
34190 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  rs, this routine
341a0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a   returns NULL..*
341b0 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69  *.** The basic i
341c0 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e  dea is to do a n
341d0 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20  ested loop, one 
341e0 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61  loop for each ta
341f0 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52  ble in.** the FR
34200 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73  OM clause of a s
34210 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20  elect.  (INSERT 
34220 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65  and UPDATE state
34230 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a  ments are the.**
34240 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43   same as a SELEC
34250 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69  T with only a si
34260 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68  ngle table in th
34270 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20  e FROM clause.) 
34280 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c   For.** example,
34290 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74   if the SQL is t
342a0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
342b0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
342c0 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20  1, t2, t3 WHERE 
342d0 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...;.**.** Then 
342e0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
342f0 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c  ed is conceptual
34300 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c  ly like the foll
34310 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
34320 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
34330 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20  n t1 do       \ 
34340 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65     Code generate
34350 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65  d.**        fore
34360 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
34370 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71  o      |-- by sq
34380 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
34390 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f  ).**          fo
343a0 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33  reach row3 in t3
343b0 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20   do   /.**      
343c0 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
343d0 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
343e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20                \ 
343f0 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65     Code generate
34400 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20  d.**        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 7c 2d 2d 20 62 79 20 73 71         |-- by sq
34430 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a  lite3WhereEnd().
34440 2a 2a 20 20 20 20 20 20 65 6e 64 20 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 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65      /.**.** Note
34470 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20   that the loops 
34480 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73  might not be nes
34490 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  ted in the order
344a0 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a   in which they.*
344b0 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  * appear in the 
344c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61  FROM clause if a
344d0 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
344e0 20 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20   is better able 
344f0 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f  to make.** use o
34500 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65  f indices.  Note
34510 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20   also that when 
34520 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
34530 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68  appears in.** th
34540 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
34550 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  it might result 
34560 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65  in additional ne
34570 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a  sted loops for.*
34580 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  * scanning throu
34590 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e  gh all values on
345a0 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
345b0 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a  side of the IN..
345c0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
345d0 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73  Btree cursors as
345e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
345f0 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73  ch table.  t1 us
34600 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d  es cursor.** num
34610 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ber pTabList->a[
34620 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20  0].iCursor.  t2 
34630 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20  uses the cursor 
34640 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69  pTabList->a[1].i
34650 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73  Cursor..** And s
34660 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72  o forth.  This r
34670 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
34680 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68   code to open th
34690 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73  ose VDBE cursors
346a0 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57  .** and sqlite3W
346b0 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61  hereEnd() genera
346c0 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20  tes the code to 
346d0 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  close them..**.*
346e0 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20  * The code that 
346f0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
34700 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65  n() generates le
34710 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73  aves the cursors
34720 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61   named.** in pTa
34730 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61  bList pointing a
34740 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69  t their appropri
34750 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68  ate entries.  Th
34760 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20  e [...] code.** 
34770 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d  can use OP_Colum
34780 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f  n and OP_Rowid o
34790 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20  pcodes on these 
347a0 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61  cursors to extra
347b0 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  ct.** data from 
347c0 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c  the various tabl
347d0 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  es of the loop..
347e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45  **.** If the WHE
347f0 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70  RE clause is emp
34800 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20  ty, the foreach 
34810 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20  loops must each 
34820 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e  scan their.** en
34830 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68  tire tables.  Th
34840 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a  us a three-way j
34850 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29  oin is an O(N^3)
34860 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74   operation.  But
34870 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
34880 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61  s have indices a
34890 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72  nd there are ter
348a0 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
348b0 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72  clause that.** r
348c0 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e  efer to those in
348d0 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74  dices, a complet
348e0 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e  e table scan can
348f0 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20   be avoided and 
34900 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c  the.** code will
34910 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72   run much faster
34920 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77  .  Most of the w
34930 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ork of this rout
34940 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a  ine is checking.
34950 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ** to see if the
34960 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74  re are indices t
34970 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
34980 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20  to speed up the 
34990 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  loop..**.** Term
349a0 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
349b0 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75  lause are also u
349c0 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69  sed to limit whi
349d0 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79  ch rows actually
349e0 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74  .** make it to t
349f0 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20  he "..." in the 
34a00 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f  middle of the lo
34a10 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  op.  After each 
34a20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65  "foreach",.** te
34a30 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
34a40 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65   clause that use
34a50 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74   only terms in t
34a60 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74  hat loop and out
34a70 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20  er.** loops are 
34a80 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66  evaluated and if
34a90 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73   false a jump is
34aa0 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c   made around all
34ab0 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69   subsequent.** i
34ac0 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61  nner loops (or a
34ad0 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20  round the "..." 
34ae0 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75  if the test occu
34af0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e  rs within the in
34b00 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f  ner-.** most loo
34b10 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a  p).**.** OUTER J
34b20 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75  OINS.**.** An ou
34b30 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c  ter join of tabl
34b40 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20  es t1 and t2 is 
34b50 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65  conceptally code
34b60 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
34b70 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72  .**    foreach r
34b80 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20  ow1 in t1 do.** 
34b90 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a       flag = 0.**
34ba0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
34bb0 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20  w2 in t2 do.**  
34bc0 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20        start:.** 
34bd0 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
34be0 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20           flag = 
34bf0 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a  1.**      end.**
34c00 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30        if flag==0
34c10 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20   then.**        
34c20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75  move the row2 cu
34c30 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72  rsor to a null r
34c40 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74  ow.**        got
34c50 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20  o start.**      
34c60 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a  fi.**    end.**.
34c70 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55  ** ORDER BY CLAU
34c80 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a  SE PROCESSING.**
34c90 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20  .** pOrderBy is 
34ca0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
34cb0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
34cc0 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42   (or the GROUP B
34cd0 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74  Y clause.** if t
34ce0 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  he WHERE_GROUPBY
34cf0 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20   flag is set in 
34d00 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61  wctrlFlags) of a
34d10 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
34d20 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  t.** if there is
34d30 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20   one.  If there 
34d40 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  is no ORDER BY c
34d50 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73  lause or if this
34d60 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
34d70 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50  alled from an UP
34d80 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
34d90 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70  tatement, then p
34da0 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e  OrderBy is NULL.
34db0 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73  .*/.WhereInfo *s
34dc0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
34dd0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
34de0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
34df0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
34e00 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
34e10 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 46 52  abList,    /* FR
34e20 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73  OM clause: A lis
34e30 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  t of all tables 
34e40 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f  to be scanned */
34e50 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
34e60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
34e70 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
34e80 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
34e90 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52  erBy,   /* An OR
34ea0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f  DER BY clause, o
34eb0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  r NULL */.  Expr
34ec0 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74  List *pResultSet
34ed0 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 20  , /* Result set 
34ee0 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
34ef0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
34f00 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  ,       /* One o
34f10 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  f the WHERE_* fl
34f20 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
34f30 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20  qliteInt.h */.  
34f40 69 6e 74 20 69 49 64 78 43 75 72 20 20 20 20 20  int iIdxCur     
34f50 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52        /* If WHER
34f60 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
34f70 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75  is set, index cu
34f80 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  rsor number */.)
34f90 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e  {.  int nByteWIn
34fa0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
34fb0 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c  * Num. bytes all
34fc0 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65  ocated for Where
34fd0 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20  Info struct */. 
34fe0 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20   int nTabList;  
34ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
35000 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
35010 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f  s in pTabList */
35020 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
35030 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a  Info;         /*
35040 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   Will become the
35050 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
35060 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
35070 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
35080 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f  arse->pVdbe;   /
35090 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61  * The virtual da
350a0 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f  tabase engine */
350b0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
350c0 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ady;          /*
350d0 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   Cursors that ar
350e0 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69  e not yet positi
350f0 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oned */.  WhereL
35100 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b  oopBuilder sWLB;
35110 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
35120 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f  eLoop builder */
35130 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
35140 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a  *pMaskSet;    /*
35150 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
35160 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68  mask set */.  Wh
35170 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
35180 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69  ;        /* A si
35190 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57  ngle level in pW
351a0 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57  Info->a[] */.  W
351b0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
351c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
351d0 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65  nter to a single
351e0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
351f0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  t */.  int ii;  
35200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35210 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
35220 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
35230 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
35240 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
35250 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
35260 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
35270 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
35280 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f  rn code */...  /
35290 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69  * Variable initi
352a0 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64  alization */.  d
352b0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
352c0 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20    memset(&sWLB, 
352d0 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29  0, sizeof(sWLB))
352e0 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  ;.  sWLB.pOrderB
352f0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20  y = pOrderBy;.. 
35300 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20   /* Disable the 
35310 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a  DISTINCT optimiz
35320 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ation if SQLITE_
35330 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73  DistinctOpt is s
35340 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69  et via.  ** sqli
35350 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51  te3_test_ctrl(SQ
35360 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
35370 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29  TIMIZATIONS,...)
35380 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
35390 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
353a0 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  b, SQLITE_Distin
353b0 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63  ctOpt) ){.    wc
353c0 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  trlFlags &= ~WHE
353d0 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
353e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
353f0 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  number of tables
35400 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
35410 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
35420 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
35430 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42    ** bits in a B
35440 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74  itmask .  */.  t
35450 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73  estcase( pTabLis
35460 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a  t->nSrc==BMS );.
35470 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
35480 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20  nSrc>BMS ){.    
35490 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
354a0 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
354b0 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
354c0 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20  join", BMS);.   
354d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
354e0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
354f0 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65  on normally gene
35500 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c  rates a nested l
35510 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  oop for all tabl
35520 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62  es in .  ** pTab
35530 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68  List.  But if th
35540 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  e WHERE_ONETABLE
35550 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
35560 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c  t, then we shoul
35570 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65  d.  ** only gene
35580 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
35590 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e  e first table in
355a0 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73   pTabList and as
355b0 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61  sume that.  ** a
355c0 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ny cursors assoc
355d0 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65  iated with subse
355e0 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65  quent tables are
355f0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
35600 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20    */.  nTabList 
35610 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  = (wctrlFlags & 
35620 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
35630 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c  NLY) ? 1 : pTabL
35640 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a  ist->nSrc;..  /*
35650 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
35660 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65  itialize the Whe
35670 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
35680 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
35690 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72  e the.  ** retur
356a0 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c  n value. A singl
356b0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
356c0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
356d0 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a  e WhereInfo.  **
356e0 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e   struct, the con
356f0 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e  tents of WhereIn
35700 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72  fo.a[], the Wher
35710 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
35720 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57  e.  ** and the W
35730 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
35740 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65  cture. Since Whe
35750 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  reClause contain
35760 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a  s an 8-byte.  **
35770 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74   field (type Bit
35780 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65  mask) it must be
35790 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38   aligned on an 8
357a0 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f  -byte boundary o
357b0 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68  n.  ** some arch
357c0 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65  itectures. Hence
357d0 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65   the ROUND8() be
357e0 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74  low..  */.  nByt
357f0 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28  eWInfo = ROUND8(
35800 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f  sizeof(WhereInfo
35810 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73  )+(nTabList-1)*s
35820 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
35830 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73  ));.  pWInfo = s
35840 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
35850 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66  ro(db, nByteWInf
35860 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65  o + sizeof(Where
35870 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62  Loop));.  if( db
35880 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
35890 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
358a0 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
358b0 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b  .    pWInfo = 0;
358c0 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
358d0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  eginError;.  }. 
358e0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
358f0 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = nTabList;.  pW
35900 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
35910 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
35920 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
35930 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
35940 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
35950 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rBy;.  pWInfo->p
35960 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65 73  ResultSet = pRes
35970 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f  ultSet;.  pWInfo
35980 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ->iBreak = sqlit
35990 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
359a0 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63  v);.  pWInfo->wc
359b0 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c  trlFlags = wctrl
359c0 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d  Flags;.  pWInfo-
359d0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
359e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
359f0 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65  yLoop;.  pMaskSe
35a00 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  t = &pWInfo->sMa
35a10 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57  skSet;.  sWLB.pW
35a20 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20  Info = pWInfo;. 
35a30 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49   sWLB.pWC = &pWI
35a40 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42  nfo->sWC;.  sWLB
35a50 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f  .pNew = (WhereLo
35a60 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49  op*)(((char*)pWI
35a70 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29  nfo)+nByteWInfo)
35a80 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
35a90 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
35aa0 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20  (sWLB.pNew) );. 
35ab0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73   whereLoopInit(s
35ac0 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65  WLB.pNew);.#ifde
35ad0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
35ae0 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20   sWLB.pNew->cId 
35af0 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20  = '*';.#endif.. 
35b00 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48   /* Split the WH
35b10 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20  ERE clause into 
35b20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72  separate subexpr
35b30 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61  essions where ea
35b40 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65  ch.  ** subexpre
35b50 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
35b60 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65  ed by an AND ope
35b70 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e  rator..  */.  in
35b80 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53  itMaskSet(pMaskS
35b90 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  et);.  whereClau
35ba0 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e  seInit(&pWInfo->
35bb0 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  sWC, pWInfo);.  
35bc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
35bd0 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c  onstants(pParse,
35be0 20 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72   pWhere);.  wher
35bf0 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e  eSplit(&pWInfo->
35c00 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f  sWC, pWhere, TK_
35c10 41 4e 44 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  AND);.  sqlite3C
35c20 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
35c30 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20  pParse, -1); /* 
35c40 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69  Insert the cooki
35c50 65 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20  e verifier Goto 
35c60 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65  */.    .  /* Spe
35c70 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45  cial case: a WHE
35c80 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
35c90 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61  s constant.  Eva
35ca0 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65  luate the.  ** e
35cb0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69  xpression and ei
35cc0 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61  ther jump over a
35cd0 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f  ll of the code o
35ce0 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a  r fall thru..  *
35cf0 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 26  /.  if( pWhere &
35d00 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c  & (nTabList==0 |
35d10 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  | sqlite3ExprIsC
35d20 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
35d30 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73  Where)) ){.    s
35d40 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
35d50 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  e(pParse, pWhere
35d60 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
35d70 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
35d80 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72 65  ULL);.    pWhere
35d90 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
35da0 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f  Special case: No
35db0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
35dc0 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74  /.  if( nTabList
35dd0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
35de0 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f  OrderBy ) pWInfo
35df0 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20 20  ->bOBSat = 1;.  
35e00 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
35e10 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
35e20 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
35e30 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
35e40 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
35e50 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
35e60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67  .  }..  /* Assig
35e70 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65  n a bit from the
35e80 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72   bitmask to ever
35e90 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52  y term in the FR
35ea0 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OM clause..  **.
35eb0 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e    ** When assign
35ec0 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75  ing bitmask valu
35ed0 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73  es to FROM claus
35ee0 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75  e cursors, it mu
35ef0 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63  st be.  ** the c
35f00 61 73 65 20 74 68 61 74 20 69 66 20 58 20 69 73  ase that if X is
35f10 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
35f20 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63   the N-th FROM c
35f30 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a  lause term then.
35f40 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b    ** the bitmask
35f50 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c   for all FROM cl
35f60 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68  ause terms to th
35f70 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d  e left of the N-
35f80 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20  th term.  ** is 
35f90 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72  (X-1).   An expr
35fa0 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ession from the 
35fb0 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c  ON clause of a L
35fc0 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65  EFT JOIN can use
35fd0 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69  .  ** its Expr.i
35fe0 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76  RightJoinTable v
35ff0 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65  alue to find the
36000 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20   bitmask of the 
36010 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a  right table.  **
36020 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53   of the join.  S
36030 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66  ubtracting one f
36040 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74 61  rom the right ta
36050 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65  ble bitmask give
36060 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b  s a.  ** bitmask
36070 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
36080 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
36090 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e  he join.  Knowin
360a0 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20  g the bitmask.  
360b0 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ** for all table
360c0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
360d0 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20   a left join is 
360e0 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b  important.  Tick
360f0 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20  et #3015..  **. 
36100 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69   ** Note that bi
36110 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74  tmasks are creat
36120 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c  ed for all pTabL
36130 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73  ist->nSrc tables
36140 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73   in.  ** pTabLis
36150 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20  t, not just the 
36160 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74  first nTabList t
36170 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74  ables.  nTabList
36180 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a   is normally.  *
36190 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c  * equal to pTabL
361a0 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69  ist->nSrc but mi
361b0 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64  ght be shortened
361c0 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a   to 1 if the.  *
361d0 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  * WHERE_ONETABLE
361e0 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
361f0 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  t..  */.  for(ii
36200 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d  =0; ii<pTabList-
36210 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nSrc; ii++){.  
36220 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61    createMask(pMa
36230 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
36240 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
36250 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
36260 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d  BUG.  {.    Bitm
36270 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20  ask toTheLeft = 
36280 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  0;.    for(ii=0;
36290 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53   ii<pTabList->nS
362a0 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  rc; ii++){.     
362b0 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74   Bitmask m = get
362c0 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
362d0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69  TabList->a[ii].i
362e0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61  Cursor);.      a
362f0 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f  ssert( (m-1)==to
36300 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  TheLeft );.     
36310 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b   toTheLeft |= m;
36320 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
36330 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  f..  /* Analyze 
36340 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78  all of the subex
36350 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65  pressions.  Note
36360 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a   that exprAnalyz
36370 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61  e() might.  ** a
36380 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  dd new virtual t
36390 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  erms onto the en
363a0 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  d of the WHERE c
363b0 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f  lause.  We do no
363c0 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61  t.  ** want to a
363d0 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72  nalyze these vir
363e0 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73  tual terms, so s
363f0 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61  tart analyzing a
36400 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61  t the end.  ** a
36410 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20  nd work forward 
36420 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65  so that the adde
36430 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  d virtual terms 
36440 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73  are never proces
36450 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72  sed..  */.  expr
36460 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c  AnalyzeAll(pTabL
36470 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  ist, &pWInfo->sW
36480 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  C);.  if( db->ma
36490 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
364a0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
364b0 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f  nError;.  }..  /
364c0 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42  * If the ORDER B
364d0 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  Y (or GROUP BY) 
364e0 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
364f0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 67 65  references to ge
36500 6e 65 72 61 6c 0a 20 20 2a 2a 20 65 78 70 72 65  neral.  ** expre
36510 73 73 69 6f 6e 73 2c 20 74 68 65 6e 20 77 65 20  ssions, then we 
36520 77 6f 6e 27 74 20 62 65 20 61 62 6c 65 20 74 6f  won't be able to
36530 20 73 61 74 69 73 66 79 20 69 74 20 75 73 69 6e   satisfy it usin
36540 67 20 69 6e 64 69 63 65 73 2c 20 73 6f 0a 20 20  g indices, so.  
36550 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ** go ahead and 
36560 64 69 73 61 62 6c 65 20 69 74 20 6e 6f 77 2e 0a  disable it now..
36570 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
36580 72 42 79 20 26 26 20 28 77 63 74 72 6c 46 6c 61  rBy && (wctrlFla
36590 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
365a0 44 49 53 54 49 4e 43 54 29 21 3d 30 20 29 7b 0a  DISTINCT)!=0 ){.
365b0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
365c0 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
365d0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  ; ii++){.      E
365e0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c  xpr *pExpr = sql
365f0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
36600 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
36610 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  ii].pExpr);.    
36620 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
36630 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
36640 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
36650 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
36660 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62  y = 0;.        b
36670 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
36680 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f  e if( pExpr->iCo
36690 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
366a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
366b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
366c0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
366d0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
366e0 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  CT ){.    if( is
366f0 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e  DistinctRedundan
36700 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  t(pParse, pTabLi
36710 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  st, &pWInfo->sWC
36720 2c 20 70 52 65 73 75 6c 74 53 65 74 29 20 29 7b  , pResultSet) ){
36730 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49  .      /* The DI
36740 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69  STINCT marking i
36750 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67  s pointless.  Ig
36760 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  nore it. */.    
36770 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
36780 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
36790 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
367a0 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 64 65   }else if( pOrde
367b0 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
367c0 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44 45 52 20  /* Try to ORDER 
367d0 42 59 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  BY the result se
367e0 74 20 74 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e  t to make distin
367f0 63 74 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61  ct processing ea
36800 73 69 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 57  sier */.      pW
36810 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
36820 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e   |= WHERE_DISTIN
36830 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57 49 6e  CTBY;.      pWIn
36840 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  fo->pOrderBy = p
36850 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d  ResultSet;.    }
36860 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74  .  }..  /* Const
36870 72 75 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f  ruct the WhereLo
36880 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  op objects */.  
36890 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
368a0 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  f,("*** Optimize
368b0 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29  r Start ***\n"))
368c0 3b 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74  ;.  if( nTabList
368d0 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72  !=1 || whereShor
368e0 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29  tCut(&sWLB)==0 )
368f0 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  {.    rc = where
36900 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42  LoopAddAll(&sWLB
36910 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
36920 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
36930 72 72 6f 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  rror;.  .    /* 
36940 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74  Display all of t
36950 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
36960 65 63 74 73 20 69 66 20 77 68 65 72 65 74 72 61  ects if wheretra
36970 63 65 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  ce is enabled */
36980 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
36990 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
369a0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
369b0 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 57 68  race ){.      Wh
369c0 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20  ereLoop *p;.    
369d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
369e0 74 61 74 69 63 20 63 68 61 72 20 7a 4c 61 62 65  tatic char zLabe
369f0 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38  l[] = "012345678
36a00 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  9abcdefghijklmno
36a10 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20 20  pqrstuvwyxz".   
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 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
36a50 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22  LMNOPQRSTUVWYXZ"
36a60 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57  ;.      for(p=pW
36a70 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d  Info->pLoops, i=
36a80 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  0; p; p=p->pNext
36a90 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Loop, i++){.    
36aa0 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61      p->cId = zLa
36ab0 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61  bel[i%sizeof(zLa
36ac0 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20 77  bel)];.        w
36ad0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c  hereLoopPrint(p,
36ae0 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20   pTabList);.    
36af0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
36b00 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61 74  .  .    wherePat
36b10 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
36b20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
36b30 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
36b40 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
36b50 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ror;.    if( pWI
36b60 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  nfo->pOrderBy ){
36b70 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74  .       wherePat
36b80 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
36b90 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b  pWInfo->nRowOut+
36ba0 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64  1);.       if( d
36bb0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
36bc0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
36bd0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  nError;.    }.  
36be0 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  }.  if( pWInfo->
36bf0 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28  pOrderBy==0 && (
36c00 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
36c10 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29  TE_ReverseOrder)
36c20 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e  !=0 ){.     pWIn
36c30 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42  fo->revMask = (B
36c40 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d  itmask)(-1);.  }
36c50 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
36c60 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d  Err || NEVER(db-
36c70 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29  >mallocFailed) )
36c80 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
36c90 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
36ca0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
36cb0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
36cc0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
36cd0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  e ){.    int ii;
36ce0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
36cf0 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f  gPrintf("---- So
36d00 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c  lution nRow=%d",
36d10 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
36d20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
36d30 6f 2d 3e 62 4f 42 53 61 74 20 29 7b 0a 20 20 20  o->bOBSat ){.   
36d40 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
36d50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d  rintf(" ORDERBY=
36d60 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d  0x%llx", pWInfo-
36d70 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  >revMask);.    }
36d80 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 57 49  .    switch( pWI
36d90 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29  nfo->eDistinct )
36da0 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
36db0 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
36dc0 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
36dd0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
36de0 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69  ("  DISTINCT=uni
36df0 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62  que");.        b
36e00 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
36e10 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
36e20 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a  ISTINCT_ORDERED:
36e30 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
36e40 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
36e50 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65   DISTINCT=ordere
36e60 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d");.        bre
36e70 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
36e80 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
36e90 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a  TINCT_UNORDERED:
36ea0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
36eb0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
36ec0 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65   DISTINCT=unorde
36ed0 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
36ee0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
36ef0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
36f00 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
36f10 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
36f20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  ii<pWInfo->nLeve
36f30 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  l; ii++){.      
36f40 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
36f50 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c  WInfo->a[ii].pWL
36f60 6f 6f 70 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  oop, pTabList);.
36f70 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
36f80 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
36f90 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f   omit tables fro
36fa0 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20  m the join that 
36fb0 64 6f 20 6e 6f 74 20 65 66 66 65 63 74 20 74 68  do not effect th
36fc0 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66  e result */.  if
36fd0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
36fe0 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c  >=2.   && pResul
36ff0 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20 4f 70  tSet!=0.   && Op
37000 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
37010 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69  d(db, SQLITE_Omi
37020 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a  tNoopJoin).  ){.
37030 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55      Bitmask tabU
37040 73 65 64 20 3d 20 65 78 70 72 4c 69 73 74 54 61  sed = exprListTa
37050 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
37060 74 2c 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a  t, pResultSet);.
37070 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72      if( sWLB.pOr
37080 64 65 72 42 79 20 29 20 74 61 62 55 73 65 64 20  derBy ) tabUsed 
37090 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
370a0 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
370b0 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a  sWLB.pOrderBy);.
370c0 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66      while( pWInf
370d0 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a  o->nLevel>=2 ){.
370e0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
370f0 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20  *pTerm, *pEnd;. 
37100 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49       pLoop = pWI
37110 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e  nfo->a[pWInfo->n
37120 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b  Level-1].pWLoop;
37130 0a 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e  .      if( (pWIn
37140 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
37150 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f 69  pLoop->iTab].joi
37160 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
37170 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
37180 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
37190 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
371a0 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20  DISTINCT)==0.   
371b0 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77      && (pLoop->w
371c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
371d0 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20  NEROW)==0.      
371e0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
371f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37200 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20 70  if( (tabUsed & p
37210 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  Loop->maskSelf)!
37220 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
37230 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57    pEnd = sWLB.pW
37240 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d  C->a + sWLB.pWC-
37250 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f  >nTerm;.      fo
37260 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43  r(pTerm=sWLB.pWC
37270 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b  ->a; pTerm<pEnd;
37280 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
37290 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
372a0 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
372b0 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20  ->maskSelf)!=0. 
372c0 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
372d0 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
372e0 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
372f0 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29  mJoin).        )
37300 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
37310 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
37320 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
37330 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61  Term<pEnd ) brea
37340 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  k;.      WHERETR
37350 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e  ACE(0xffff, ("->
37360 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f   drop loop %c no
37370 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70  t used\n", pLoop
37380 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70  ->cId));.      p
37390 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b  WInfo->nLevel--;
373a0 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d  .      nTabList-
373b0 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57  -;.    }.  }.  W
373c0 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
373d0 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  ,("*** Optimizer
373e0 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22   Finished ***\n"
373f0 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50  ));.  pWInfo->pP
37400 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
37410 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77   += pWInfo->nRow
37420 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Out;..  /* If th
37430 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55  e caller is an U
37440 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
37450 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
37460 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a  s requesting.  *
37470 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70  * to use a one-p
37480 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64  ass algorithm, d
37490 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73  etermine if this
374a0 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   is appropriate.
374b0 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61  .  ** The one-pa
374c0 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c  ss algorithm onl
374d0 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57  y works if the W
374e0 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
374f0 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65  traints.  ** the
37500 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70   statement to up
37510 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  date a single ro
37520 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
37530 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
37540 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
37550 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49  SIRED)==0 || pWI
37560 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29  nfo->nLevel==1 )
37570 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c  ;.  if( (wctrlFl
37580 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
37590 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
375a0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
375b0 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46  a[0].pWLoop->wsF
375c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
375d0 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ROW)!=0 ){.    p
375e0 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
375f0 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f   = 1;.    pWInfo
37600 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77  ->a[0].pWLoop->w
37610 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  sFlags &= ~WHERE
37620 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a  _IDX_ONLY;.  }..
37630 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61    /* Open all ta
37640 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62  bles in the pTab
37650 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64  List and any ind
37660 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f  ices selected fo
37670 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67  r.  ** searching
37680 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
37690 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
376a0 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
376b0 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c  for(ii=0, pLevel
376c0 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e  =pWInfo->a; ii<n
376d0 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70  TabList; ii++, p
376e0 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
376f0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
37700 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
37710 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
37720 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
37730 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
37740 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
37750 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  dex */.    struc
37760 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
37770 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70  pTabItem;..    p
37780 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
37790 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
377a0 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20  From];.    pTab 
377b0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
377c0 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
377d0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
377e0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
377f0 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  ma);.    pLoop =
37800 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
37810 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
37820 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
37830 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70  hemeral)!=0 || p
37840 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
37850 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
37860 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ing */.    }else
37870 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37880 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
37890 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  E.    if( (pLoop
378a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
378b0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
378c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
378d0 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
378e0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
378f0 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
37900 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
37910 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
37920 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
37930 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
37940 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
37950 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
37960 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
37970 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
37980 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
37990 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a  .      /* noop *
379a0 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  /.    }else.#end
379b0 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  if.    if( (pLoo
379c0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
379d0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
379e0 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
379f0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
37a00 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
37a10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
37a20 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b   op = pWInfo->ok
37a30 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65  OnePass ? OP_Ope
37a40 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e  nWrite : OP_Open
37a50 52 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69  Read;.      sqli
37a60 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
37a70 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  rse, pTabItem->i
37a80 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61  Cursor, iDb, pTa
37a90 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65  b, op);.      te
37aa0 73 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d  stcase( !pWInfo-
37ab0 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
37ac0 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  ab->nCol==BMS-1 
37ad0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
37ae0 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  e( !pWInfo->okOn
37af0 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
37b00 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
37b10 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
37b20 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
37b30 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20  ->nCol<BMS ){.  
37b40 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20        Bitmask b 
37b50 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55  = pTabItem->colU
37b60 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  sed;.        int
37b70 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
37b80 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c  for(; b; b=b>>1,
37b90 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   n++){}.        
37ba0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
37bb0 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56 64  eP4(v, sqlite3Vd
37bc0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
37bd0 2d 31 2c 20 0a 20 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 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
37c00 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29  TR(n), P4_INT32)
37c10 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
37c20 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( n<=pTab->nCol 
37c30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37c40 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
37c50 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
37c60 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
37c70 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
37c80 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
37c90 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
37ca0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
37cb0 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  XED ){.      Ind
37cc0 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d  ex *pIx = pLoop-
37cd0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
37ce0 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
37cf0 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
37d00 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
37d10 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 2f  e, pIx);.      /
37d20 2a 20 46 49 58 4d 45 3a 20 20 41 73 20 61 6e 20  * FIXME:  As an 
37d30 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 65  optimization use
37d40 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
37d50 6f 72 20 69 66 20 57 48 45 52 45 5f 49 44 58 5f  or if WHERE_IDX_
37d60 4f 4e 4c 59 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ONLY */.      in
37d70 74 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c  t iIndexCur = pL
37d80 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
37d90 69 49 64 78 43 75 72 20 3f 20 69 49 64 78 43 75  iIdxCur ? iIdxCu
37da0 72 20 3a 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r : pParse->nTab
37db0 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
37dc0 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
37dd0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
37de0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
37df0 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20  IndexCur>=0 );. 
37e00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37e10 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
37e20 6e 52 65 61 64 2c 20 69 49 6e 64 65 78 43 75 72  nRead, iIndexCur
37e30 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  , pIx->tnum, iDb
37e40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
37e50 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
37e60 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46  )pKey, P4_KEYINF
37e70 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
37e80 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
37e90 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61  , "%s", pIx->zNa
37ea0 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  me));.    }.    
37eb0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
37ec0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
37ed0 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61  iDb);.    notRea
37ee0 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26  dy &= ~getMask(&
37ef0 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
37f00 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
37f10 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  sor);.  }.  pWIn
37f20 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
37f30 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
37f40 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
37f50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
37f60 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
37f70 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
37f80 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
37f90 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
37fa0 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
37fb0 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
37fc0 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
37fd0 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
37fe0 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
37ff0 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
38000 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
38010 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
38020 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
38030 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
38040 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65  ; ii++){.    pLe
38050 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
38060 5b 69 69 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51  [ii];.#ifndef SQ
38070 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
38080 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66  TIC_INDEX.    if
38090 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  ( (pLevel->pWLoo
380a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
380b0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
380c0 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
380d0 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  ructAutomaticInd
380e0 65 78 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e  ex(pParse, &pWIn
380f0 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20  fo->sWC,.       
38100 20 20 20 20 20 20 20 20 20 26 70 54 61 62 4c 69           &pTabLi
38110 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
38120 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20  rom], notReady, 
38130 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69  pLevel);.      i
38140 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
38150 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
38160 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
38170 7d 0a 23 65