/ Hex Artifact Content
Login

Artifact 6b9e2bc47dd1225d690a9c770f157693519b7391:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 4b 2c 58  e WHERETRACE(K,X
0430: 29 20 20 69 66 28 73 71 6c 69 74 65 33 57 68 65  )  if(sqlite3Whe
0440: 72 65 54 72 61 63 65 26 28 4b 29 29 20 73 71 6c  reTrace&(K)) sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0460: 58 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  X.# define WHERE
0470: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 31 0a  TRACE_ENABLED 1.
0480: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 57  #else.# define W
0490: 48 45 52 45 54 52 41 43 45 28 4b 2c 58 29 0a 23  HERETRACE(K,X).#
04a0: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
04b0: 64 20 72 65 66 65 72 65 6e 63 65 73 0a 2a 2f 0a  d references.*/.
04c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
04d0: 68 65 72 65 43 6c 61 75 73 65 20 57 68 65 72 65  hereClause Where
04e0: 43 6c 61 75 73 65 3b 0a 74 79 70 65 64 65 66 20  Clause;.typedef 
04f0: 73 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b  struct WhereMask
0500: 53 65 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74  Set WhereMaskSet
0510: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
0520: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 57 68 65   WhereOrInfo Whe
0530: 72 65 4f 72 49 6e 66 6f 3b 0a 74 79 70 65 64 65  reOrInfo;.typede
0540: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 41 6e  f struct WhereAn
0550: 64 49 6e 66 6f 20 57 68 65 72 65 41 6e 64 49 6e  dInfo WhereAndIn
0560: 66 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  fo;.typedef stru
0570: 63 74 20 57 68 65 72 65 4c 65 76 65 6c 20 57 68  ct WhereLevel Wh
0580: 65 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65  ereLevel;.typede
0590: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f  f struct WhereLo
05a0: 6f 70 20 57 68 65 72 65 4c 6f 6f 70 3b 0a 74 79  op WhereLoop;.ty
05b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
05c0: 72 65 50 61 74 68 20 57 68 65 72 65 50 61 74 68  rePath WherePath
05d0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
05e0: 20 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65   WhereTerm Where
05f0: 54 65 72 6d 3b 0a 74 79 70 65 64 65 66 20 73 74  Term;.typedef st
0600: 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75  ruct WhereLoopBu
0610: 69 6c 64 65 72 20 57 68 65 72 65 4c 6f 6f 70 42  ilder WhereLoopB
0620: 75 69 6c 64 65 72 3b 0a 74 79 70 65 64 65 66 20  uilder;.typedef 
0630: 73 74 72 75 63 74 20 57 68 65 72 65 53 63 61 6e  struct WhereScan
0640: 20 57 68 65 72 65 53 63 61 6e 3b 0a 74 79 70 65   WhereScan;.type
0650: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0660: 4f 72 43 6f 73 74 20 57 68 65 72 65 4f 72 43 6f  OrCost WhereOrCo
0670: 73 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  st;.typedef stru
0680: 63 74 20 57 68 65 72 65 4f 72 53 65 74 20 57 68  ct WhereOrSet Wh
0690: 65 72 65 4f 72 53 65 74 3b 0a 0a 2f 2a 0a 2a 2a  ereOrSet;../*.**
06a0: 20 43 6f 73 74 20 58 20 69 73 20 74 72 61 63 6b   Cost X is track
06b0: 65 64 20 61 73 20 31 30 2a 6c 6f 67 32 28 58 29  ed as 10*log2(X)
06c0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 31 36 2d   stored in a 16-
06d0: 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20 54 68  bit integer.  Th
06e0: 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 63 6f 73  e.** maximum cos
06f0: 74 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20 74  t for ordinary t
0700: 61 62 6c 65 73 20 69 73 20 36 34 2a 28 32 2a 2a  ables is 64*(2**
0710: 36 33 29 20 77 68 69 63 68 20 62 65 63 6f 6d 65  63) which become
0720: 73 20 36 39 30 30 2e 0a 2a 2a 20 28 56 69 72 74  s 6900..** (Virt
0730: 75 61 6c 20 74 61 62 6c 65 73 20 63 61 6e 20 72  ual tables can r
0740: 65 74 75 72 6e 20 61 20 6c 61 72 67 65 72 20 63  eturn a larger c
0750: 6f 73 74 2c 20 62 75 74 20 6c 65 74 27 73 20 61  ost, but let's a
0760: 73 73 75 6d 65 20 74 68 65 79 20 64 6f 20 6e 6f  ssume they do no
0770: 74 2e 29 0a 2a 2a 20 53 6f 20 61 6c 6c 20 63 6f  t.).** So all co
0780: 73 74 73 20 63 61 6e 20 62 65 20 73 74 6f 72 65  sts can be store
0790: 64 20 69 6e 20 61 20 31 36 2d 62 69 74 20 69 6e  d in a 16-bit in
07a0: 74 65 67 65 72 20 77 69 74 68 6f 75 74 20 72 69  teger without ri
07b0: 73 6b 0a 2a 2a 20 6f 66 20 6f 76 65 72 66 6c 6f  sk.** of overflo
07c0: 77 2e 0a 2a 2a 0a 2a 2a 20 43 6f 73 74 73 20 61  w..**.** Costs a
07d0: 72 65 20 65 73 74 69 6d 61 74 65 73 2c 20 73 6f  re estimates, so
07e0: 20 6e 6f 20 65 66 66 6f 72 74 20 69 73 20 6d 61   no effort is ma
07f0: 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 31 30  de to compute 10
0800: 2a 6c 6f 67 32 28 58 29 20 65 78 61 63 74 6c 79  *log2(X) exactly
0810: 2e 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 61 20  ..** Instead, a 
0820: 63 6c 6f 73 65 20 65 73 74 69 6d 61 74 65 20 69  close estimate i
0830: 73 20 75 73 65 64 2e 20 20 41 6e 79 20 76 61 6c  s used.  Any val
0840: 75 65 20 6f 66 20 58 3d 31 20 69 73 20 73 74 6f  ue of X=1 is sto
0850: 72 65 64 20 61 73 20 30 2e 0a 2a 2a 20 58 3d 32  red as 0..** X=2
0860: 20 69 73 20 31 30 2e 20 20 58 3d 33 20 69 73 20   is 10.  X=3 is 
0870: 31 36 2e 20 20 58 3d 31 30 30 30 20 69 73 20 39  16.  X=1000 is 9
0880: 39 2e 20 65 74 63 2e 20 20 4e 65 67 61 74 69 76  9. etc.  Negativ
0890: 65 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 6c  e values are all
08a0: 6f 77 65 64 2e 0a 2a 2a 20 41 20 57 68 65 72 65  owed..** A Where
08b0: 43 6f 73 74 20 6f 66 20 2d 31 30 20 6d 65 61 6e  Cost of -10 mean
08c0: 73 20 30 2e 35 2e 20 20 57 68 65 72 65 43 6f 73  s 0.5.  WhereCos
08d0: 74 20 6f 66 20 2d 32 30 20 6d 65 61 6e 73 20 30  t of -20 means 0
08e0: 2e 32 35 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  .25.  And so for
08f0: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 6f  th..**.** The to
0900: 6f 6c 2f 77 68 65 72 65 63 6f 73 74 74 65 73 74  ol/wherecosttest
0910: 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 69  .c source file i
0920: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 63 6f 6d 6d  mplements a comm
0930: 61 6e 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d  and-line program
0940: 0a 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 63 6f  .** that will co
0950: 6e 76 65 72 74 20 57 68 65 72 65 43 6f 73 74 73  nvert WhereCosts
0960: 20 74 6f 20 69 6e 74 65 67 65 72 73 2c 20 63 6f   to integers, co
0970: 6e 76 65 72 74 20 69 6e 74 65 67 65 72 73 20 74  nvert integers t
0980: 6f 20 57 68 65 72 65 43 6f 73 74 73 0a 2a 2a 20  o WhereCosts.** 
0990: 61 6e 64 20 64 6f 20 61 64 64 69 74 69 6f 6e 20  and do addition 
09a0: 61 6e 64 20 6d 75 6c 74 69 70 6c 69 63 61 74 69  and multiplicati
09b0: 6f 6e 20 6f 6e 20 57 68 65 72 65 43 6f 73 74 20  on on WhereCost 
09c0: 76 61 6c 75 65 73 2e 20 20 54 68 65 20 77 68 65  values.  The whe
09d0: 72 65 63 6f 73 74 74 65 73 74 0a 2a 2a 20 63 6f  recosttest.** co
09e0: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 70 72 6f 67 72  mmand-line progr
09f0: 61 6d 20 69 73 20 61 20 75 73 65 66 75 6c 20 75  am is a useful u
0a00: 74 69 6c 69 74 79 20 74 6f 20 68 61 76 65 20 61  tility to have a
0a10: 72 6f 75 6e 64 20 77 68 65 6e 20 77 6f 72 6b 69  round when worki
0a20: 6e 67 20 77 69 74 68 0a 2a 2a 20 74 68 69 73 20  ng with.** this 
0a30: 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64  module..*/.typed
0a40: 65 66 20 73 68 6f 72 74 20 69 6e 74 20 57 68 65  ef short int Whe
0a50: 72 65 43 6f 73 74 3b 0a 0a 2f 2a 0a 2a 2a 20 54  reCost;../*.** T
0a60: 68 69 73 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  his object conta
0a70: 69 6e 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ins information 
0a80: 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
0a90: 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  ent a single nes
0aa0: 74 65 64 0a 2a 2a 20 6c 6f 6f 70 20 69 6e 20 57  ted.** loop in W
0ab0: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
0ac0: 2a 2a 20 43 6f 6e 74 72 61 73 74 20 74 68 69 73  ** Contrast this
0ad0: 20 6f 62 6a 65 63 74 20 77 69 74 68 20 57 68 65   object with Whe
0ae0: 72 65 4c 6f 6f 70 2e 20 20 54 68 69 73 20 6f 62  reLoop.  This ob
0af0: 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20 74  ject describes t
0b00: 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  he.** implementa
0b10: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
0b20: 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 64 65 73  .  WhereLoop des
0b30: 63 72 69 62 65 73 20 74 68 65 20 61 6c 67 6f 72  cribes the algor
0b40: 69 74 68 6d 2e 0a 2a 2a 20 54 68 69 73 20 6f 62  ithm..** This ob
0b50: 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  ject contains a 
0b60: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 57  pointer to the W
0b70: 68 65 72 65 4c 6f 6f 70 20 61 6c 67 6f 72 69 74  hereLoop algorit
0b80: 68 6d 20 61 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20  hm as one of.** 
0b90: 69 74 73 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2a  its elements..**
0ba0: 0a 2a 2a 20 54 68 65 20 57 68 65 72 65 49 6e 66  .** The WhereInf
0bb0: 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  o object contain
0bc0: 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  s a single insta
0bd0: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
0be0: 63 74 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 74  ct for.** each t
0bf0: 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  erm in the FROM 
0c00: 63 6c 61 75 73 65 20 28 77 68 69 63 68 20 69 73  clause (which is
0c10: 20 74 6f 20 73 61 79 2c 20 66 6f 72 20 65 61 63   to say, for eac
0c20: 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 65 73 74  h of the.** nest
0c30: 65 64 20 6c 6f 6f 70 73 20 61 73 20 69 6d 70 6c  ed loops as impl
0c40: 65 6d 65 6e 74 65 64 29 2e 20 20 54 68 65 20 6f  emented).  The o
0c50: 72 64 65 72 20 6f 66 20 57 68 65 72 65 4c 65 76  rder of WhereLev
0c60: 65 6c 20 6f 62 6a 65 63 74 73 20 64 65 74 65 72  el objects deter
0c70: 6d 69 6e 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 6f  mines.** the loo
0c80: 70 20 6e 65 73 74 65 64 20 6f 72 64 65 72 2c 20  p nested order, 
0c90: 77 69 74 68 20 57 68 65 72 65 49 6e 66 6f 2e 61  with WhereInfo.a
0ca0: 5b 30 5d 20 62 65 69 6e 67 20 74 68 65 20 6f 75  [0] being the ou
0cb0: 74 65 72 20 6c 6f 6f 70 20 61 6e 64 0a 2a 2a 20  ter loop and.** 
0cc0: 57 68 65 72 65 49 6e 66 6f 2e 61 5b 57 68 65 72  WhereInfo.a[Wher
0cd0: 65 49 6e 66 6f 2e 6e 4c 65 76 65 6c 2d 31 5d 20  eInfo.nLevel-1] 
0ce0: 62 65 69 6e 67 20 74 68 65 20 69 6e 6e 65 72 20  being the inner 
0cf0: 6c 6f 6f 70 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  loop..*/.struct 
0d00: 57 68 65 72 65 4c 65 76 65 6c 20 7b 0a 20 20 69  WhereLevel {.  i
0d10: 6e 74 20 69 4c 65 66 74 4a 6f 69 6e 3b 20 20 20  nt iLeftJoin;   
0d20: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
0d30: 65 6c 6c 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  ell used to impl
0d40: 65 6d 65 6e 74 20 4c 45 46 54 20 4f 55 54 45 52  ement LEFT OUTER
0d50: 20 4a 4f 49 4e 20 2a 2f 0a 20 20 69 6e 74 20 69   JOIN */.  int i
0d60: 54 61 62 43 75 72 3b 20 20 20 20 20 20 20 20 20  TabCur;         
0d70: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72   /* The VDBE cur
0d80: 73 6f 72 20 75 73 65 64 20 74 6f 20 61 63 63 65  sor used to acce
0d90: 73 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  ss the table */.
0da0: 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20    int iIdxCur;  
0db0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
0dc0: 44 42 45 20 63 75 72 73 6f 72 20 75 73 65 64 20  DBE cursor used 
0dd0: 74 6f 20 61 63 63 65 73 73 20 70 49 64 78 20 2a  to access pIdx *
0de0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b  /.  int addrBrk;
0df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
0e00: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
0e10: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
0e20: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74  */.  int addrNxt
0e30: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ;          /* Ju
0e40: 6d 70 20 68 65 72 65 20 74 6f 20 73 74 61 72 74  mp here to start
0e50: 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 6f 6d   the next IN com
0e60: 62 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  bination */.  in
0e70: 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20  t addrCont;     
0e80: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
0e90: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
0ea0: 68 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 20  h the next loop 
0eb0: 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  cycle */.  int a
0ec0: 64 64 72 46 69 72 73 74 3b 20 20 20 20 20 20 20  ddrFirst;       
0ed0: 20 2f 2a 20 46 69 72 73 74 20 69 6e 73 74 72 75   /* First instru
0ee0: 63 74 69 6f 6e 20 6f 66 20 69 6e 74 65 72 69 6f  ction of interio
0ef0: 72 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  r of the loop */
0f00: 0a 20 20 69 6e 74 20 61 64 64 72 42 6f 64 79 3b  .  int addrBody;
0f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
0f20: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 62 6f 64  nning of the bod
0f30: 79 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a  y of this loop *
0f40: 2f 0a 20 20 75 38 20 69 46 72 6f 6d 3b 20 20 20  /.  u8 iFrom;   
0f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
0f60: 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
0f70: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
0f80: 20 75 38 20 6f 70 2c 20 70 35 3b 20 20 20 20 20   u8 op, p5;     
0f90: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
0fa0: 20 61 6e 64 20 50 35 20 6f 66 20 74 68 65 20 6f   and P5 of the o
0fb0: 70 63 6f 64 65 20 74 68 61 74 20 65 6e 64 73 20  pcode that ends 
0fc0: 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
0fd0: 74 20 70 31 2c 20 70 32 3b 20 20 20 20 20 20 20  t p1, p2;       
0fe0: 20 20 20 20 2f 2a 20 4f 70 65 72 61 6e 64 73 20      /* Operands 
0ff0: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 75 73  of the opcode us
1000: 65 64 20 74 6f 20 65 6e 64 73 20 74 68 65 20 6c  ed to ends the l
1010: 6f 6f 70 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b  oop */.  union {
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1030: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  * Information th
1040: 61 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 70 57  at depends on pW
1050: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 2a 2f  Loop->wsFlags */
1060: 0a 20 20 20 20 73 74 72 75 63 74 20 7b 0a 20 20  .    struct {.  
1070: 20 20 20 20 69 6e 74 20 6e 49 6e 3b 20 20 20 20      int nIn;    
1080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1090: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
10a0: 6e 20 61 49 6e 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  n aInLoop[] */. 
10b0: 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f       struct InLo
10c0: 6f 70 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  op {.        int
10d0: 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
10e0: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
10f0: 63 75 72 73 6f 72 20 75 73 65 64 20 62 79 20 74  cursor used by t
1100: 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  his IN operator 
1110: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  */.        int a
1120: 64 64 72 49 6e 54 6f 70 3b 20 20 20 20 20 20 20  ddrInTop;       
1130: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
1140: 49 4e 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  IN loop */.     
1150: 20 20 20 75 38 20 65 45 6e 64 4c 6f 6f 70 4f 70     u8 eEndLoopOp
1160: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 20  ;         /* IN 
1170: 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 6f 72 2e  Loop terminator.
1180: 20 4f 50 5f 4e 65 78 74 20 6f 72 20 4f 50 5f 50   OP_Next or OP_P
1190: 72 65 76 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2a  rev */.      } *
11a0: 61 49 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  aInLoop;        
11b0: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
11c0: 6e 20 61 62 6f 75 74 20 65 61 63 68 20 6e 65 73  n about each nes
11d0: 74 65 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  ted IN operator 
11e0: 2a 2f 0a 20 20 20 20 7d 20 69 6e 3b 20 20 20 20  */.    } in;    
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1200: 55 73 65 64 20 77 68 65 6e 20 70 57 4c 6f 6f 70  Used when pWLoop
1210: 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
1220: 49 4e 5f 41 42 4c 45 20 2a 2f 0a 20 20 20 20 49  IN_ABLE */.    I
1230: 6e 64 65 78 20 2a 70 43 6f 76 69 64 78 3b 20 20  ndex *pCovidx;  
1240: 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 65       /* Possible
1250: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
1260: 66 6f 72 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  for WHERE_MULTI_
1270: 4f 52 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 73  OR */.  } u;.  s
1280: 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 20  truct WhereLoop 
1290: 2a 70 57 4c 6f 6f 70 3b 20 20 2f 2a 20 54 68 65  *pWLoop;  /* The
12a0: 20 73 65 6c 65 63 74 65 64 20 57 68 65 72 65 4c   selected WhereL
12b0: 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
12c0: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
12d0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52  ;          /* FR
12e0: 4f 4d 20 65 6e 74 72 69 65 73 20 6e 6f 74 20 75  OM entries not u
12f0: 73 61 62 6c 65 20 61 74 20 74 68 69 73 20 6c 65  sable at this le
1300: 76 65 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  vel */.};../*.**
1310: 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
1320: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 72 65  f this object re
1330: 70 72 65 73 65 6e 74 73 20 61 6e 20 61 6c 67 6f  presents an algo
1340: 72 69 74 68 6d 20 66 6f 72 20 65 76 61 6c 75 61  rithm for evalua
1350: 74 69 6e 67 20 6f 6e 65 0a 2a 2a 20 74 65 72 6d  ting one.** term
1360: 20 6f 66 20 61 20 6a 6f 69 6e 2e 20 20 45 76 65   of a join.  Eve
1370: 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  ry term of the F
1380: 52 4f 4d 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  ROM clause will 
1390: 68 61 76 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  have at least.**
13a0: 20 6f 6e 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   one correspondi
13b0: 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ng WhereLoop obj
13c0: 65 63 74 20 28 75 6e 6c 65 73 73 20 49 4e 44 45  ect (unless INDE
13d0: 58 45 44 20 42 59 20 63 6f 6e 73 74 72 61 69 6e  XED BY constrain
13e0: 74 73 0a 2a 2a 20 70 72 65 76 65 6e 74 20 61 20  ts.** prevent a 
13f0: 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 20 2d  query solution -
1400: 20 77 68 69 63 68 20 69 73 20 61 6e 20 65 72 72   which is an err
1410: 6f 72 29 20 61 6e 64 20 6d 61 6e 79 20 74 65 72  or) and many ter
1420: 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 46 52 4f  ms of the.** FRO
1430: 4d 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 68 61  M clause will ha
1440: 76 65 20 6d 75 6c 74 69 70 6c 65 20 57 68 65 72  ve multiple Wher
1450: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 2c 20 65  eLoop objects, e
1460: 61 63 68 20 64 65 73 63 72 69 62 69 6e 67 20 61  ach describing a
1470: 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 20 77 61  .** potential wa
1480: 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  y of implementin
1490: 67 20 74 68 61 74 20 46 52 4f 4d 2d 63 6c 61 75  g that FROM-clau
14a0: 73 65 20 74 65 72 6d 2c 20 74 6f 67 65 74 68 65  se term, togethe
14b0: 72 20 77 69 74 68 0a 2a 2a 20 64 65 70 65 6e 64  r with.** depend
14c0: 65 6e 63 69 65 73 20 61 6e 64 20 63 6f 73 74 20  encies and cost 
14d0: 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20 75 73  estimates for us
14e0: 69 6e 67 20 74 68 65 20 63 68 6f 73 65 6e 20 61  ing the chosen a
14f0: 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20  lgorithm..**.** 
1500: 51 75 65 72 79 20 70 6c 61 6e 6e 69 6e 67 20 63  Query planning c
1510: 6f 6e 73 69 73 74 73 20 6f 66 20 62 75 69 6c 64  onsists of build
1520: 69 6e 67 20 75 70 20 61 20 63 6f 6c 6c 65 63 74  ing up a collect
1530: 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 68 65  ion of these Whe
1540: 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 62 6a 65 63 74  reLoop.** object
1550: 73 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 69 6e  s, then computin
1560: 67 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 73  g a particular s
1570: 65 71 75 65 6e 63 65 20 6f 66 20 57 68 65 72 65  equence of Where
1580: 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 2c 20 77 69  Loop objects, wi
1590: 74 68 0a 2a 2a 20 6f 6e 65 20 57 68 65 72 65 4c  th.** one WhereL
15a0: 6f 6f 70 20 6f 62 6a 65 63 74 20 70 65 72 20 46  oop object per F
15b0: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2c  ROM clause term,
15c0: 20 74 68 61 74 20 73 61 74 69 73 66 79 20 61 6c   that satisfy al
15d0: 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 2a  l dependencies.*
15e0: 2a 20 61 6e 64 20 74 68 61 74 20 6d 69 6e 69 6d  * and that minim
15f0: 69 7a 65 20 74 68 65 20 6f 76 65 72 61 6c 6c 20  ize the overall 
1600: 63 6f 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  cost..*/.struct 
1610: 57 68 65 72 65 4c 6f 6f 70 20 7b 0a 20 20 42 69  WhereLoop {.  Bi
1620: 74 6d 61 73 6b 20 70 72 65 72 65 71 3b 20 20 20  tmask prereq;   
1630: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f      /* Bitmask o
1640: 66 20 6f 74 68 65 72 20 6c 6f 6f 70 73 20 74 68  f other loops th
1650: 61 74 20 6d 75 73 74 20 72 75 6e 20 66 69 72 73  at must run firs
1660: 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  t */.  Bitmask m
1670: 61 73 6b 53 65 6c 66 3b 20 20 20 20 20 2f 2a 20  askSelf;     /* 
1680: 42 69 74 6d 61 73 6b 20 69 64 65 6e 74 69 66 79  Bitmask identify
1690: 69 6e 67 20 74 61 62 6c 65 20 69 54 61 62 20 2a  ing table iTab *
16a0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
16b0: 44 45 42 55 47 0a 20 20 63 68 61 72 20 63 49 64  DEBUG.  char cId
16c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16d0: 20 53 79 6d 62 6f 6c 69 63 20 49 44 20 6f 66 20   Symbolic ID of 
16e0: 74 68 69 73 20 6c 6f 6f 70 20 66 6f 72 20 64 65  this loop for de
16f0: 62 75 67 67 69 6e 67 20 75 73 65 20 2a 2f 0a 23  bugging use */.#
1700: 65 6e 64 69 66 0a 20 20 75 38 20 69 54 61 62 3b  endif.  u8 iTab;
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1720: 20 50 6f 73 69 74 69 6f 6e 20 69 6e 20 46 52 4f   Position in FRO
1730: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 61 62 6c  M clause of tabl
1740: 65 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20  e for this loop 
1750: 2a 2f 0a 20 20 75 38 20 69 53 6f 72 74 49 64 78  */.  u8 iSortIdx
1760: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  ;          /* So
1770: 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 75 6d 62  rting index numb
1780: 65 72 2e 20 20 30 3d 3d 4e 6f 6e 65 20 2a 2f 0a  er.  0==None */.
1790: 20 20 57 68 65 72 65 43 6f 73 74 20 72 53 65 74    WhereCost rSet
17a0: 75 70 3b 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74  up;     /* One-t
17b0: 69 6d 65 20 73 65 74 75 70 20 63 6f 73 74 20 28  ime setup cost (
17c0: 65 78 3a 20 63 72 65 61 74 65 20 74 72 61 6e 73  ex: create trans
17d0: 69 65 6e 74 20 69 6e 64 65 78 29 20 2a 2f 0a 20  ient index) */. 
17e0: 20 57 68 65 72 65 43 6f 73 74 20 72 52 75 6e 3b   WhereCost rRun;
17f0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
1800: 66 20 72 75 6e 6e 69 6e 67 20 65 61 63 68 20 6c  f running each l
1810: 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  oop */.  WhereCo
1820: 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 2f  st nOut;       /
1830: 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  * Estimated numb
1840: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
1850: 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  s */.  union {. 
1860: 20 20 20 73 74 72 75 63 74 20 7b 20 20 20 20 20     struct {     
1870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
1880: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 69 6e 74  ormation for int
1890: 65 72 6e 61 6c 20 62 74 72 65 65 20 74 61 62 6c  ernal btree tabl
18a0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
18b0: 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
18c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18d0: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
18e0: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 49 6e  ints */.      In
18f0: 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
1900: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73       /* Index us
1910: 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ed, or NULL */. 
1920: 20 20 20 7d 20 62 74 72 65 65 3b 0a 20 20 20 20     } btree;.    
1930: 73 74 72 75 63 74 20 7b 20 20 20 20 20 20 20 20  struct {        
1940: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d         /* Inform
1950: 61 74 69 6f 6e 20 66 6f 72 20 76 69 72 74 75 61  ation for virtua
1960: 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  l tables */.    
1970: 20 20 69 6e 74 20 69 64 78 4e 75 6d 3b 20 20 20    int idxNum;   
1980: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1990: 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  x number */.    
19a0: 20 20 75 38 20 6e 65 65 64 46 72 65 65 3b 20 20    u8 needFree;  
19b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
19c0: 20 69 66 20 73 71 6c 69 74 65 33 5f 66 72 65 65   if sqlite3_free
19d0: 28 69 64 78 53 74 72 29 20 69 73 20 6e 65 65 64  (idxStr) is need
19e0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 69  ed */.      u8 i
19f0: 73 4f 72 64 65 72 65 64 3b 20 20 20 20 20 20 20  sOrdered;       
1a00: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 61     /* True if sa
1a10: 74 69 73 66 69 65 73 20 4f 52 44 45 52 20 42 59  tisfies ORDER BY
1a20: 20 2a 2f 0a 20 20 20 20 20 20 75 31 36 20 6f 6d   */.      u16 om
1a30: 69 74 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  itMask;         
1a40: 20 2f 2a 20 54 65 72 6d 73 20 74 68 61 74 20 6d   /* Terms that m
1a50: 61 79 20 62 65 20 6f 6d 69 74 74 65 64 20 2a 2f  ay be omitted */
1a60: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 69 64 78  .      char *idx
1a70: 53 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Str;          /*
1a80: 20 49 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65   Index identifie
1a90: 72 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  r string */.    
1aa0: 7d 20 76 74 61 62 3b 0a 20 20 7d 20 75 3b 0a 20  } vtab;.  } u;. 
1ab0: 20 75 33 32 20 77 73 46 6c 61 67 73 3b 20 20 20   u32 wsFlags;   
1ac0: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 5f         /* WHERE_
1ad0: 2a 20 66 6c 61 67 73 20 64 65 73 63 72 69 62 69  * flags describi
1ae0: 6e 67 20 74 68 65 20 70 6c 61 6e 20 2a 2f 0a 20  ng the plan */. 
1af0: 20 75 31 36 20 6e 4c 54 65 72 6d 3b 20 20 20 20   u16 nLTerm;    
1b00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b10: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
1b20: 4c 54 65 72 6d 5b 5d 20 2a 2f 0a 20 20 2f 2a 2a  LTerm[] */.  /**
1b30: 2a 2a 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72  ** whereLoopXfer
1b40: 28 29 20 63 6f 70 69 65 73 20 66 69 65 6c 64 73  () copies fields
1b50: 20 61 62 6f 76 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a   above *********
1b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1b70: 23 20 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4c  # define WHERE_L
1b80: 4f 4f 50 5f 58 46 45 52 5f 53 5a 20 6f 66 66 73  OOP_XFER_SZ offs
1b90: 65 74 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2c 6e  etof(WhereLoop,n
1ba0: 4c 53 6c 6f 74 29 0a 20 20 75 31 36 20 6e 4c 53  LSlot).  u16 nLS
1bb0: 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  lot;           /
1bc0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74  * Number of slot
1bd0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
1be0: 61 4c 54 65 72 6d 5b 5d 20 2a 2f 0a 20 20 57 68  aLTerm[] */.  Wh
1bf0: 65 72 65 54 65 72 6d 20 2a 2a 61 4c 54 65 72 6d  ereTerm **aLTerm
1c00: 3b 20 20 20 2f 2a 20 57 68 65 72 65 54 65 72 6d  ;   /* WhereTerm
1c10: 73 20 75 73 65 64 20 2a 2f 0a 20 20 57 68 65 72  s used */.  Wher
1c20: 65 4c 6f 6f 70 20 2a 70 4e 65 78 74 4c 6f 6f 70  eLoop *pNextLoop
1c30: 3b 20 2f 2a 20 4e 65 78 74 20 57 68 65 72 65 4c  ; /* Next WhereL
1c40: 6f 6f 70 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  oop object in th
1c50: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 2f  e WhereClause */
1c60: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 4c  .  WhereTerm *aL
1c70: 54 65 72 6d 53 70 61 63 65 5b 34 5d 3b 20 20 2f  TermSpace[4];  /
1c80: 2a 20 49 6e 69 74 69 61 6c 20 61 4c 54 65 72 6d  * Initial aLTerm
1c90: 5b 5d 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a  [] space */.};..
1ca0: 2f 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20 68  /* This object h
1cb0: 6f 6c 64 73 20 74 68 65 20 70 72 65 72 65 71 75  olds the prerequ
1cc0: 69 73 69 74 65 73 20 61 6e 64 20 74 68 65 20 63  isites and the c
1cd0: 6f 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 61  ost of running a
1ce0: 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 6e 20  .** subquery on 
1cf0: 6f 6e 65 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  one operand of a
1d00: 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 20 69 6e  n OR operator in
1d10: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1d20: 65 2e 0a 2a 2a 20 53 65 65 20 57 68 65 72 65 4f  e..** See WhereO
1d30: 72 53 65 74 20 66 6f 72 20 61 64 64 69 74 69 6f  rSet for additio
1d40: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
1d50: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
1d60: 4f 72 43 6f 73 74 20 7b 0a 20 20 42 69 74 6d 61  OrCost {.  Bitma
1d70: 73 6b 20 70 72 65 72 65 71 3b 20 20 20 20 20 2f  sk prereq;     /
1d80: 2a 20 50 72 65 72 65 71 75 69 73 69 74 65 73 20  * Prerequisites 
1d90: 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72  */.  WhereCost r
1da0: 52 75 6e 3b 20 20 20 20 20 2f 2a 20 43 6f 73 74  Run;     /* Cost
1db0: 20 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   of running this
1dc0: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 57   subquery */.  W
1dd0: 68 65 72 65 43 6f 73 74 20 6e 4f 75 74 3b 20 20  hereCost nOut;  
1de0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1df0: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 69 73  outputs for this
1e00: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a   subquery */.};.
1e10: 0a 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53  ./* The WhereOrS
1e20: 65 74 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20  et object holds 
1e30: 61 20 73 65 74 20 6f 66 20 70 6f 73 73 69 62 6c  a set of possibl
1e40: 65 20 57 68 65 72 65 4f 72 43 6f 73 74 73 20 74  e WhereOrCosts t
1e50: 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  hat.** correspon
1e60: 64 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  d to the subquer
1e70: 79 28 73 29 20 6f 66 20 4f 52 2d 63 6c 61 75 73  y(s) of OR-claus
1e80: 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 4f  e processing.  O
1e90: 6e 6c 79 20 74 68 65 0a 2a 2a 20 62 65 73 74 20  nly the.** best 
1ea0: 4e 5f 4f 52 5f 43 4f 53 54 20 65 6c 65 6d 65 6e  N_OR_COST elemen
1eb0: 74 73 20 61 72 65 20 72 65 74 61 69 6e 65 64 2e  ts are retained.
1ec0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 4f 52  .*/.#define N_OR
1ed0: 5f 43 4f 53 54 20 33 0a 73 74 72 75 63 74 20 57  _COST 3.struct W
1ee0: 68 65 72 65 4f 72 53 65 74 20 7b 0a 20 20 75 31  hereOrSet {.  u1
1ef0: 36 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  6 n;            
1f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f10: 62 65 72 20 6f 66 20 76 61 6c 69 64 20 61 5b 5d  ber of valid a[]
1f20: 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 57 68   entries */.  Wh
1f30: 65 72 65 4f 72 43 6f 73 74 20 61 5b 4e 5f 4f 52  ereOrCost a[N_OR
1f40: 5f 43 4f 53 54 5d 3b 20 20 20 2f 2a 20 53 65 74  _COST];   /* Set
1f50: 20 6f 66 20 62 65 73 74 20 63 6f 73 74 73 20 2a   of best costs *
1f60: 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72  /.};.../* Forwar
1f70: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66  d declaration of
1f80: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74   methods */.stat
1f90: 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
1fa0: 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c  Resize(sqlite3*,
1fb0: 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74   WhereLoop*, int
1fc0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69  );../*.** Each i
1fd0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
1fe0: 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20 61 20 73  object holds a s
1ff0: 65 71 75 65 6e 63 65 20 6f 66 20 57 68 65 72 65  equence of Where
2000: 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 0a 2a 2a 20  Loop objects.** 
2010: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 73  that implement s
2020: 6f 6d 65 20 6f 72 20 61 6c 6c 20 6f 66 20 61 20  ome or all of a 
2030: 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a  query plan..**.*
2040: 2a 20 54 68 69 6e 6b 20 6f 66 20 65 61 63 68 20  * Think of each 
2050: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2060: 20 61 73 20 61 20 6e 6f 64 65 20 69 6e 20 61 20   as a node in a 
2070: 67 72 61 70 68 20 77 69 74 68 20 61 72 63 73 0a  graph with arcs.
2080: 2a 2a 20 73 68 6f 77 69 6e 67 20 64 65 70 65 6e  ** showing depen
2090: 64 65 6e 63 69 65 73 20 61 6e 64 20 63 6f 73 74  dencies and cost
20a0: 73 20 66 6f 72 20 74 72 61 76 65 6c 6c 69 6e 67  s for travelling
20b0: 20 62 65 74 77 65 65 6e 20 6e 6f 64 65 73 2e 20   between nodes. 
20c0: 20 28 54 68 61 74 20 69 73 0a 2a 2a 20 6e 6f 74   (That is.** not
20d0: 20 61 20 63 6f 6d 70 6c 65 74 65 6c 79 20 61 63   a completely ac
20e0: 63 75 72 61 74 65 20 64 65 73 63 72 69 70 74 69  curate descripti
20f0: 6f 6e 20 62 65 63 61 75 73 65 20 57 68 65 72 65  on because Where
2100: 4c 6f 6f 70 20 63 6f 73 74 73 20 61 72 65 20 61  Loop costs are a
2110: 0a 2a 2a 20 76 65 63 74 6f 72 2c 20 6e 6f 74 20  .** vector, not 
2120: 61 20 73 63 61 6c 61 72 2c 20 61 6e 64 20 62 65  a scalar, and be
2130: 63 61 75 73 65 20 64 65 70 65 6e 64 65 6e 63 69  cause dependenci
2140: 65 73 20 61 72 65 20 6d 61 6e 79 2d 74 6f 2d 6f  es are many-to-o
2150: 6e 65 2c 20 6e 6f 74 0a 2a 2a 20 6f 6e 65 2d 74  ne, not.** one-t
2160: 6f 2d 6f 6e 65 20 61 73 20 61 72 65 20 67 72 61  o-one as are gra
2170: 70 68 20 6e 6f 64 65 73 2e 20 20 42 75 74 20 69  ph nodes.  But i
2180: 74 20 69 73 20 61 20 75 73 65 66 75 6c 20 76 69  t is a useful vi
2190: 73 75 61 6c 69 7a 61 74 69 6f 6e 20 61 69 64 2e  sualization aid.
21a0: 29 0a 2a 2a 20 54 68 65 6e 20 61 20 57 68 65 72  ).** Then a Wher
21b0: 65 50 61 74 68 20 6f 62 6a 65 63 74 20 69 73 20  ePath object is 
21c0: 61 20 70 61 74 68 20 74 68 72 6f 75 67 68 20 74  a path through t
21d0: 68 65 20 67 72 61 70 68 20 74 68 61 74 20 76 69  he graph that vi
21e0: 73 69 74 73 20 73 6f 6d 65 0a 2a 2a 20 6f 72 20  sits some.** or 
21f0: 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65  all of the Where
2200: 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 6f 6e 63  Loop objects onc
2210: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 73 6f  e..**.** The "so
2220: 6c 76 65 72 22 20 77 6f 72 6b 73 20 62 79 20 63  lver" works by c
2230: 72 65 61 74 69 6e 67 20 74 68 65 20 4e 20 62 65  reating the N be
2240: 73 74 20 57 68 65 72 65 50 61 74 68 20 6f 62 6a  st WherePath obj
2250: 65 63 74 73 20 6f 66 20 6c 65 6e 67 74 68 0a 2a  ects of length.*
2260: 2a 20 31 2e 20 20 54 68 65 6e 20 75 73 69 6e 67  * 1.  Then using
2270: 20 74 68 6f 73 65 20 61 73 20 61 20 62 61 73 69   those as a basi
2280: 73 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  s to compute the
2290: 20 4e 20 62 65 73 74 20 57 68 65 72 65 50 61 74   N best WherePat
22a0: 68 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 6f 66 20  h objects.** of 
22b0: 6c 65 6e 67 74 68 20 32 2e 20 20 41 6e 64 20 73  length 2.  And s
22c0: 6f 20 66 6f 72 74 68 20 75 6e 74 69 6c 20 74 68  o forth until th
22d0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 57 68 65 72  e length of Wher
22e0: 65 50 61 74 68 73 20 65 71 75 61 6c 73 20 74 68  ePaths equals th
22f0: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6e  e.** number of n
2300: 6f 64 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  odes in the FROM
2310: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 62 65   clause.  The be
2320: 73 74 20 28 6c 6f 77 65 73 74 20 63 6f 73 74 29  st (lowest cost)
2330: 20 57 68 65 72 65 50 61 74 68 0a 2a 2a 20 61 74   WherePath.** at
2340: 20 74 68 65 20 65 6e 64 20 69 73 20 74 68 65 20   the end is the 
2350: 63 68 6f 6f 73 65 6e 20 71 75 65 72 79 20 70 6c  choosen query pl
2360: 61 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  an..*/.struct Wh
2370: 65 72 65 50 61 74 68 20 7b 0a 20 20 42 69 74 6d  erePath {.  Bitm
2380: 61 73 6b 20 6d 61 73 6b 4c 6f 6f 70 3b 20 20 20  ask maskLoop;   
2390: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
23a0: 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
23b0: 6a 65 63 74 73 20 69 6e 20 74 68 69 73 20 70 61  jects in this pa
23c0: 74 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  th */.  Bitmask 
23d0: 72 65 76 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a  revLoop;      /*
23e0: 20 61 4c 6f 6f 70 5b 5d 73 20 74 68 61 74 20 73   aLoop[]s that s
23f0: 68 6f 75 6c 64 20 62 65 20 72 65 76 65 72 73 65  hould be reverse
2400: 64 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20 2a  d for ORDER BY *
2410: 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e 52  /.  WhereCost nR
2420: 6f 77 3b 20 20 20 20 20 20 20 2f 2a 20 45 73 74  ow;       /* Est
2430: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
2440: 20 72 6f 77 73 20 67 65 6e 65 72 61 74 65 64 20   rows generated 
2450: 62 79 20 74 68 69 73 20 70 61 74 68 20 2a 2f 0a  by this path */.
2460: 20 20 57 68 65 72 65 43 6f 73 74 20 72 43 6f 73    WhereCost rCos
2470: 74 3b 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  t;      /* Total
2480: 20 63 6f 73 74 20 6f 66 20 74 68 69 73 20 70 61   cost of this pa
2490: 74 68 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64  th */.  u8 isOrd
24a0: 65 72 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  ered;         /*
24b0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 70 61   True if this pa
24c0: 74 68 20 73 61 74 69 73 66 69 65 73 20 4f 52 44  th satisfies ORD
24d0: 45 52 20 42 59 20 2a 2f 0a 20 20 75 38 20 69 73  ER BY */.  u8 is
24e0: 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 20 20 20  OrderedValid;   
24f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
2500: 69 73 4f 72 64 65 72 65 64 20 66 69 65 6c 64 20  isOrdered field 
2510: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 57 68  is valid */.  Wh
2520: 65 72 65 4c 6f 6f 70 20 2a 2a 61 4c 6f 6f 70 3b  ereLoop **aLoop;
2530: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2540: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2550: 73 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  s implementing t
2560: 68 69 73 20 70 61 74 68 20 2a 2f 0a 7d 3b 0a 0a  his path */.};..
2570: 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20  /*.** The query 
2580: 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61  generator uses a
2590: 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61  n array of insta
25a0: 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73 74 72  nces of this str
25b0: 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c  ucture to.** hel
25c0: 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65  p it analyze the
25d0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
25e0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
25f0: 75 73 65 2e 20 20 45 61 63 68 20 57 48 45 52 45  use.  Each WHERE
2600: 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78  .** clause subex
2610: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
2620: 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f  rated from the o
2630: 74 68 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65  thers by AND ope
2640: 72 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c  rators,.** usual
2650: 6c 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73  ly, or sometimes
2660: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
2670: 73 65 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e  separated by OR.
2680: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65  .**.** All Where
2690: 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63  Terms are collec
26a0: 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ted into a singl
26b0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
26c0: 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68  ructure.  .** Th
26d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e  e following iden
26e0: 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a  tity holds:.**.*
26f0: 2a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  *        WhereTe
2700: 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54  rm.pWC->a[WhereT
2710: 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72  erm.idx] == Wher
2720: 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  eTerm.**.** When
2730: 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68   a term is of th
2740: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
2750: 20 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70             X <op
2760: 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77  > <expr>.**.** w
2770: 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75  here X is a colu
2780: 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e  mn name and <op>
2790: 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61   is one of certa
27a0: 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a  in operators,.**
27b0: 20 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e   then WhereTerm.
27c0: 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57  leftCursor and W
27d0: 68 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43  hereTerm.u.leftC
27e0: 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65  olumn record the
27f0: 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  .** cursor numbe
2800: 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d  r and column num
2810: 62 65 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72  ber for X.  Wher
2820: 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20  eTerm.eOperator 
2830: 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c  records.** the <
2840: 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d  op> using a bitm
2850: 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66  ask encoding def
2860: 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62  ined by WO_xxx b
2870: 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73  elow.  The.** us
2880: 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65  e of a bitmask e
2890: 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20  ncoding for the 
28a0: 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20  operator allows 
28b0: 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20  us to search.** 
28c0: 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d  quickly for term
28d0: 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  s that match any
28e0: 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69 66 66   of several diff
28f0: 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e  erent operators.
2900: 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65  .**.** A WhereTe
2910: 72 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  rm might also be
2920: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62   two or more sub
2930: 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
2940: 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  by OR:.**.**    
2950: 20 20 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20       (t1.X <op> 
2960: 3c 65 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59  <expr>) OR (t1.Y
2970: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52   <op> <expr>) OR
2980: 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74   .....**.** In t
2990: 68 69 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c  his second case,
29a0: 20 77 74 46 6c 61 67 20 68 61 73 20 74 68 65 20   wtFlag has the 
29b0: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 62 69 74 20  TERM_ORINFO bit 
29c0: 73 65 74 20 61 6e 64 20 65 4f 70 65 72 61 74 6f  set and eOperato
29d0: 72 3d 3d 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20  r==WO_OR.** and 
29e0: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
29f0: 70 4f 72 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f  pOrInfo field po
2a00: 69 6e 74 73 20 74 6f 20 61 75 78 69 6c 69 61 72  ints to auxiliar
2a10: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  y information th
2a20: 61 74 0a 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74  at.** is collect
2a30: 65 64 20 61 62 6f 75 74 20 74 68 65 20 4f 52 20  ed about the OR 
2a40: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  clause..**.** If
2a50: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
2a60: 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73  HERE clause does
2a70: 20 6e 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65   not match eithe
2a80: 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65  r of the two pre
2a90: 76 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72  vious.** categor
2aa0: 69 65 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61  ies, then eOpera
2ab0: 74 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65  tor==0.  The Whe
2ac0: 72 65 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65  reTerm.pExpr fie
2ad0: 6c 64 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a  ld is still set.
2ae0: 2a 2a 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ** to the origin
2af0: 61 6c 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  al subexpression
2b00: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46   content and wtF
2b10: 6c 61 67 73 20 69 73 20 73 65 74 20 75 70 20 61  lags is set up a
2b20: 70 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20  ppropriately.** 
2b30: 62 75 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65  but no other fie
2b40: 6c 64 73 20 69 6e 20 74 68 65 20 57 68 65 72 65  lds in the Where
2b50: 54 65 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20  Term object are 
2b60: 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a  meaningful..**.*
2b70: 2a 20 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72  * When eOperator
2b80: 21 3d 30 2c 20 70 72 65 72 65 71 52 69 67 68 74  !=0, prereqRight
2b90: 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72   and prereqAll r
2ba0: 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75  ecord sets of cu
2bb0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a  rsor numbers,.**
2bc0: 20 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20   but they do so 
2bd0: 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73  indirectly.  A s
2be0: 69 6e 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53  ingle WhereMaskS
2bf0: 65 74 20 73 74 72 75 63 74 75 72 65 20 74 72 61  et structure tra
2c00: 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f  nslates.** curso
2c10: 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69  r number into bi
2c20: 74 73 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  ts and the trans
2c30: 6c 61 74 65 64 20 62 69 74 20 69 73 20 73 74 6f  lated bit is sto
2c40: 72 65 64 20 69 6e 20 74 68 65 20 70 72 65 72 65  red in the prere
2c50: 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68  q.** fields.  Th
2c60: 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73  e translation is
2c70: 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74   used in order t
2c80: 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e  o maximize the n
2c90: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73  umber of.** bits
2ca0: 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69   that will fit i
2cb0: 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68  n a Bitmask.  Th
2cc0: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
2cd0: 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a  mbers might be.*
2ce0: 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65  * spread out ove
2cf0: 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69  r the non-negati
2d00: 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f  ve integers.  Fo
2d10: 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63  r example, the c
2d20: 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73  ursor.** numbers
2d30: 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20   might be 3, 8, 
2d40: 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34  9, 10, 20, 23, 4
2d50: 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20  1, and 45.  The 
2d60: 57 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20  WhereMaskSet.** 
2d70: 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65  translates these
2d80: 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e   sparse cursor n
2d90: 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73  umbers into cons
2da0: 65 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73  ecutive integers
2db0: 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  .** beginning wi
2dc0: 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f  th 0 in order to
2dd0: 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74 20 70   make the best p
2de0: 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74  ossible use of t
2df0: 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  he available.** 
2e00: 62 69 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d  bits in the Bitm
2e10: 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65  ask.  So, in the
2e20: 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20   example above, 
2e30: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
2e40: 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d  rs.** would be m
2e50: 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67  apped into integ
2e60: 65 72 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e  ers 0 through 7.
2e70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  .**.** The numbe
2e80: 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20  r of terms in a 
2e90: 6a 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20  join is limited 
2ea0: 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
2eb0: 20 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72   bits.** in prer
2ec0: 65 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72  eqRight and prer
2ed0: 65 71 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61  eqAll.  The defa
2ee0: 75 6c 74 20 69 73 20 36 34 20 62 69 74 73 2c 20  ult is 64 bits, 
2ef0: 68 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20  hence SQLite.** 
2f00: 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20  is only able to 
2f10: 70 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69  process joins wi
2f20: 74 68 20 36 34 20 6f 72 20 66 65 77 65 72 20 74  th 64 or fewer t
2f30: 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  ables..*/.struct
2f40: 20 57 68 65 72 65 54 65 72 6d 20 7b 0a 20 20 45   WhereTerm {.  E
2f50: 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20  xpr *pExpr;     
2f60: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2f70: 72 20 74 6f 20 74 68 65 20 73 75 62 65 78 70 72  r to the subexpr
2f80: 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74  ession that is t
2f90: 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  his term */.  in
2fa0: 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
2fb0: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
2fc0: 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74 5d   pWC->a[iParent]
2fd0: 20 77 68 65 6e 20 74 68 69 73 20 74 65 72 6d 20   when this term 
2fe0: 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 69 6e  disabled */.  in
2ff0: 74 20 6c 65 66 74 43 75 72 73 6f 72 3b 20 20 20  t leftCursor;   
3000: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
3010: 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22  number of X in "
3020: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a  X <op> <expr>" *
3030: 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  /.  union {.    
3040: 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20  int leftColumn; 
3050: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
3060: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e  n number of X in
3070: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
3080: 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4f 72 49   */.    WhereOrI
3090: 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20  nfo *pOrInfo;   
30a0: 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61  /* Extra informa
30b0: 74 69 6f 6e 20 69 66 20 28 65 4f 70 65 72 61 74  tion if (eOperat
30c0: 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 20 2a  or & WO_OR)!=0 *
30d0: 2f 0a 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e  /.    WhereAndIn
30e0: 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a  fo *pAndInfo; /*
30f0: 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   Extra informati
3100: 6f 6e 20 69 66 20 28 65 4f 70 65 72 61 74 6f 72  on if (eOperator
3110: 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 2a 2f 0a  & WO_AND)!=0 */.
3120: 20 20 7d 20 75 3b 0a 20 20 57 68 65 72 65 43 6f    } u;.  WhereCo
3130: 73 74 20 74 72 75 74 68 50 72 6f 62 3b 20 20 20  st truthProb;   
3140: 20 2f 2a 20 50 72 6f 62 61 62 69 6c 69 74 79 20   /* Probability 
3150: 6f 66 20 74 72 75 74 68 20 66 6f 72 20 74 68 69  of truth for thi
3160: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
3170: 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b    u16 eOperator;
3180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
3190: 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63 72  O_xx value descr
31a0: 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20  ibing <op> */.  
31b0: 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20 20 20  u8 wtFlags;     
31c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f          /* TERM_
31d0: 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e 20 20  xxx bit flags.  
31e0: 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75  See below */.  u
31f0: 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20  8 nChild;       
3200: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3210: 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61   of children tha
3220: 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75  t must disable u
3230: 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  s */.  WhereClau
3240: 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f  se *pWC;       /
3250: 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74 68 69  * The clause thi
3260: 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f  s term is part o
3270: 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  f */.  Bitmask p
3280: 72 65 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f  rereqRight;    /
3290: 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62  * Bitmask of tab
32a0: 6c 65 73 20 75 73 65 64 20 62 79 20 70 45 78 70  les used by pExp
32b0: 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42  r->pRight */.  B
32c0: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c  itmask prereqAll
32d0: 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  ;      /* Bitmas
32e0: 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65  k of tables refe
32f0: 72 65 6e 63 65 64 20 62 79 20 70 45 78 70 72 20  renced by pExpr 
3300: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  */.};../*.** All
3310: 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57  owed values of W
3320: 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73  hereTerm.wtFlags
3330: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d  .*/.#define TERM
3340: 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31  _DYNAMIC    0x01
3350: 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61     /* Need to ca
3360: 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  ll sqlite3ExprDe
3370: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 20  lete(db, pExpr) 
3380: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
3390: 56 49 52 54 55 41 4c 20 20 20 20 30 78 30 32 20  VIRTUAL    0x02 
33a0: 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68    /* Added by th
33b0: 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f  e optimizer.  Do
33c0: 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65   not code */.#de
33d0: 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20  fine TERM_CODED 
33e0: 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54       0x04   /* T
33f0: 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65  his term is alre
3400: 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65  ady coded */.#de
3410: 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44  fine TERM_COPIED
3420: 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48       0x08   /* H
3430: 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64  as a child */.#d
3440: 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46  efine TERM_ORINF
3450: 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20  O     0x10   /* 
3460: 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65  Need to free the
3470: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
3480: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23  Info object */.#
3490: 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49  define TERM_ANDI
34a0: 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20 2f 2a  NFO    0x20   /*
34b0: 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74 68   Need to free th
34c0: 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 41  e WhereTerm.u.pA
34d0: 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64  ndInfo obj */.#d
34e0: 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b  efine TERM_OR_OK
34f0: 20 20 20 20 20 20 30 78 34 30 20 20 20 2f 2a 20        0x40   /* 
3500: 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63  Used during OR-c
3510: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
3520: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
3530: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
3540: 52 5f 53 54 41 54 34 0a 23 20 20 64 65 66 69 6e  R_STAT4.#  defin
3550: 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20 20 20  e TERM_VNULL    
3560: 30 78 38 30 20 20 20 2f 2a 20 4d 61 6e 75 66 61  0x80   /* Manufa
3570: 63 74 75 72 65 64 20 78 3e 4e 55 4c 4c 20 6f 72  ctured x>NULL or
3580: 20 78 3c 3d 4e 55 4c 4c 20 74 65 72 6d 20 2a 2f   x<=NULL term */
3590: 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
35a0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20 20 20 30   TERM_VNULL    0
35b0: 78 30 30 20 20 20 2f 2a 20 44 69 73 61 62 6c 65  x00   /* Disable
35c0: 64 20 69 66 20 6e 6f 74 20 75 73 69 6e 67 20 73  d if not using s
35d0: 74 61 74 33 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  tat3 */.#endif..
35e0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
35f0: 65 20 6f 66 20 74 68 65 20 57 68 65 72 65 53 63  e of the WhereSc
3600: 61 6e 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  an object is use
3610: 64 20 61 73 20 61 6e 20 69 74 65 72 61 74 6f 72  d as an iterator
3620: 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 0a 2a 2a   for locating.**
3630: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
3640: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
3650: 61 72 65 20 75 73 65 66 75 6c 20 74 6f 20 74 68  are useful to th
3660: 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  e query planner.
3670: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
3680: 53 63 61 6e 20 7b 0a 20 20 57 68 65 72 65 43 6c  Scan {.  WhereCl
3690: 61 75 73 65 20 2a 70 4f 72 69 67 57 43 3b 20 20  ause *pOrigWC;  
36a0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 2c      /* Original,
36b0: 20 69 6e 6e 65 72 6d 6f 73 74 20 57 68 65 72 65   innermost Where
36c0: 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  Clause */.  Wher
36d0: 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
36e0: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 43         /* WhereC
36f0: 6c 61 75 73 65 20 63 75 72 72 65 6e 74 6c 79 20  lause currently 
3700: 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f  being scanned */
3710: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 4e 61  .  char *zCollNa
3720: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
3730: 20 52 65 71 75 69 72 65 64 20 63 6f 6c 6c 61 74   Required collat
3740: 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 69 66  ing sequence, if
3750: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63   not NULL */.  c
3760: 68 61 72 20 69 64 78 61 66 66 3b 20 20 20 20 20  har idxaff;     
3770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
3780: 74 20 6d 61 74 63 68 20 74 68 69 73 20 61 66 66  t match this aff
3790: 69 6e 69 74 79 2c 20 69 66 20 7a 43 6f 6c 6c 4e  inity, if zCollN
37a0: 61 6d 65 21 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 75  ame!=NULL */.  u
37b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6e 45 71  nsigned char nEq
37c0: 75 69 76 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  uiv;      /* Num
37d0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
37e0: 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f 0a 20 20  n aEquiv[] */.  
37f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 45  unsigned char iE
3800: 71 75 69 76 3b 20 20 20 20 20 20 2f 2a 20 4e 65  quiv;      /* Ne
3810: 78 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  xt unused slot i
3820: 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f 0a 20 20  n aEquiv[] */.  
3830: 75 33 32 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20  u32 opMask;     
3840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
3850: 63 65 70 74 61 62 6c 65 20 6f 70 65 72 61 74 6f  ceptable operato
3860: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20  rs */.  int k;  
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3880: 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 63 61     /* Resume sca
3890: 6e 6e 69 6e 67 20 61 74 20 74 68 69 73 2d 3e 70  nning at this->p
38a0: 57 43 2d 3e 61 5b 74 68 69 73 2d 3e 6b 5d 20 2a  WC->a[this->k] *
38b0: 2f 0a 20 20 69 6e 74 20 61 45 71 75 69 76 5b 32  /.  int aEquiv[2
38c0: 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  2];            /
38d0: 2a 20 43 75 72 73 6f 72 2c 43 6f 6c 75 6d 6e 20  * Cursor,Column 
38e0: 70 61 69 72 73 20 66 6f 72 20 65 71 75 69 76 61  pairs for equiva
38f0: 6c 65 6e 63 65 20 63 6c 61 73 73 65 73 20 2a 2f  lence classes */
3900: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
3910: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
3920: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3930: 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f  e holds all info
3940: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a  rmation about a.
3950: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  ** WHERE clause.
3960: 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73    Mostly this is
3970: 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72   a container for
3980: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65   one or more Whe
3990: 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 45  reTerms..**.** E
39a0: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 70 4f  xplanation of pO
39b0: 75 74 65 72 3a 20 20 46 6f 72 20 61 20 57 48 45  uter:  For a WHE
39c0: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
39d0: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
39e0: 20 20 20 20 20 20 61 20 41 4e 44 20 28 28 62 20        a AND ((b 
39f0: 41 4e 44 20 63 29 20 4f 52 20 28 64 20 41 4e 44  AND c) OR (d AND
3a00: 20 65 29 29 20 41 4e 44 20 66 0a 2a 2a 0a 2a 2a   e)) AND f.**.**
3a10: 20 54 68 65 72 65 20 61 72 65 20 73 65 70 61 72   There are separ
3a20: 61 74 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  ate WhereClause 
3a30: 6f 62 6a 65 63 74 73 20 66 6f 72 20 74 68 65 20  objects for the 
3a40: 77 68 6f 6c 65 20 63 6c 61 75 73 65 20 61 6e 64  whole clause and
3a50: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 75 62 63   for.** the subc
3a60: 6c 61 75 73 65 73 20 22 28 62 20 41 4e 44 20 63  lauses "(b AND c
3a70: 29 22 20 61 6e 64 20 22 28 64 20 41 4e 44 20 65  )" and "(d AND e
3a80: 29 22 2e 20 20 54 68 65 20 70 4f 75 74 65 72 20  )".  The pOuter 
3a90: 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a 2a 20  field of the.** 
3aa0: 73 75 62 63 6c 61 75 73 65 73 20 70 6f 69 6e 74  subclauses point
3ab0: 73 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c  s to the WhereCl
3ac0: 61 75 73 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  ause object for 
3ad0: 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65  the whole clause
3ae0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
3af0: 65 43 6c 61 75 73 65 20 7b 0a 20 20 57 68 65 72  eClause {.  Wher
3b00: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
3b10: 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c       /* WHERE cl
3b20: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
3b30: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
3b40: 72 65 43 6c 61 75 73 65 20 2a 70 4f 75 74 65 72  reClause *pOuter
3b50: 3b 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20 63  ;     /* Outer c
3b60: 6f 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  onjunction */.  
3b70: 75 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  u8 op;          
3b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69           /* Spli
3b90: 74 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f  t operator.  TK_
3ba0: 41 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a  AND or TK_OR */.
3bb0: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
3bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3bd0: 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f  mber of terms */
3be0: 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20  .  int nSlot;   
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3c00: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3c10: 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65   in a[] */.  Whe
3c20: 72 65 54 65 72 6d 20 2a 61 3b 20 20 20 20 20 20  reTerm *a;      
3c30: 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 61 5b        /* Each a[
3c40: 5d 20 64 65 73 63 72 69 62 65 73 20 61 20 74 65  ] describes a te
3c50: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
3c60: 63 6c 75 61 73 65 20 2a 2f 0a 23 69 66 20 64 65  cluase */.#if de
3c70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 4d 41  fined(SQLITE_SMA
3c80: 4c 4c 5f 53 54 41 43 4b 29 0a 20 20 57 68 65 72  LL_STACK).  Wher
3c90: 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 31 5d  eTerm aStatic[1]
3ca0: 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20  ;    /* Initial 
3cb0: 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72  static space for
3cc0: 20 61 5b 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20   a[] */.#else.  
3cd0: 57 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69  WhereTerm aStati
3ce0: 63 5b 38 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74  c[8];    /* Init
3cf0: 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65  ial static space
3d00: 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64   for a[] */.#end
3d10: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57  if.};../*.** A W
3d20: 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f  hereTerm with eO
3d30: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68  perator==WO_OR h
3d40: 61 73 20 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f  as its u.pOrInfo
3d50: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
3d60: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
3d70: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
3d80: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
3d90: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
3da0: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f  */.struct WhereO
3db0: 72 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43  rInfo {.  WhereC
3dc0: 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20  lause wc;       
3dd0: 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
3de0: 69 6f 6e 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  ion into subterm
3df0: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  s */.  Bitmask i
3e00: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
3e10: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c  /* Bitmask of al
3e20: 6c 20 69 6e 64 65 78 61 62 6c 65 20 74 61 62 6c  l indexable tabl
3e30: 65 73 20 69 6e 20 74 68 65 20 63 6c 61 75 73 65  es in the clause
3e40: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
3e50: 57 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65  WhereTerm with e
3e60: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44  Operator==WO_AND
3e70: 20 68 61 73 20 69 74 73 20 75 2e 70 41 6e 64 49   has its u.pAndI
3e80: 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20  nfo pointer set 
3e90: 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61  to.** a dynamica
3ea0: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  lly allocated in
3eb0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
3ec0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3ed0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
3ee0: 72 65 41 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68  reAndInfo {.  Wh
3ef0: 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20  ereClause wc;   
3f00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
3f10: 62 65 78 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b  bexpression brok
3f20: 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  en out */.};../*
3f30: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
3f40: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3f50: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
3f60: 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61 70 70   track of a mapp
3f70: 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56  ing.** between V
3f80: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
3f90: 72 73 20 61 6e 64 20 62 69 74 73 20 6f 66 20 74  rs and bits of t
3fa0: 68 65 20 62 69 74 6d 61 73 6b 73 20 69 6e 20 57  he bitmasks in W
3fb0: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
3fc0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
3fd0: 6e 75 6d 62 65 72 73 20 61 72 65 20 73 6d 61 6c  numbers are smal
3fe0: 6c 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61  l integers conta
3ff0: 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c  ined in .** SrcL
4000: 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72  ist_item.iCursor
4010: 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62 6c 65   and Expr.iTable
4020: 20 66 69 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e   fields.  For an
4030: 79 20 67 69 76 65 6e 20 57 48 45 52 45 20 0a 2a  y given WHERE .*
4040: 2a 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 75  * clause, the cu
4050: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67  rsor numbers mig
4060: 68 74 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  ht not begin wit
4070: 68 20 30 20 61 6e 64 20 74 68 65 79 20 6d 69 67  h 0 and they mig
4080: 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61  ht.** contain ga
4090: 70 73 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ps in the number
40a0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 42  ing sequence.  B
40b0: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
40c0: 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73  ke maximum.** us
40d0: 65 20 6f 66 20 74 68 65 20 62 69 74 73 20 69 6e  e of the bits in
40e0: 20 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e 20 20   our bitmasks.  
40f0: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 70  This structure p
4100: 72 6f 76 69 64 65 73 20 61 20 6d 61 70 70 69 6e  rovides a mappin
4110: 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 70  g.** from the sp
4120: 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  arse cursor numb
4130: 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75  ers into consecu
4140: 74 69 76 65 20 69 6e 74 65 67 65 72 73 20 62 65  tive integers be
4150: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20  ginning.** with 
4160: 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72  0..**.** If Wher
4170: 65 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d  eMaskSet.ix[A]==
4180: 42 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  B it means that 
4190: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
41a0: 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72  a Bitmask.** cor
41b0: 72 65 73 70 6f 6e 64 73 20 56 44 42 45 20 63 75  responds VDBE cu
41c0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20 20  rsor number B.  
41d0: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
41e0: 61 20 62 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c  a bitmask is 1<<
41f0: 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  A..**.** For exa
4200: 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57 48 45  mple, if the WHE
4210: 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
4220: 73 69 6f 6e 20 75 73 65 64 20 74 68 65 73 65 20  sion used these 
4230: 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a  VDBE.** cursors:
4240: 20 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35    4, 5, 8, 29, 5
4250: 37 2c 20 37 33 2e 20 20 54 68 65 6e 20 74 68 65  7, 73.  Then the
4260: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73    WhereMaskSet s
4270: 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c  tructure.** woul
4280: 64 20 6d 61 70 20 74 68 6f 73 65 20 63 75 72 73  d map those curs
4290: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
42a0: 62 69 74 73 20 30 20 74 68 72 6f 75 67 68 20 35  bits 0 through 5
42b0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
42c0: 74 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  t the mapping is
42d0: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
42e0: 20 6f 72 64 65 72 65 64 2e 20 20 49 6e 20 74 68   ordered.  In th
42f0: 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f  e example.** abo
4300: 76 65 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ve, the mapping 
4310: 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65 20 74 68  might go like th
4320: 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c  is:  4->3, 5->1,
4330: 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a   8->2, 29->0,.**
4340: 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20   57->5, 73->4.  
4350: 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74  Or one of 719 ot
4360: 68 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  her combinations
4370: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 2e 20   might be used. 
4380: 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72  It.** does not r
4390: 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20 20 57  eally matter.  W
43a0: 68 61 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  hat is important
43b0: 20 69 73 20 74 68 61 74 20 73 70 61 72 73 65 20   is that sparse 
43c0: 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
43d0: 73 20 61 6c 6c 20 67 65 74 20 6d 61 70 70 65 64  s all get mapped
43e0: 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62 65 72   into bit number
43f0: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
4400: 68 20 30 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a  h 0 and contain.
4410: 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73  ** no gaps..*/.s
4420: 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53  truct WhereMaskS
4430: 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20  et {.  int n;   
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4460: 66 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f  f assigned curso
4470: 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  r values */.  in
4480: 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20  t ix[BMS];      
4490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
44a0: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
44b0: 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b  o each bit */.};
44c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6f 62 6a  ../*.** This obj
44d0: 65 63 74 20 69 73 20 61 20 63 6f 6e 76 65 6e 69  ect is a conveni
44e0: 65 6e 63 65 20 77 72 61 70 70 65 72 20 68 6f 6c  ence wrapper hol
44f0: 64 69 6e 67 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  ding all informa
4500: 74 69 6f 6e 20 6e 65 65 64 65 64 0a 2a 2a 20 74  tion needed.** t
4510: 6f 20 63 6f 6e 73 74 72 75 63 74 20 57 68 65 72  o construct Wher
4520: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
4530: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 71  r a particular q
4540: 75 65 72 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  uery..*/.struct 
4550: 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
4560: 20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a   {.  WhereInfo *
4570: 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 2f  pWInfo;        /
4580: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
4590: 6f 75 74 20 74 68 69 73 20 57 48 45 52 45 20 2a  out this WHERE *
45a0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
45b0: 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 2f 2a  *pWC;         /*
45c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
45d0: 72 6d 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  rms */.  ExprLis
45e0: 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
45f0: 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63     /* ORDER BY c
4600: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
4610: 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
4620: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
4630: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20   WhereLoop */.  
4640: 57 68 65 72 65 4f 72 53 65 74 20 2a 70 4f 72 53  WhereOrSet *pOrS
4650: 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 63  et;       /* Rec
4660: 6f 72 64 20 62 65 73 74 20 6c 6f 6f 70 73 20 68  ord best loops h
4670: 65 72 65 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  ere, if not NULL
4680: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
4690: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
46a0: 52 5f 53 54 41 54 34 0a 20 20 55 6e 70 61 63 6b  R_STAT4.  Unpack
46b0: 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 3b 20  edRecord *pRec; 
46c0: 20 20 20 20 2f 2a 20 50 72 6f 62 65 20 66 6f 72      /* Probe for
46d0: 20 73 74 61 74 34 20 28 69 66 20 72 65 71 75 69   stat4 (if requi
46e0: 72 65 64 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  red) */.  int nR
46f0: 65 63 56 61 6c 69 64 3b 20 20 20 20 20 20 20 20  ecValid;        
4700: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4710: 20 76 61 6c 69 64 20 66 69 65 6c 64 73 20 63 75   valid fields cu
4720: 72 72 65 6e 74 6c 79 20 69 6e 20 70 52 65 63 20  rrently in pRec 
4730: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
4740: 0a 2a 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c  .** The WHERE cl
4750: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
4760: 72 6f 75 74 69 6e 65 20 68 61 73 20 74 77 6f 20  routine has two 
4770: 68 61 6c 76 65 73 2e 20 20 54 68 65 0a 2a 2a 20  halves.  The.** 
4780: 66 69 72 73 74 20 70 61 72 74 20 64 6f 65 73 20  first part does 
4790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
47a0: 20 57 48 45 52 45 20 6c 6f 6f 70 20 61 6e 64 20   WHERE loop and 
47b0: 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 68 61  the second.** ha
47c0: 6c 66 20 64 6f 65 73 20 74 68 65 20 74 61 69 6c  lf does the tail
47d0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f   of the WHERE lo
47e0: 6f 70 2e 20 20 41 6e 20 69 6e 73 74 61 6e 63 65  op.  An instance
47f0: 20 6f 66 0a 2a 2a 20 74 68 69 73 20 73 74 72 75   of.** this stru
4800: 63 74 75 72 65 20 69 73 20 72 65 74 75 72 6e 65  cture is returne
4810: 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 68  d by the first h
4820: 61 6c 66 20 61 6e 64 20 70 61 73 73 65 64 0a 2a  alf and passed.*
4830: 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 63 6f 6e  * into the secon
4840: 64 20 68 61 6c 66 20 74 6f 20 67 69 76 65 20 73  d half to give s
4850: 6f 6d 65 20 63 6f 6e 74 69 6e 75 69 74 79 2e 0a  ome continuity..
4860: 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  **.** An instanc
4870: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
4880: 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6d 70 6c   holds the compl
4890: 65 74 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  ete state of the
48a0: 20 71 75 65 72 79 0a 2a 2a 20 70 6c 61 6e 6e 65   query.** planne
48b0: 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  r..*/.struct Whe
48c0: 72 65 49 6e 66 6f 20 7b 0a 20 20 50 61 72 73 65  reInfo {.  Parse
48d0: 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
48e0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
48f0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
4900: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
4910: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
4920: 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st;        /* Li
4930: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
4940: 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78  the join */.  Ex
4950: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
4960: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  ;       /* The O
4970: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
4980: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  r NULL */.  Expr
4990: 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74  List *pResultSet
49a0: 3b 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20  ;     /* Result 
49b0: 73 65 74 2e 20 44 49 53 54 49 4e 43 54 20 6f 70  set. DISTINCT op
49c0: 65 72 61 74 65 73 20 6f 6e 20 74 68 65 73 65 20  erates on these 
49d0: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
49e0: 70 4c 6f 6f 70 73 3b 20 20 20 20 20 20 20 20 2f  pLoops;        /
49f0: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 57 68  * List of all Wh
4a00: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
4a10: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 76  */.  Bitmask rev
4a20: 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  Mask;          /
4a30: 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20  * Mask of ORDER 
4a40: 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 6e 65  BY terms that ne
4a50: 65 64 20 72 65 76 65 72 73 69 6e 67 20 2a 2f 0a  ed reversing */.
4a60: 20 20 57 68 65 72 65 43 6f 73 74 20 6e 52 6f 77    WhereCost nRow
4a70: 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  Out;        /* E
4a80: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
4a90: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a  of output rows *
4aa0: 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
4ab0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs;           /*
4ac0: 20 46 6c 61 67 73 20 6f 72 69 67 69 6e 61 6c 6c   Flags originall
4ad0: 79 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  y passed to sqli
4ae0: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
4af0: 2a 2f 0a 20 20 75 38 20 62 4f 42 53 61 74 3b 20  */.  u8 bOBSat; 
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4b10: 2a 20 4f 52 44 45 52 20 42 59 20 73 61 74 69 73  * ORDER BY satis
4b20: 66 69 65 64 20 62 79 20 69 6e 64 69 63 65 73 20  fied by indices 
4b30: 2a 2f 0a 20 20 75 38 20 6f 6b 4f 6e 65 50 61 73  */.  u8 okOnePas
4b40: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
4b50: 2a 20 4f 6b 20 74 6f 20 75 73 65 20 6f 6e 65 2d  * Ok to use one-
4b60: 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 66  pass algorithm f
4b70: 6f 72 20 55 50 44 41 54 45 2f 44 45 4c 45 54 45  or UPDATE/DELETE
4b80: 20 2a 2f 0a 20 20 75 38 20 75 6e 74 65 73 74 65   */.  u8 unteste
4b90: 64 54 65 72 6d 73 3b 20 20 20 20 20 20 20 20 20  dTerms;         
4ba0: 2f 2a 20 4e 6f 74 20 61 6c 6c 20 57 48 45 52 45  /* Not all WHERE
4bb0: 20 74 65 72 6d 73 20 72 65 73 6f 6c 76 65 64 20   terms resolved 
4bc0: 62 79 20 6f 75 74 65 72 20 6c 6f 6f 70 20 2a 2f  by outer loop */
4bd0: 0a 20 20 75 38 20 65 44 69 73 74 69 6e 63 74 3b  .  u8 eDistinct;
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4bf0: 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
4c00: 5f 44 49 53 54 49 4e 43 54 5f 2a 20 76 61 6c 75  _DISTINCT_* valu
4c10: 65 73 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38  es below */.  u8
4c20: 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20   nLevel;        
4c30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4c40: 72 20 6f 66 20 6e 65 73 74 65 64 20 6c 6f 6f 70  r of nested loop
4c50: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f 70 3b 20   */.  int iTop; 
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 2f 2a 20 54 68 65 20 76 65 72 79 20 62 65 67 69  /* The very begi
4c80: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 57 48 45  nning of the WHE
4c90: 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  RE loop */.  int
4ca0: 20 69 43 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20   iContinue;     
4cb0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
4cc0: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
4cd0: 77 69 74 68 20 6e 65 78 74 20 72 65 63 6f 72 64  with next record
4ce0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
4cf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4d00: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
4d10: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
4d20: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 73   loop */.  int s
4d30: 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 20  avedNQueryLoop; 
4d40: 20 20 20 20 20 2f 2a 20 70 50 61 72 73 65 2d 3e       /* pParse->
4d50: 6e 51 75 65 72 79 4c 6f 6f 70 20 6f 75 74 73 69  nQueryLoop outsi
4d60: 64 65 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  de the WHERE loo
4d70: 70 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  p */.  WhereMask
4d80: 53 65 74 20 73 4d 61 73 6b 53 65 74 3b 20 20 20  Set sMaskSet;   
4d90: 20 2f 2a 20 4d 61 70 20 63 75 72 73 6f 72 20 6e   /* Map cursor n
4da0: 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73  umbers to bitmas
4db0: 6b 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ks */.  WhereCla
4dc0: 75 73 65 20 73 57 43 3b 20 20 20 20 20 20 20 20  use sWC;        
4dd0: 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69    /* Decompositi
4de0: 6f 6e 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  on of the WHERE 
4df0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
4e00: 65 4c 65 76 65 6c 20 61 5b 31 5d 3b 20 20 20 20  eLevel a[1];    
4e10: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
4e20: 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68 20  tion about each 
4e30: 6e 65 73 74 20 6c 6f 6f 70 20 69 6e 20 57 48 45  nest loop in WHE
4e40: 52 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  RE */.};../*.** 
4e50: 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65  Bitmasks for the
4e60: 20 6f 70 65 72 61 74 6f 72 73 20 6f 6e 20 57 68   operators on Wh
4e70: 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 73 2e  ereTerm objects.
4e80: 20 20 54 68 65 73 65 20 61 72 65 20 61 6c 6c 0a    These are all.
4e90: 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
4ea0: 74 20 61 72 65 20 6f 66 20 69 6e 74 65 72 65 73  t are of interes
4eb0: 74 20 74 6f 20 74 68 65 20 71 75 65 72 79 20 70  t to the query p
4ec0: 6c 61 6e 6e 65 72 2e 20 20 41 6e 0a 2a 2a 20 4f  lanner.  An.** O
4ed0: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  R-ed combination
4ee0: 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65 73   of these values
4ef0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
4f00: 6e 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 0a  n searching for.
4f10: 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 57 68  ** particular Wh
4f20: 65 72 65 54 65 72 6d 73 20 77 69 74 68 69 6e 20  ereTerms within 
4f30: 61 20 57 68 65 72 65 43 6c 61 75 73 65 2e 0a 2a  a WhereClause..*
4f40: 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20  /.#define WO_IN 
4f50: 20 20 20 20 30 78 30 30 31 0a 23 64 65 66 69 6e      0x001.#defin
4f60: 65 20 57 4f 5f 45 51 20 20 20 20 20 30 78 30 30  e WO_EQ     0x00
4f70: 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20  2.#define WO_LT 
4f80: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
4f90: 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  LT-TK_EQ)).#defi
4fa0: 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f  ne WO_LE     (WO
4fb0: 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45  _EQ<<(TK_LE-TK_E
4fc0: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47  Q)).#define WO_G
4fd0: 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  T     (WO_EQ<<(T
4fe0: 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65  K_GT-TK_EQ)).#de
4ff0: 66 69 6e 65 20 57 4f 5f 47 45 20 20 20 20 20 28  fine WO_GE     (
5000: 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b  WO_EQ<<(TK_GE-TK
5010: 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f  _EQ)).#define WO
5020: 5f 4d 41 54 43 48 20 20 30 78 30 34 30 0a 23 64  _MATCH  0x040.#d
5030: 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20  efine WO_ISNULL 
5040: 30 78 30 38 30 0a 23 64 65 66 69 6e 65 20 57 4f  0x080.#define WO
5050: 5f 4f 52 20 20 20 20 20 30 78 31 30 30 20 20 20  _OR     0x100   
5060: 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f      /* Two or mo
5070: 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  re OR-connected 
5080: 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65  terms */.#define
5090: 20 57 4f 5f 41 4e 44 20 20 20 20 30 78 32 30 30   WO_AND    0x200
50a0: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
50b0: 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e 65 63   more AND-connec
50c0: 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65  ted terms */.#de
50d0: 66 69 6e 65 20 57 4f 5f 45 51 55 49 56 20 20 30  fine WO_EQUIV  0
50e0: 78 34 30 30 20 20 20 20 20 20 20 2f 2a 20 4f 66  x400       /* Of
50f0: 20 74 68 65 20 66 6f 72 6d 20 41 3d 3d 42 2c 20   the form A==B, 
5100: 62 6f 74 68 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  both columns */.
5110: 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20  #define WO_NOOP 
5120: 20 20 30 78 38 30 30 20 20 20 20 20 20 20 2f 2a    0x800       /*
5130: 20 54 68 69 73 20 74 65 72 6d 20 64 6f 65 73 20   This term does 
5140: 6e 6f 74 20 72 65 73 74 72 69 63 74 20 73 65 61  not restrict sea
5150: 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 0a 23 64  rch space */..#d
5160: 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20  efine WO_ALL    
5170: 30 78 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d  0xfff       /* M
5180: 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69  ask of all possi
5190: 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20  ble WO_* values 
51a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49  */.#define WO_SI
51b0: 4e 47 4c 45 20 30 78 30 66 66 20 20 20 20 20 20  NGLE 0x0ff      
51c0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
51d0: 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f  non-compound WO_
51e0: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a  * values */../*.
51f0: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 64 65 66  ** These are def
5200: 69 6e 69 74 69 6f 6e 73 20 6f 66 20 62 69 74 73  initions of bits
5210: 20 69 6e 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   in the WhereLoo
5220: 70 2e 77 73 46 6c 61 67 73 20 66 69 65 6c 64 2e  p.wsFlags field.
5230: 0a 2a 2a 20 54 68 65 20 70 61 72 74 69 63 75 6c  .** The particul
5240: 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ar combination o
5250: 66 20 62 69 74 73 20 69 6e 20 65 61 63 68 20 57  f bits in each W
5260: 68 65 72 65 4c 6f 6f 70 20 68 65 6c 70 20 74 6f  hereLoop help to
5270: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 74 68  .** determine th
5280: 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74  e algorithm that
5290: 20 57 68 65 72 65 4c 6f 6f 70 20 72 65 70 72 65   WhereLoop repre
52a0: 73 65 6e 74 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  sents..*/.#defin
52b0: 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  e WHERE_COLUMN_E
52c0: 51 20 20 20 20 30 78 30 30 30 30 30 30 30 31 20  Q    0x00000001 
52d0: 20 2f 2a 20 78 3d 45 58 50 52 20 2a 2f 0a 23 64   /* x=EXPR */.#d
52e0: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
52f0: 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30 30 30 30  MN_RANGE 0x00000
5300: 30 30 32 20 20 2f 2a 20 78 3c 45 58 50 52 20 61  002  /* x<EXPR a
5310: 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a  nd/or x>EXPR */.
5320: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
5330: 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78 30 30 30  LUMN_IN    0x000
5340: 30 30 30 30 34 20 20 2f 2a 20 78 20 49 4e 20 28  00004  /* x IN (
5350: 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ...) */.#define 
5360: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
5370: 4c 20 20 30 78 30 30 30 30 30 30 30 38 20 20 2f  L  0x00000008  /
5380: 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23  * x IS NULL */.#
5390: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4e  define WHERE_CON
53a0: 53 54 52 41 49 4e 54 20 20 20 30 78 30 30 30 30  STRAINT   0x0000
53b0: 30 30 30 66 20 20 2f 2a 20 41 6e 79 20 6f 66 20  000f  /* Any of 
53c0: 74 68 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  the WHERE_COLUMN
53d0: 5f 78 78 78 20 76 61 6c 75 65 73 20 2a 2f 0a 23  _xxx values */.#
53e0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54 4f 50  define WHERE_TOP
53f0: 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 30 30  _LIMIT    0x0000
5400: 30 30 31 30 20 20 2f 2a 20 78 3c 45 58 50 52 20  0010  /* x<EXPR 
5410: 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e 73 74  or x<=EXPR const
5420: 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  raint */.#define
5430: 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
5440: 20 20 20 20 30 78 30 30 30 30 30 30 32 30 20 20      0x00000020  
5450: 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20 78 3e 3d  /* x>EXPR or x>=
5460: 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20  EXPR constraint 
5470: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
5480: 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20 20 30 78  _BOTH_LIMIT   0x
5490: 30 30 30 30 30 30 33 30 20 20 2f 2a 20 42 6f 74  00000030  /* Bot
54a0: 68 20 78 3e 45 58 50 52 20 61 6e 64 20 78 3c 45  h x>EXPR and x<E
54b0: 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  XPR */.#define W
54c0: 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20  HERE_IDX_ONLY   
54d0: 20 20 30 78 30 30 30 30 30 30 34 30 20 20 2f 2a    0x00000040  /*
54e0: 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   Use index only 
54f0: 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a  - omit table */.
5500: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 50  #define WHERE_IP
5510: 4b 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30  K          0x000
5520: 30 30 31 30 30 20 20 2f 2a 20 78 20 69 73 20 74  00100  /* x is t
5530: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
5540: 52 59 20 4b 45 59 20 2a 2f 0a 23 64 65 66 69 6e  RY KEY */.#defin
5550: 65 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  e WHERE_INDEXED 
5560: 20 20 20 20 20 30 78 30 30 30 30 30 32 30 30 20       0x00000200 
5570: 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75 2e   /* WhereLoop.u.
5580: 62 74 72 65 65 2e 70 49 6e 64 65 78 20 69 73 20  btree.pIndex is 
5590: 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66 69 6e 65  valid */.#define
55a0: 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
55b0: 42 4c 45 20 30 78 30 30 30 30 30 34 30 30 20 20  BLE 0x00000400  
55c0: 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75 2e 76  /* WhereLoop.u.v
55d0: 74 61 62 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  tab is valid */.
55e0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 4e  #define WHERE_IN
55f0: 5f 41 42 4c 45 20 20 20 20 20 20 30 78 30 30 30  _ABLE      0x000
5600: 30 30 38 30 30 20 20 2f 2a 20 41 62 6c 65 20 74  00800  /* Able t
5610: 6f 20 73 75 70 70 6f 72 74 20 61 6e 20 49 4e 20  o support an IN 
5620: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66  operator */.#def
5630: 69 6e 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  ine WHERE_ONEROW
5640: 20 20 20 20 20 20 20 30 78 30 30 30 30 31 30 30         0x0000100
5650: 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f  0  /* Selects no
5660: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
5670: 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  ow */.#define WH
5680: 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20 20 20  ERE_MULTI_OR    
5690: 20 30 78 30 30 30 30 32 30 30 30 20 20 2f 2a 20   0x00002000  /* 
56a0: 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c  OR using multipl
56b0: 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 23 64 65  e indices */.#de
56c0: 66 69 6e 65 20 57 48 45 52 45 5f 41 55 54 4f 5f  fine WHERE_AUTO_
56d0: 49 4e 44 45 58 20 20 20 30 78 30 30 30 30 34 30  INDEX   0x000040
56e0: 30 30 20 20 2f 2a 20 55 73 65 73 20 61 6e 20 65  00  /* Uses an e
56f0: 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 2a  phemeral index *
5700: 2f 0a 0a 0a 2f 2a 20 43 6f 6e 76 65 72 74 20 61  /.../* Convert a
5710: 20 57 68 65 72 65 43 6f 73 74 20 76 61 6c 75 65   WhereCost value
5720: 20 28 31 30 20 74 69 6d 65 73 20 6c 6f 67 32 28   (10 times log2(
5730: 58 29 29 20 69 6e 74 6f 20 69 74 73 20 69 6e 74  X)) into its int
5740: 65 67 65 72 20 76 61 6c 75 65 20 58 2e 0a 2a 2a  eger value X..**
5750: 20 41 20 72 6f 75 67 68 20 61 70 70 72 6f 78 69   A rough approxi
5760: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  mation is used. 
5770: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
5780: 6e 65 64 20 69 73 20 6e 6f 74 20 65 78 61 63 74  ned is not exact
5790: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20  ..*/.static u64 
57a0: 77 68 65 72 65 43 6f 73 74 54 6f 49 6e 74 28 57  whereCostToInt(W
57b0: 68 65 72 65 43 6f 73 74 20 78 29 7b 0a 20 20 75  hereCost x){.  u
57c0: 36 34 20 6e 3b 0a 20 20 69 66 28 20 78 3c 31 30  64 n;.  if( x<10
57d0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6e   ) return 1;.  n
57e0: 20 3d 20 78 25 31 30 3b 0a 20 20 78 20 2f 3d 20   = x%10;.  x /= 
57f0: 31 30 3b 0a 20 20 69 66 28 20 6e 3e 3d 35 20 29  10;.  if( n>=5 )
5800: 20 6e 20 2d 3d 20 32 3b 0a 20 20 65 6c 73 65 20   n -= 2;.  else 
5810: 69 66 28 20 6e 3e 3d 31 20 29 20 6e 20 2d 3d 20  if( n>=1 ) n -= 
5820: 31 3b 0a 20 20 69 66 28 20 78 3e 3d 33 20 29 20  1;.  if( x>=3 ) 
5830: 72 65 74 75 72 6e 20 28 6e 2b 38 29 3c 3c 28 78  return (n+8)<<(x
5840: 2d 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 6e  -3);.  return (n
5850: 2b 38 29 3e 3e 28 33 2d 78 29 3b 0a 7d 0a 0a 2f  +8)>>(3-x);.}../
5860: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5870: 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
5880: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
5890: 66 72 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61  from a WHERE cla
58a0: 75 73 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74  use.*/.u64 sqlit
58b0: 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77  e3WhereOutputRow
58c0: 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20  Count(WhereInfo 
58d0: 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75  *pWInfo){.  retu
58e0: 72 6e 20 77 68 65 72 65 43 6f 73 74 54 6f 49 6e  rn whereCostToIn
58f0: 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  t(pWInfo->nRowOu
5900: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
5910: 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 57  urn one of the W
5920: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78 78  HERE_DISTINCT_xx
5930: 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69 6e  xxx values to in
5940: 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73 0a  dicate how this.
5950: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
5960: 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73 20  returns outputs 
5970: 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f  for DISTINCT pro
5980: 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  cessing..*/.int 
5990: 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
59a0: 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66 6f  stinct(WhereInfo
59b0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
59c0: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  urn pWInfo->eDis
59d0: 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinct;.}../*.** 
59e0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
59f0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
5a00: 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20  returns rows in 
5a10: 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e 0a  ORDER BY order..
5a20: 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  ** Return FALSE 
5a30: 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e 65  if the output ne
5a40: 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65 64  eds to be sorted
5a50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5a60: 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 57  WhereIsOrdered(W
5a70: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
5a80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  ){.  return pWIn
5a90: 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30 3b 0a 7d  fo->bOBSat!=0;.}
5aa0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5ab0: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
5ac0: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
5ad0: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
5ae0: 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65  continue.** imme
5af0: 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65  diately with the
5b00: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57   next row of a W
5b10: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
5b20: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
5b30: 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68  ContinueLabel(Wh
5b40: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
5b50: 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  {.  return pWInf
5b60: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  o->iContinue;.}.
5b70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5b80: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
5b90: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
5ba0: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  to in order to b
5bb0: 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61  reak.** out of a
5bc0: 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a   WHERE loop..*/.
5bd0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
5be0: 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72 65  BreakLabel(Where
5bf0: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
5c00: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
5c10: 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iBreak;.}../*.**
5c20: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5c30: 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
5c40: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 63 61  ETE statement ca
5c50: 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65 63 74  n operate direct
5c60: 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f 77  ly on.** the row
5c70: 69 64 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ids returned by 
5c80: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  a WHERE clause. 
5c90: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
5ca0: 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55 50 44   doing an.** UPD
5cb0: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6d 69  ATE or DELETE mi
5cc0: 67 68 74 20 63 68 61 6e 67 65 20 73 75 62 73 65  ght change subse
5cd0: 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c 61 75  quent WHERE clau
5ce0: 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 69  se results..*/.i
5cf0: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f  nt sqlite3WhereO
5d00: 6b 4f 6e 65 50 61 73 73 28 57 68 65 72 65 49 6e  kOnePass(WhereIn
5d10: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
5d20: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6f 6b  eturn pWInfo->ok
5d30: 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  OnePass;.}../*.*
5d40: 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f 6e 74 65  * Move the conte
5d50: 6e 74 20 6f 66 20 70 53 72 63 20 69 6e 74 6f 20  nt of pSrc into 
5d60: 70 44 65 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  pDest.*/.static 
5d70: 76 6f 69 64 20 77 68 65 72 65 4f 72 4d 6f 76 65  void whereOrMove
5d80: 28 57 68 65 72 65 4f 72 53 65 74 20 2a 70 44 65  (WhereOrSet *pDe
5d90: 73 74 2c 20 57 68 65 72 65 4f 72 53 65 74 20 2a  st, WhereOrSet *
5da0: 70 53 72 63 29 7b 0a 20 20 70 44 65 73 74 2d 3e  pSrc){.  pDest->
5db0: 6e 20 3d 20 70 53 72 63 2d 3e 6e 3b 0a 20 20 6d  n = pSrc->n;.  m
5dc0: 65 6d 63 70 79 28 70 44 65 73 74 2d 3e 61 2c 20  emcpy(pDest->a, 
5dd0: 70 53 72 63 2d 3e 61 2c 20 70 44 65 73 74 2d 3e  pSrc->a, pDest->
5de0: 6e 2a 73 69 7a 65 6f 66 28 70 44 65 73 74 2d 3e  n*sizeof(pDest->
5df0: 61 5b 30 5d 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  a[0]));.}../*.**
5e00: 20 54 72 79 20 74 6f 20 69 6e 73 65 72 74 20 61   Try to insert a
5e10: 20 6e 65 77 20 70 72 65 72 65 71 75 69 73 69 74   new prerequisit
5e20: 65 2f 63 6f 73 74 20 65 6e 74 72 79 20 69 6e 74  e/cost entry int
5e30: 6f 20 74 68 65 20 57 68 65 72 65 4f 72 53 65 74  o the WhereOrSet
5e40: 20 70 53 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pSet..**.** The
5e50: 20 6e 65 77 20 65 6e 74 72 79 20 6d 69 67 68 74   new entry might
5e60: 20 6f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78   overwrite an ex
5e70: 69 73 74 69 6e 67 20 65 6e 74 72 79 2c 20 6f 72  isting entry, or
5e80: 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20   it might be.** 
5e90: 61 70 70 65 6e 64 65 64 2c 20 6f 72 20 69 74 20  appended, or it 
5ea0: 6d 69 67 68 74 20 62 65 20 64 69 73 63 61 72 64  might be discard
5eb0: 65 64 2e 20 20 44 6f 20 77 68 61 74 65 76 65 72  ed.  Do whatever
5ec0: 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 68   is the right th
5ed0: 69 6e 67 0a 2a 2a 20 73 6f 20 74 68 61 74 20 70  ing.** so that p
5ee0: 53 65 74 20 6b 65 65 70 73 20 74 68 65 20 4e 5f  Set keeps the N_
5ef0: 4f 52 5f 43 4f 53 54 20 62 65 73 74 20 65 6e 74  OR_COST best ent
5f00: 72 69 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72  ries seen so far
5f10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5f20: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 0a 20  whereOrInsert(. 
5f30: 20 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53 65   WhereOrSet *pSe
5f40: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  t,      /* The W
5f50: 68 65 72 65 4f 72 53 65 74 20 74 6f 20 62 65 20  hereOrSet to be 
5f60: 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 42 69 74  updated */.  Bit
5f70: 6d 61 73 6b 20 70 72 65 72 65 71 2c 20 20 20 20  mask prereq,    
5f80: 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 69 73      /* Prerequis
5f90: 69 74 65 73 20 6f 66 20 74 68 65 20 6e 65 77 20  ites of the new 
5fa0: 65 6e 74 72 79 20 2a 2f 0a 20 20 57 68 65 72 65  entry */.  Where
5fb0: 43 6f 73 74 20 72 52 75 6e 2c 20 20 20 20 20 20  Cost rRun,      
5fc0: 20 20 2f 2a 20 52 75 6e 2d 63 6f 73 74 20 6f 66    /* Run-cost of
5fd0: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a   the new entry *
5fe0: 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e 4f  /.  WhereCost nO
5ff0: 75 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ut         /* Nu
6000: 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73 20  mber of outputs 
6010: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
6020: 79 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 69 3b  y */.){.  u16 i;
6030: 0a 20 20 57 68 65 72 65 4f 72 43 6f 73 74 20 2a  .  WhereOrCost *
6040: 70 3b 0a 20 20 66 6f 72 28 69 3d 70 53 65 74 2d  p;.  for(i=pSet-
6050: 3e 6e 2c 20 70 3d 70 53 65 74 2d 3e 61 3b 20 69  >n, p=pSet->a; i
6060: 3e 30 3b 20 69 2d 2d 2c 20 70 2b 2b 29 7b 0a 20  >0; i--, p++){. 
6070: 20 20 20 69 66 28 20 72 52 75 6e 3c 3d 70 2d 3e     if( rRun<=p->
6080: 72 52 75 6e 20 26 26 20 28 70 72 65 72 65 71 20  rRun && (prereq 
6090: 26 20 70 2d 3e 70 72 65 72 65 71 29 3d 3d 70 72  & p->prereq)==pr
60a0: 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 67 6f  ereq ){.      go
60b0: 74 6f 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74  to whereOrInsert
60c0: 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  _done;.    }.   
60d0: 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52   if( p->rRun<=rR
60e0: 75 6e 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71  un && (p->prereq
60f0: 20 26 20 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70   & prereq)==p->p
6100: 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 72  rereq ){.      r
6110: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
6120: 20 7d 0a 20 20 69 66 28 20 70 53 65 74 2d 3e 6e   }.  if( pSet->n
6130: 3c 4e 5f 4f 52 5f 43 4f 53 54 20 29 7b 0a 20 20  <N_OR_COST ){.  
6140: 20 20 70 20 3d 20 26 70 53 65 74 2d 3e 61 5b 70    p = &pSet->a[p
6150: 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a 20 20 20 20 70  Set->n++];.    p
6160: 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a 20  ->nOut = nOut;. 
6170: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
6180: 70 53 65 74 2d 3e 61 3b 0a 20 20 20 20 66 6f 72  pSet->a;.    for
6190: 28 69 3d 31 3b 20 69 3c 70 53 65 74 2d 3e 6e 3b  (i=1; i<pSet->n;
61a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
61b0: 20 70 2d 3e 72 52 75 6e 3e 70 53 65 74 2d 3e 61   p->rRun>pSet->a
61c0: 5b 69 5d 2e 72 52 75 6e 20 29 20 70 20 3d 20 70  [i].rRun ) p = p
61d0: 53 65 74 2d 3e 61 20 2b 20 69 3b 0a 20 20 20 20  Set->a + i;.    
61e0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75  }.    if( p->rRu
61f0: 6e 3c 3d 72 52 75 6e 20 29 20 72 65 74 75 72 6e  n<=rRun ) return
6200: 20 30 3b 0a 20 20 7d 0a 77 68 65 72 65 4f 72 49   0;.  }.whereOrI
6210: 6e 73 65 72 74 5f 64 6f 6e 65 3a 0a 20 20 70 2d  nsert_done:.  p-
6220: 3e 70 72 65 72 65 71 20 3d 20 70 72 65 72 65 71  >prereq = prereq
6230: 3b 0a 20 20 70 2d 3e 72 52 75 6e 20 3d 20 72 52  ;.  p->rRun = rR
6240: 75 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 75  un;.  if( p->nOu
6250: 74 3e 6e 4f 75 74 20 29 20 70 2d 3e 6e 4f 75 74  t>nOut ) p->nOut
6260: 20 3d 20 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72   = nOut;.  retur
6270: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 1;.}../*.** In
6280: 69 74 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c  itialize a preal
6290: 6c 6f 63 61 74 65 64 20 57 68 65 72 65 43 6c 61  located WhereCla
62a0: 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  use structure..*
62b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
62c0: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20  ereClauseInit(. 
62d0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
62e0: 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  C,        /* The
62f0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20   WhereClause to 
6300: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  be initialized *
6310: 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
6320: 57 49 6e 66 6f 20 20 20 20 20 20 20 20 2f 2a 20  WInfo        /* 
6330: 54 68 65 20 57 48 45 52 45 20 70 72 6f 63 65 73  The WHERE proces
6340: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6350: 29 7b 0a 20 20 70 57 43 2d 3e 70 57 49 6e 66 6f  ){.  pWC->pWInfo
6360: 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 70 57 43   = pWInfo;.  pWC
6370: 2d 3e 70 4f 75 74 65 72 20 3d 20 30 3b 0a 20 20  ->pOuter = 0;.  
6380: 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a  pWC->nTerm = 0;.
6390: 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41    pWC->nSlot = A
63a0: 72 72 61 79 53 69 7a 65 28 70 57 43 2d 3e 61 53  rraySize(pWC->aS
63b0: 74 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61  tatic);.  pWC->a
63c0: 20 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b   = pWC->aStatic;
63d0: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
63e0: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
63f0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61  ic void whereCla
6400: 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c  useClear(WhereCl
6410: 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44  ause*);../*.** D
6420: 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65  eallocate all me
6430: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
6440: 77 69 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e  with a WhereOrIn
6450: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
6460: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f  atic void whereO
6470: 72 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69  rInfoDelete(sqli
6480: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72  te3 *db, WhereOr
6490: 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72  Info *p){.  wher
64a0: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d  eClauseClear(&p-
64b0: 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  >wc);.  sqlite3D
64c0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
64d0: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
64e0: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
64f0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57  ociated with a W
6500: 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65  hereAndInfo obje
6510: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
6520: 69 64 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44  id whereAndInfoD
6530: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
6540: 62 2c 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20  b, WhereAndInfo 
6550: 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75  *p){.  whereClau
6560: 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b  seClear(&p->wc);
6570: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
6580: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
6590: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57  * Deallocate a W
65a0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
65b0: 74 75 72 65 2e 20 20 54 68 65 20 57 68 65 72 65  ture.  The Where
65c0: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
65d0: 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f  .** itself is no
65e0: 74 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 72  t freed.  This r
65f0: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e  outine is the in
6600: 76 65 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c  verse of whereCl
6610: 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73  auseInit()..*/.s
6620: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
6630: 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72  ClauseClear(Wher
6640: 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20  eClause *pWC){. 
6650: 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54   int i;.  WhereT
6660: 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65  erm *a;.  sqlite
6670: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49  3 *db = pWC->pWI
6680: 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
6690: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
66a0: 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b  erm-1, a=pWC->a;
66b0: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29   i>=0; i--, a++)
66c0: 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46  {.    if( a->wtF
66d0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41  lags & TERM_DYNA
66e0: 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MIC ){.      sql
66f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
6700: 62 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20  b, a->pExpr);.  
6710: 20 20 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e 77    }.    if( a->w
6720: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
6730: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68  INFO ){.      wh
6740: 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28  ereOrInfoDelete(
6750: 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f  db, a->u.pOrInfo
6760: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
6770: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
6780: 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20  RM_ANDINFO ){.  
6790: 20 20 20 20 77 68 65 72 65 41 6e 64 49 6e 66 6f      whereAndInfo
67a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
67b0: 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  pAndInfo);.    }
67c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e  .  }.  if( pWC->
67d0: 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  a!=pWC->aStatic 
67e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
67f0: 46 72 65 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Free(db, pWC->a)
6800: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ;.  }.}../* Forw
6810: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
6820: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43  */.static WhereC
6830: 6f 73 74 20 77 68 65 72 65 43 6f 73 74 28 74 52  ost whereCost(tR
6840: 6f 77 63 6e 74 20 78 29 3b 0a 0a 2f 2a 0a 2a 2a  owcnt x);../*.**
6850: 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 6e 65   Add a single ne
6860: 77 20 57 68 65 72 65 54 65 72 6d 20 65 6e 74 72  w WhereTerm entr
6870: 79 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c  y to the WhereCl
6880: 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e  ause object pWC.
6890: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57 68 65 72  .** The new Wher
68a0: 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20  eTerm object is 
68b0: 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d  constructed from
68c0: 20 45 78 70 72 20 70 20 61 6e 64 20 77 69 74 68   Expr p and with
68d0: 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65   wtFlags..** The
68e0: 20 69 6e 64 65 78 20 69 6e 20 70 57 43 2d 3e 61   index in pWC->a
68f0: 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77 20 57 68  [] of the new Wh
6900: 65 72 65 54 65 72 6d 20 69 73 20 72 65 74 75 72  ereTerm is retur
6910: 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ned on success..
6920: 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  ** 0 is returned
6930: 20 69 66 20 74 68 65 20 6e 65 77 20 57 68 65 72   if the new Wher
6940: 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20  eTerm could not 
6950: 62 65 20 61 64 64 65 64 20 64 75 65 20 74 6f 20  be added due to 
6960: 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f  a memory.** allo
6970: 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54  cation error.  T
6980: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
6990: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 77 69 6c  tion failure wil
69a0: 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e  l be recorded in
69b0: 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  .** the db->mall
69c0: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 6f  ocFailed flag so
69d0: 20 74 68 61 74 20 68 69 67 68 65 72 2d 6c 65 76   that higher-lev
69e0: 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  el functions can
69f0: 20 64 65 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a   detect it..**.*
6a00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
6a10: 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65  ill increase the
6a20: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 57 43   size of the pWC
6a30: 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61 73 20 6e  ->a[] array as n
6a40: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
6a50: 49 66 20 74 68 65 20 77 74 46 6c 61 67 73 20 61  If the wtFlags a
6a60: 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73  rgument includes
6a70: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74   TERM_DYNAMIC, t
6a80: 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  hen responsibili
6a90: 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e  ty.** for freein
6aa0: 67 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  g the expression
6ab0: 20 70 20 69 73 20 61 73 73 75 6d 65 64 20 62 79   p is assumed by
6ac0: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
6ad0: 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20   object pWC..** 
6ae0: 54 68 69 73 20 69 73 20 74 72 75 65 20 65 76 65  This is true eve
6af0: 6e 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  n if this routin
6b00: 65 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63  e fails to alloc
6b10: 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 54  ate a new WhereT
6b20: 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49  erm..**.** WARNI
6b30: 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e  NG:  This routin
6b40: 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63 61  e might realloca
6b50: 74 65 20 74 68 65 20 73 70 61 63 65 20 75 73 65  te the space use
6b60: 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68  d to store.** Wh
6b70: 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70  ereTerms.  All p
6b80: 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65 72 65  ointers to Where
6b90: 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62 65 20  Terms should be 
6ba0: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 66 74 65  invalidated afte
6bb0: 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69  r.** calling thi
6bc0: 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75 63 68  s routine.  Such
6bd0: 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20 62 65   pointers may be
6be0: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62   reinitialized b
6bf0: 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a  y referencing.**
6c00: 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72   the pWC->a[] ar
6c10: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ray..*/.static i
6c20: 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  nt whereClauseIn
6c30: 73 65 72 74 28 57 68 65 72 65 43 6c 61 75 73 65  sert(WhereClause
6c40: 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 2c 20   *pWC, Expr *p, 
6c50: 75 38 20 77 74 46 6c 61 67 73 29 7b 0a 20 20 57  u8 wtFlags){.  W
6c60: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
6c70: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 74 65  .  int idx;.  te
6c80: 73 74 63 61 73 65 28 20 77 74 46 6c 61 67 73 20  stcase( wtFlags 
6c90: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
6ca0: 3b 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65  ;.  if( pWC->nTe
6cb0: 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29  rm>=pWC->nSlot )
6cc0: 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
6cd0: 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a  *pOld = pWC->a;.
6ce0: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
6cf0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
6d00: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70  Parse->db;.    p
6d10: 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  WC->a = sqlite3D
6d20: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
6d30: 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29  izeof(pWC->a[0])
6d40: 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b  *pWC->nSlot*2 );
6d50: 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d  .    if( pWC->a=
6d60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
6d70: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44  wtFlags & TERM_D
6d80: 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20  YNAMIC ){.      
6d90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6da0: 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ete(db, p);.    
6db0: 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61    }.      pWC->a
6dc0: 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72   = pOld;.      r
6dd0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
6de0: 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61     memcpy(pWC->a
6df0: 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70  , pOld, sizeof(p
6e00: 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e  WC->a[0])*pWC->n
6e10: 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Term);.    if( p
6e20: 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69  Old!=pWC->aStati
6e30: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
6e40: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c  e3DbFree(db, pOl
6e50: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  d);.    }.    pW
6e60: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74  C->nSlot = sqlit
6e70: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64  e3DbMallocSize(d
6e80: 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f  b, pWC->a)/sizeo
6e90: 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20  f(pWC->a[0]);.  
6ea0: 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43  }.  pTerm = &pWC
6eb0: 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e  ->a[idx = pWC->n
6ec0: 54 65 72 6d 2b 2b 5d 3b 0a 20 20 69 66 28 20 77  Term++];.  if( w
6ed0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
6ee0: 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 70 54 65  RTUAL ){.    pTe
6ef0: 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20 3d 20  rm->truthProb = 
6f00: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
6f10: 20 26 26 20 45 78 70 72 48 61 73 41 6e 79 50 72   && ExprHasAnyPr
6f20: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 48 69 6e  operty(p, EP_Hin
6f30: 74 29 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  t) ){.    pTerm-
6f40: 3e 74 72 75 74 68 50 72 6f 62 20 3d 20 77 68 65  >truthProb = whe
6f50: 72 65 43 6f 73 74 28 70 2d 3e 69 54 61 62 6c 65  reCost(p->iTable
6f60: 29 20 2d 20 39 39 3b 0a 20 20 7d 65 6c 73 65 7b  ) - 99;.  }else{
6f70: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 74 72 75 74  .    pTerm->trut
6f80: 68 50 72 6f 62 20 3d 20 2d 31 3b 0a 20 20 7d 0a  hProb = -1;.  }.
6f90: 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d    pTerm->pExpr =
6fa0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
6fb0: 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20 20 70 54  Collate(p);.  pT
6fc0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77  erm->wtFlags = w
6fd0: 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d  tFlags;.  pTerm-
6fe0: 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54  >pWC = pWC;.  pT
6ff0: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d  erm->iParent = -
7000: 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b  1;.  return idx;
7010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
7020: 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65  outine identifie
7030: 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  s subexpressions
7040: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
7050: 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61  ause where.** ea
7060: 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ch subexpression
7070: 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
7080: 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   the AND operato
7090: 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a  r or some other.
70a0: 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63  ** operator spec
70b0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20  ified in the op 
70c0: 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20  parameter.  The 
70d0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
70e0: 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c  cture.** is fill
70f0: 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73  ed with pointers
7100: 20 74 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f   to subexpressio
7110: 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ns.  For example
7120: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45  :.**.**    WHERE
7130: 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44    a=='hello' AND
7140: 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c   coalesce(b,11)<
7150: 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20  10 AND (c+12!=d 
7160: 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20  OR c==22).**    
7170: 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
7180: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
7190: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f  ______/     \___
71a0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
71b0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f  *            slo
71c0: 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20 20  t[0]            
71d0: 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20  slot[1]         
71e0: 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a        slot[2].**
71f0: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
7200: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
7210: 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65   pExpr is unalte
7220: 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72  red.  All this r
7230: 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69  outine.** does i
7240: 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e  s make slot[] en
7250: 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73  tries point to s
7260: 75 62 73 74 72 75 63 74 75 72 65 20 77 69 74 68  ubstructure with
7270: 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20  in pExpr..**.** 
7280: 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  In the previous 
7290: 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20  sentence and in 
72a0: 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c  the diagram, "sl
72b0: 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a  ot[]" refers to.
72c0: 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ** the WhereClau
72d0: 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54  se.a[] array.  T
72e0: 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20  he slot[] array 
72f0: 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20  grows as needed 
7300: 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c  to contain.** al
7310: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  l terms of the W
7320: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
7330: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
7340: 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75  eSplit(WhereClau
7350: 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
7360: 45 78 70 72 2c 20 75 38 20 6f 70 29 7b 0a 20 20  Expr, u8 op){.  
7370: 70 57 43 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20  pWC->op = op;.  
7380: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
7390: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
73a0: 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20  pr->op!=op ){.  
73b0: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73    whereClauseIns
73c0: 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20  ert(pWC, pExpr, 
73d0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
73e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
73f0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f   pExpr->pLeft, o
7400: 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  p);.    whereSpl
7410: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
7420: 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a  Right, op);.  }.
7430: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
7440: 69 7a 65 20 61 20 57 68 65 72 65 4d 61 73 6b 53  ize a WhereMaskS
7450: 65 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 23 64 65  et object.*/.#de
7460: 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74  fine initMaskSet
7470: 28 50 29 20 20 28 50 29 2d 3e 6e 3d 30 0a 0a 2f  (P)  (P)->n=0../
7480: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7490: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
74a0: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
74b0: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
74c0: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
74d0: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
74e0: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
74f0: 6b 20 67 65 74 4d 61 73 6b 28 57 68 65 72 65 4d  k getMask(WhereM
7500: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
7510: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
7520: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
7530: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d  t( pMaskSet->n<=
7540: 28 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d  (int)sizeof(Bitm
7550: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28  ask)*8 );.  for(
7560: 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d  i=0; i<pMaskSet-
7570: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  >n; i++){.    if
7580: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69  ( pMaskSet->ix[i
7590: 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  ]==iCursor ){.  
75a0: 20 20 20 20 72 65 74 75 72 6e 20 4d 41 53 4b 42      return MASKB
75b0: 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  IT(i);.    }.  }
75c0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
75d0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
75e0: 65 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73  ew mask for curs
75f0: 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  or iCursor..**.*
7600: 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63  * There is one c
7610: 75 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20  ursor per table 
7620: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
7630: 73 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  se.  The number 
7640: 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20  of.** tables in 
7650: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
7660: 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20  is limited by a 
7670: 74 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68  test early in th
7680: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72  e.** sqlite3Wher
7690: 65 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65  eBegin() routine
76a0: 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68  .  So we know th
76b0: 61 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d  at the pMaskSet-
76c0: 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77  >ix[].** array w
76d0: 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c  ill never overfl
76e0: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ow..*/.static vo
76f0: 69 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68  id createMask(Wh
7700: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
7710: 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f  kSet, int iCurso
7720: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d  r){.  assert( pM
7730: 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61  askSet->n < Arra
7740: 79 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e  ySize(pMaskSet->
7750: 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65  ix) );.  pMaskSe
7760: 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e  t->ix[pMaskSet->
7770: 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a  n++] = iCursor;.
7780: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72  }../*.** These r
7790: 6f 75 74 69 6e 65 73 20 77 61 6c 6b 20 28 72 65  outines walk (re
77a0: 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65 78  cursively) an ex
77b0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e  pression tree an
77c0: 64 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 61 20  d generate.** a 
77d0: 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69  bitmask indicati
77e0: 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65 73 20  ng which tables 
77f0: 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 61 74  are used in that
7800: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74   expression.** t
7810: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  ree..*/.static B
7820: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
7830: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
7840: 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73  askSet*, ExprLis
7850: 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d  t*);.static Bitm
7860: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
7870: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
7880: 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29  skSet*, Select*)
7890: 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  ;.static Bitmask
78a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
78b0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
78c0: 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29  askSet, Expr *p)
78d0: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
78e0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30   = 0;.  if( p==0
78f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
7900: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
7910: 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20  UMN ){.    mask 
7920: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
7930: 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a  et, p->iTable);.
7940: 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b      return mask;
7950: 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78  .  }.  mask = ex
7960: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
7970: 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74  skSet, p->pRight
7980: 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  );.  mask |= exp
7990: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
79a0: 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  kSet, p->pLeft);
79b0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
79c0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
79d0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6d  Select) ){.    m
79e0: 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63  ask |= exprSelec
79f0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
7a00: 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65  kSet, p->x.pSele
7a10: 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ct);.  }else{.  
7a20: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
7a30: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
7a40: 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73  skSet, p->x.pLis
7a50: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
7a60: 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20   mask;.}.static 
7a70: 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74  Bitmask exprList
7a80: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
7a90: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
7aa0: 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  t, ExprList *pLi
7ab0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
7ac0: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
7ad0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
7ae0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7af0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
7b00: 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c  +){.      mask |
7b10: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
7b20: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74  (pMaskSet, pList
7b30: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
7b40: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7b50: 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63  n mask;.}.static
7b60: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c   Bitmask exprSel
7b70: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68  ectTableUsage(Wh
7b80: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
7b90: 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53  kSet, Select *pS
7ba0: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  ){.  Bitmask mas
7bb0: 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  k = 0;.  while( 
7bc0: 70 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  pS ){.    SrcLis
7bd0: 74 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70 53  t *pSrc = pS->pS
7be0: 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  rc;.    mask |= 
7bf0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
7c00: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
7c10: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61  >pEList);.    ma
7c20: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
7c30: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
7c40: 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29  t, pS->pGroupBy)
7c50: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
7c60: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
7c70: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
7c80: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61  OrderBy);.    ma
7c90: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
7ca0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
7cb0: 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  S->pWhere);.    
7cc0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
7cd0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7ce0: 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20   pS->pHaving);. 
7cf0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53     if( ALWAYS(pS
7d00: 72 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  rc!=0) ){.      
7d10: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
7d20: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
7d30: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
7d40: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65    mask |= exprSe
7d50: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70  lectTableUsage(p
7d60: 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61  MaskSet, pSrc->a
7d70: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
7d80: 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78        mask |= ex
7d90: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
7da0: 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69  skSet, pSrc->a[i
7db0: 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ].pOn);.      }.
7dc0: 20 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20 70      }.    pS = p
7dd0: 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20  S->pPrior;.  }. 
7de0: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
7df0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
7e00: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
7e10: 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20  operator is one 
7e20: 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  of the operators
7e30: 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f   that is.** allo
7e40: 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  wed for an index
7e50: 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  able WHERE claus
7e60: 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c  e term.  The all
7e70: 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61  owed operators a
7e80: 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20  re.** "=", "<", 
7e90: 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c  ">", "<=", ">=",
7ea0: 20 22 49 4e 22 2c 20 61 6e 64 20 22 49 53 20 4e   "IN", and "IS N
7eb0: 55 4c 4c 22 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ULL".*/.static i
7ec0: 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74  nt allowedOp(int
7ed0: 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   op){.  assert( 
7ee0: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_GT>TK_EQ && T
7ef0: 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_GT<TK_GE );.  
7f00: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b  assert( TK_LT>TK
7f10: 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f  _EQ && TK_LT<TK_
7f20: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
7f30: 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LE>TK_EQ && T
7f40: 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LE<TK_GE );.  
7f50: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
7f60: 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75  K_EQ+4 );.  retu
7f70: 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  rn op==TK_IN || 
7f80: 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70  (op>=TK_EQ && op
7f90: 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d  <=TK_GE) || op==
7fa0: 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a  TK_ISNULL;.}../*
7fb0: 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a  .** Swap two obj
7fc0: 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 59 50  ects of type TYP
7fd0: 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57  E..*/.#define SW
7fe0: 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59  AP(TYPE,A,B) {TY
7ff0: 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74  PE t=A; A=B; B=t
8000: 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74  ;}../*.** Commut
8010: 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  e a comparison o
8020: 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73  perator.  Expres
8030: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
8040: 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72  m "X op Y".** ar
8050: 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
8060: 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a   "Y op X"..**.**
8070: 20 49 66 20 6c 65 66 74 2f 72 69 67 68 74 20 70   If left/right p
8080: 72 65 63 65 64 65 6e 63 65 20 72 75 6c 65 73 20  recedence rules 
8090: 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20 77  come into play w
80a0: 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  hen determining 
80b0: 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  the.** collating
80c0: 20 73 65 71 75 65 6e 63 65 2c 20 74 68 65 6e 20   sequence, then 
80d0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
80e0: 73 20 61 72 65 20 61 64 6a 75 73 74 65 64 20 74  s are adjusted t
80f0: 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74  o ensure.** that
8100: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
8110: 65 71 75 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74  equence does not
8120: 20 63 68 61 6e 67 65 2e 20 20 46 6f 72 20 65 78   change.  For ex
8130: 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20 63 6f 6c  ample:.** "Y col
8140: 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 58  late NOCASE op X
8150: 22 20 62 65 63 6f 6d 65 73 20 22 58 20 6f 70 20  " becomes "X op 
8160: 59 22 20 62 65 63 61 75 73 65 20 61 6e 79 20 63  Y" because any c
8170: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
8180: 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74  e on.** the left
8190: 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20   hand side of a 
81a0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72  comparison overr
81b0: 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69  ides any collati
81c0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20  on sequence .** 
81d0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
81e0: 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73  right. For the s
81f0: 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45  ame reason the E
8200: 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a  P_Collate flag.*
8210: 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65  * is not commute
8220: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
8230: 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50 61  d exprCommute(Pa
8240: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
8250: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36  r *pExpr){.  u16
8260: 20 65 78 70 52 69 67 68 74 20 3d 20 28 70 45 78   expRight = (pEx
8270: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67  pr->pRight->flag
8280: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b  s & EP_Collate);
8290: 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d  .  u16 expLeft =
82a0: 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   (pExpr->pLeft->
82b0: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
82c0: 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  te);.  assert( a
82d0: 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e  llowedOp(pExpr->
82e0: 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  op) && pExpr->op
82f0: 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66 28  !=TK_IN );.  if(
8300: 20 65 78 70 52 69 67 68 74 3d 3d 65 78 70 4c 65   expRight==expLe
8310: 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  ft ){.    /* Eit
8320: 68 65 72 20 58 20 61 6e 64 20 59 20 62 6f 74 68  her X and Y both
8330: 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70   have COLLATE op
8340: 65 72 61 74 6f 72 20 6f 72 20 6e 65 69 74 68 65  erator or neithe
8350: 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28 20  r do */.    if( 
8360: 65 78 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  expRight ){.    
8370: 20 20 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64 20    /* Both X and 
8380: 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f  Y have COLLATE o
8390: 70 65 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65 20  perators.  Make 
83a0: 73 75 72 65 20 58 20 69 73 20 61 6c 77 61 79 73  sure X is always
83b0: 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62  .      ** used b
83c0: 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 45  y clearing the E
83d0: 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20 66  P_Collate flag f
83e0: 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20 20  rom Y. */.      
83f0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
8400: 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c 6c  lags &= ~EP_Coll
8410: 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ate;.    }else i
8420: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
8430: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
8440: 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
8450: 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65 69 74 68  {.      /* Neith
8460: 65 72 20 58 20 6e 6f 72 20 59 20 68 61 76 65 20  er X nor Y have 
8470: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
8480: 73 2c 20 62 75 74 20 58 20 68 61 73 20 61 20 6e  s, but X has a n
8490: 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20 20 20 20  on-default.     
84a0: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65   ** collating se
84b0: 71 75 65 6e 63 65 2e 20 20 53 6f 20 61 64 64 20  quence.  So add 
84c0: 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 6d  the EP_Collate m
84d0: 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63 61  arker on X to ca
84e0: 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  use.      ** it 
84f0: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 66  to be searched f
8500: 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70  irst. */.      p
8510: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
8520: 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65  gs |= EP_Collate
8530: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53 57  ;.    }.  }.  SW
8540: 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e  AP(Expr*,pExpr->
8550: 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c  pRight,pExpr->pL
8560: 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70  eft);.  if( pExp
8570: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a  r->op>=TK_GT ){.
8580: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
8590: 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20  T==TK_GT+2 );.  
85a0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
85b0: 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20  =TK_LE+2 );.    
85c0: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
85d0: 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _EQ );.    asser
85e0: 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29  t( TK_GT<TK_LE )
85f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
8600: 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26  xpr->op>=TK_GT &
8610: 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f  & pExpr->op<=TK_
8620: 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  GE );.    pExpr-
8630: 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f  >op = ((pExpr->o
8640: 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47  p-TK_GT)^2)+TK_G
8650: 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  T;.  }.}../*.** 
8660: 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54  Translate from T
8670: 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f  K_xx operator to
8680: 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a   WO_xx bitmask..
8690: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70  */.static u16 op
86a0: 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f  eratorMask(int o
86b0: 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61  p){.  u16 c;.  a
86c0: 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70  ssert( allowedOp
86d0: 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70  (op) );.  if( op
86e0: 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63  ==TK_IN ){.    c
86f0: 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73   = WO_IN;.  }els
8700: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  e if( op==TK_ISN
8710: 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57  ULL ){.    c = W
8720: 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73  O_ISNULL;.  }els
8730: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e{.    assert( (
8740: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
8750: 29 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20  )) < 0x7fff );. 
8760: 20 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f     c = (u16)(WO_
8770: 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b  EQ<<(op-TK_EQ));
8780: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
8790: 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
87a0: 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a  c==WO_ISNULL );.
87b0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
87c0: 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20  _IN || c==WO_IN 
87d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
87e0: 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_EQ || c==WO_
87f0: 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EQ );.  assert( 
8800: 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d  op!=TK_LT || c==
8810: 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_LT );.  asser
8820: 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  t( op!=TK_LE || 
8830: 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73  c==WO_LE );.  as
8840: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20  sert( op!=TK_GT 
8850: 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20  || c==WO_GT );. 
8860: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
8870: 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29  GE || c==WO_GE )
8880: 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  ;.  return c;.}.
8890: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
88a0: 6f 20 74 68 65 20 6e 65 78 74 20 57 68 65 72 65  o the next Where
88b0: 54 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68 65  Term that matche
88c0: 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  s according to t
88d0: 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 65  he criteria.** e
88e0: 73 74 61 62 6c 69 73 68 65 64 20 77 68 65 6e 20  stablished when 
88f0: 74 68 65 20 70 53 63 61 6e 20 6f 62 6a 65 63 74  the pScan object
8900: 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64   was initialized
8910: 20 62 79 20 77 68 65 72 65 53 63 61 6e 49 6e 69   by whereScanIni
8920: 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e  t()..** Return N
8930: 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65  ULL if there are
8940: 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69 6e   no more matchin
8950: 67 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2f  g WhereTerms..*/
8960: 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72  .static WhereTer
8970: 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e 65 78 74  m *whereScanNext
8980: 28 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61  (WhereScan *pSca
8990: 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b 20  n){.  int iCur; 
89a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
89b0: 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20  e cursor on the 
89c0: 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 20  LHS of the term 
89d0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
89e0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
89f0: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 4c   column on the L
8a00: 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 2e 20  HS of the term. 
8a10: 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a 20   -1 for IPK */. 
8a20: 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
8a30: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72        /* An expr
8a40: 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 74 65 73  ession being tes
8a50: 74 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ted */.  WhereCl
8a60: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a  ause *pWC;    /*
8a70: 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70   Shorthand for p
8a80: 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20 57  Scan->pWC */.  W
8a90: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
8aa0: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
8ab0: 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a  being tested */.
8ac0: 20 20 69 6e 74 20 6b 20 3d 20 70 53 63 61 6e 2d    int k = pScan-
8ad0: 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20  >k;    /* Where 
8ae0: 74 6f 20 73 74 61 72 74 20 73 63 61 6e 6e 69 6e  to start scannin
8af0: 67 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 70  g */..  while( p
8b00: 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 70 53  Scan->iEquiv<=pS
8b10: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20  can->nEquiv ){. 
8b20: 20 20 20 69 43 75 72 20 3d 20 70 53 63 61 6e 2d     iCur = pScan-
8b30: 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e 69  >aEquiv[pScan->i
8b40: 45 71 75 69 76 2d 32 5d 3b 0a 20 20 20 20 69 43  Equiv-2];.    iC
8b50: 6f 6c 75 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61  olumn = pScan->a
8b60: 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71  Equiv[pScan->iEq
8b70: 75 69 76 2d 31 5d 3b 0a 20 20 20 20 77 68 69 6c  uiv-1];.    whil
8b80: 65 28 20 28 70 57 43 20 3d 20 70 53 63 61 6e 2d  e( (pWC = pScan-
8b90: 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20 20 20 20  >pWC)!=0 ){.    
8ba0: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
8bb0: 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65  >a+k; k<pWC->nTe
8bc0: 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; k++, pTerm++
8bd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
8be0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
8bf0: 3d 3d 69 43 75 72 20 26 26 20 70 54 65 72 6d 2d  ==iCur && pTerm-
8c00: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69  >u.leftColumn==i
8c10: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
8c20: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
8c30: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
8c40: 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20 20  QUIV)!=0.       
8c50: 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45      && pScan->nE
8c60: 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28 70  quiv<ArraySize(p
8c70: 53 63 61 6e 2d 3e 61 45 71 75 69 76 29 0a 20 20  Scan->aEquiv).  
8c80: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
8c90: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
8ca0: 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 73            pX = s
8cb0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
8cc0: 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45 78  llate(pTerm->pEx
8cd0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
8ce0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
8cf0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pX->op==TK_COLU
8d00: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  MN );.          
8d10: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 63    for(j=0; j<pSc
8d20: 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b 3d 32  an->nEquiv; j+=2
8d30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8d40: 20 69 66 28 20 70 53 63 61 6e 2d 3e 61 45 71 75   if( pScan->aEqu
8d50: 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c  iv[j]==pX->iTabl
8d60: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
8d70: 20 26 26 20 70 53 63 61 6e 2d 3e 61 45 71 75 69   && pScan->aEqui
8d80: 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c  v[j+1]==pX->iCol
8d90: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
8da0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8dd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
8de0: 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29  =pScan->nEquiv )
8df0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8e00: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d  pScan->aEquiv[j]
8e10: 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
8e30: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 20  an->aEquiv[j+1] 
8e40: 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  = pX->iColumn;. 
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
8e60: 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d 20 32 3b  an->nEquiv += 2;
8e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
8e80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8e90: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
8ea0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53 63  >eOperator & pSc
8eb0: 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29  an->opMask)!=0 )
8ec0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
8ed0: 20 56 65 72 69 66 79 20 74 68 65 20 61 66 66 69   Verify the affi
8ee0: 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69  nity and collati
8ef0: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74 63  ng sequence matc
8f00: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  h */.           
8f10: 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c   if( pScan->zCol
8f20: 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d 2d  lName && (pTerm-
8f30: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8f40: 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  ISNULL)==0 ){.  
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c              Coll
8f60: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
8f70: 20 20 20 20 20 20 20 20 20 20 50 61 72 73 65 20            Parse 
8f80: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
8f90: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20               pX 
8fb0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8fd0: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
8fe0: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53  ffinityOk(pX, pS
8ff0: 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a  can->idxaff) ){.
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9010: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9020: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9030: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
9040: 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  X->pLeft);.     
9050: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
9060: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
9070: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
9080: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65 66 74         pX->pLeft
90c0: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
90e0: 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
90f0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
9100: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
9110: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
9120: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
9130: 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d  l->zName, pScan-
9140: 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20  >zCollName) ){. 
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
9160: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
9170: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9190: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
91a0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
91b0: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
91c0: 20 20 26 26 20 28 70 58 20 3d 20 70 54 65 72 6d    && (pX = pTerm
91d0: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  ->pExpr->pRight)
91e0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
9200: 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 63 61  pX->iTable==pSca
9210: 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a 20 20 20  n->aEquiv[0].   
9220: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d            && pX-
9230: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d  >iColumn==pScan-
9240: 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20 20 20 20  >aEquiv[1].     
9250: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
9260: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
9270: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
9280: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61              pSca
9290: 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20  n->k = k+1;.    
92a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
92b0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
92c0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
92d0: 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e 2d    }.      pScan-
92e0: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57  >pWC = pScan->pW
92f0: 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 20  C->pOuter;.     
9300: 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20   k = 0;.    }.  
9310: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
9320: 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20  Scan->pOrigWC;. 
9330: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53     k = 0;.    pS
9340: 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b 3d 20 32  can->iEquiv += 2
9350: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
9360: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
9370: 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c  alize a WHERE cl
9380: 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a  ause scanner obj
9390: 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ect.  Return a p
93a0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
93b0: 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52   first match.  R
93c0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
93d0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68  ere are no match
93e0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  es..**.** The sc
93f0: 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65  anner will be se
9400: 61 72 63 68 69 6e 67 20 74 68 65 20 57 48 45 52  arching the WHER
9410: 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49  E clause pWC.  I
9420: 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66  t will look.** f
9430: 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  or terms of the 
9440: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
9450: 70 72 3e 22 20 77 68 65 72 65 20 58 20 69 73 20  pr>" where X is 
9460: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f  column iColumn o
9470: 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e  f table.** iCur.
9480: 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20    The <op> must 
9490: 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70  be one of the op
94a0: 65 72 61 74 6f 72 73 20 64 65 73 63 72 69 62 65  erators describe
94b0: 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a  d by opMask..**.
94c0: 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72 63 68  ** If the search
94d0: 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68   is for X and th
94e0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
94f0: 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66  ontains terms of
9500: 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59   the.** form X=Y
9510: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
9520: 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65  ne might also re
9530: 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  turn terms of th
9540: 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70  e form.** "Y <op
9550: 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20  > <expr>".  The 
9560: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
9570: 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69 74 79   of transitivity
9580: 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20   is limited,.** 
9590: 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f  but is enough to
95a0: 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d   handle most com
95b0: 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20  monly occurring 
95c0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  SQL statements..
95d0: 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f  **.** If X is no
95e0: 74 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  t the INTEGER PR
95f0: 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58  IMARY KEY then X
9600: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   must be compati
9610: 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65  ble with.** inde
9620: 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  x pIdx..*/.stati
9630: 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65  c WhereTerm *whe
9640: 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68  reScanInit(.  Wh
9650: 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20  ereScan *pScan, 
9660: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
9670: 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65  reScan object be
9680: 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ing initialized 
9690: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
96a0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20   *pWC,       /* 
96b0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
96c0: 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
96d0: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
96f0: 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f  ursor to scan fo
9700: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  r */.  int iColu
9710: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
9720: 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e  * Column to scan
9730: 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70   for */.  u32 op
9740: 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Mask,           
9750: 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29    /* Operator(s)
9760: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
9770: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
9780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
9790: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
97a0: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 20  with this index 
97b0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 0a  */.){.  int j;..
97c0: 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63 61    /* memset(pSca
97d0: 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53  n, 0, sizeof(*pS
97e0: 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63 61  can)); */.  pSca
97f0: 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57 43  n->pOrigWC = pWC
9800: 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d  ;.  pScan->pWC =
9810: 20 70 57 43 3b 0a 20 20 69 66 28 20 70 49 64 78   pWC;.  if( pIdx
9820: 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29   && iColumn>=0 )
9830: 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78  {.    pScan->idx
9840: 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  aff = pIdx->pTab
9850: 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
9860: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
9870: 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61  for(j=0; pIdx->a
9880: 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c  iColumn[j]!=iCol
9890: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
98a0: 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70 49   if( NEVER(j>=pI
98b0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20 72  dx->nColumn) ) r
98c0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
98d0: 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e     pScan->zCollN
98e0: 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  ame = pIdx->azCo
98f0: 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ll[j];.  }else{.
9900: 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66      pScan->idxaf
9910: 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e  f = 0;.    pScan
9920: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b  ->zCollName = 0;
9930: 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70  .  }.  pScan->op
9940: 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20  Mask = opMask;. 
9950: 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20   pScan->k = 0;. 
9960: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30   pScan->aEquiv[0
9970: 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63 61  ] = iCur;.  pSca
9980: 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20 3d 20 69  n->aEquiv[1] = i
9990: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d  Column;.  pScan-
99a0: 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 70  >nEquiv = 2;.  p
99b0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20 32  Scan->iEquiv = 2
99c0: 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72 65  ;.  return where
99d0: 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b  ScanNext(pScan);
99e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
99f0: 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74   for a term in t
9a00: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
9a10: 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66  that is of the f
9a20: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
9a30: 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69  r>".** where X i
9a40: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
9a50: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20   the iColumn of 
9a60: 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20 3c  table iCur and <
9a70: 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a  op> is one of.**
9a80: 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61   the WO_xx opera
9a90: 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69 66  tor codes specif
9aa0: 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70 61  ied by the op pa
9ab0: 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75  rameter..** Retu
9ac0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
9ad0: 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72  the term.  Retur
9ae0: 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  n 0 if not found
9af0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
9b00: 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20   returned might 
9b10: 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20 74  by Y=<expr> if t
9b20: 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72 20  here is another 
9b30: 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a  constraint in.**
9b40: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
9b50: 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  e that specifies
9b60: 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79 20   that X=Y.  Any 
9b70: 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 73  such constraints
9b80: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e   will be.** iden
9b90: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57 4f  tified by the WO
9ba0: 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74 68  _EQUIV bit in th
9bb0: 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  e pTerm->eOperat
9bc0: 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a  or field.  The.*
9bd0: 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72 61 79  * aEquiv[] array
9be0: 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61 6c 6c   holds X and all
9bf0: 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74 73   its equivalents
9c00: 2c 20 77 69 74 68 20 65 61 63 68 20 53 51 4c 20  , with each SQL 
9c10: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61 6b 69  variable.** taki
9c20: 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74 73 20  ng up two slots 
9c30: 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20 54 68  in aEquiv[].  Th
9c40: 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69 73 20  e first slot is 
9c50: 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20 6e  for the cursor n
9c60: 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65  umber.** and the
9c70: 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72 20 74   second is for t
9c80: 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
9c90: 2e 20 20 54 68 65 72 65 20 61 72 65 20 32 32 20  .  There are 22 
9ca0: 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76 5b  slots in aEquiv[
9cb0: 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d 65 61  ].** so that mea
9cc0: 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 66  ns we can look f
9cd0: 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f 20  or X plus up to 
9ce0: 31 30 20 6f 74 68 65 72 20 65 71 75 69 76 61 6c  10 other equival
9cf0: 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a 20 48  ent values..** H
9d00: 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66 6f  ence a search fo
9d10: 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  r X will return 
9d20: 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 20 61  <expr> if X=A1 a
9d30: 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32 3d  nd A1=A2 and A2=
9d40: 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20 61 6e  A3.** and ... an
9d50: 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31 30  d A9=A10 and A10
9d60: 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49  =<expr>..**.** I
9d70: 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c 74  f there are mult
9d80: 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74 68  iple terms in th
9d90: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
9da0: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
9db0: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74 68  p> <expr>".** th
9dc0: 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20 6f  en try for the o
9dd0: 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65 6e  ne with no depen
9de0: 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70 72  dencies on <expr
9df0: 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  > - in other wor
9e00: 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78 70  ds where.** <exp
9e10: 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  r> is a constant
9e20: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 73   expression of s
9e30: 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20  ome kind.  Only 
9e40: 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20 6f  return entries o
9e50: 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58  f.** the form "X
9e60: 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 59   <op> Y" where Y
9e70: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
9e80: 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 66  another table if
9e90: 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a 20   no terms of.** 
9ea0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
9eb0: 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20 65   <const-expr>" e
9ec0: 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74 65  xist.   If no te
9ed0: 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73 74  rms with a const
9ee0: 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73 74  ant RHS.** exist
9ef0: 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e 20  , try to return 
9f00: 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65 73  a term that does
9f10: 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55 49   not use WO_EQUI
9f20: 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  V..*/.static Whe
9f30: 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d  reTerm *findTerm
9f40: 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
9f50: 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pWC,     /* The
9f60: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
9f70: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
9f80: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
9f90: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
9fa0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  r number of LHS 
9fb0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
9fc0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
9fd0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c  lumn number of L
9fe0: 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  HS */.  Bitmask 
9ff0: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a  notReady,     /*
a000: 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76   RHS must not ov
a010: 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73 20  erlap with this 
a020: 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70  mask */.  u32 op
a030: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a040: 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78  /* Mask of WO_xx
a050: 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62 69   values describi
a060: 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ng operator */. 
a070: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
a080: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
a090: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
a0a0: 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66  h this index, if
a0b0: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a   not NULL */.){.
a0c0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 65    WhereTerm *pRe
a0d0: 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57 68 65 72  sult = 0;.  Wher
a0e0: 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72  eTerm *p;.  Wher
a0f0: 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70  eScan scan;..  p
a100: 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74   = whereScanInit
a110: 28 26 73 63 61 6e 2c 20 70 57 43 2c 20 69 43 75  (&scan, pWC, iCu
a120: 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20  r, iColumn, op, 
a130: 70 49 64 78 29 3b 0a 20 20 77 68 69 6c 65 28 20  pIdx);.  while( 
a140: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  p ){.    if( (p-
a150: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
a160: 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20  otReady)==0 ){. 
a170: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72       if( p->prer
a180: 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70  eqRight==0 && (p
a190: 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45  ->eOperator&WO_E
a1a0: 51 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Q)!=0 ){.       
a1b0: 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 20   return p;.     
a1c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52 65   }.      if( pRe
a1d0: 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73 75 6c  sult==0 ) pResul
a1e0: 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20  t = p;.    }.   
a1f0: 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65   p = whereScanNe
a200: 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d 0a 20  xt(&scan);.  }. 
a210: 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c 74 3b   return pResult;
a220: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
a230: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
a240: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
a250: 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 57 68  yze(SrcList*, Wh
a260: 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29  ereClause*, int)
a270: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78  ;../*.** Call ex
a280: 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c  prAnalyze on all
a290: 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52   terms in a WHER
a2a0: 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2f 0a 73  E clause.  .*/.s
a2b0: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
a2c0: 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63  nalyzeAll(.  Src
a2d0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
a2e0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
a2f0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
a300: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 20  ereClause *pWC  
a310: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48         /* the WH
a320: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
a330: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
a340: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
a350: 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69  =pWC->nTerm-1; i
a360: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65  >=0; i--){.    e
a370: 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c  xprAnalyze(pTabL
a380: 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20  ist, pWC, i);.  
a390: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
a3a0: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
a3b0: 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  TIMIZATION./*.**
a3c0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
a3d0: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
a3e0: 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20  ssion is a LIKE 
a3f0: 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  or GLOB operator
a400: 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20   that.** can be 
a410: 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20  optimized using 
a420: 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
a430: 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  raints.  Return 
a440: 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a  TRUE if it is.**
a450: 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66   so and false if
a460: 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f   not..**.** In o
a470: 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65  rder for the ope
a480: 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69  rator to be opti
a490: 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53  mizible, the RHS
a4a0: 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69 6e   must be a strin
a4b0: 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61  g.** literal tha
a4c0: 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
a4d0: 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72 64   with a wildcard
a4e0: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
a4f0: 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a  t isLikeOrGlob(.
a500: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a510: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
a520: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
a530: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
a540: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
a550: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
a560: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45  xpression */.  E
a570: 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c 20  xpr **ppPrefix, 
a580: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 54   /* Pointer to T
a590: 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73 73  K_STRING express
a5a0: 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72 6e  ion with pattern
a5b0: 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74   prefix */.  int
a5c0: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f   *pisComplete, /
a5d0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e  * True if the on
a5e0: 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20 25  ly wildcard is %
a5f0: 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61   in the last cha
a600: 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  racter */.  int 
a610: 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a  *pnoCase      /*
a620: 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63 61   True if upperca
a630: 73 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  se is equivalent
a640: 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f   to lowercase */
a650: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
a660: 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *z = 0;        
a670: 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52 48   /* String on RH
a680: 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74  S of LIKE operat
a690: 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  or */.  Expr *pR
a6a0: 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20  ight, *pLeft;   
a6b0: 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64 20     /* Right and 
a6c0: 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b  left size of LIK
a6d0: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
a6e0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
a6f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
a700: 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20 74  st of operands t
a710: 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  o the LIKE opera
a720: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20  tor */.  int c; 
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61      /* One chara
a750: 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20  cter in z[] */. 
a760: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
a770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a780: 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c  umber of non-wil
a790: 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68 61  dcard prefix cha
a7a0: 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68 61  racters */.  cha
a7b0: 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20 20  r wc[3];        
a7c0: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63          /* Wildc
a7d0: 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20 2a  ard characters *
a7e0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
a7f0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
a800: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
a810: 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ction */.  sqlit
a820: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
a830: 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   0;.  int op;   
a840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a850: 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70 52   /* Opcode of pR
a860: 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21  ight */..  if( !
a870: 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e  sqlite3IsLikeFun
a880: 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c  ction(db, pExpr,
a890: 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b   pnoCase, wc) ){
a8a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a8b0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
a8c0: 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70  _EBCDIC.  if( *p
a8d0: 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e 20  noCase ) return 
a8e0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73  0;.#endif.  pLis
a8f0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
a900: 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c  st;.  pLeft = pL
a910: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
a920: 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  .  if( pLeft->op
a930: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20  !=TK_COLUMN .   
a940: 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  || sqlite3ExprAf
a950: 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d 53  finity(pLeft)!=S
a960: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 0a  QLITE_AFF_TEXT .
a970: 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28     || IsVirtual(
a980: 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20 20 29  pLeft->pTab).  )
a990: 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  {.    /* IMP: R-
a9a0: 30 32 30 36 35 2d 34 39 34 36 35 20 54 68 65 20  02065-49465 The 
a9b0: 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  left-hand side o
a9c0: 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c  f the LIKE or GL
a9d0: 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  OB operator must
a9e0: 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 6e  .    ** be the n
a9f0: 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 65  ame of an indexe
aa00: 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45  d column with TE
aa10: 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  XT affinity. */.
aa20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
aa30: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  }.  assert( pLef
aa40: 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29  t->iColumn!=(-1)
aa50: 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 49   ); /* Because I
aa60: 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46 46  PK never has AFF
aa70: 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67  _TEXT */..  pRig
aa80: 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  ht = pList->a[0]
aa90: 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20 70  .pExpr;.  op = p
aaa0: 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28  Right->op;.  if(
aab0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
aac0: 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52 69   ){.    op = pRi
aad0: 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20  ght->op2;.  }.  
aae0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  if( op==TK_VARIA
aaf0: 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20  BLE ){.    Vdbe 
ab00: 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20 70 50  *pReprepare = pP
ab10: 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
ab20: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
ab30: 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
ab40: 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c  ;.    pVal = sql
ab50: 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
ab60: 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72 65  Value(pReprepare
ab70: 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41  , iCol, SQLITE_A
ab80: 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66  FF_NONE);.    if
ab90: 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65  ( pVal && sqlite
aba0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61  3_value_type(pVa
abb0: 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  l)==SQLITE_TEXT 
abc0: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68  ){.      z = (ch
abd0: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
abe0: 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20  ue_text(pVal);. 
abf0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ac00: 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70  VdbeSetVarmask(p
ac10: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 43  Parse->pVdbe, iC
ac20: 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ol);.    assert(
ac30: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
ac40: 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69 67  VARIABLE || pRig
ac50: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  ht->op==TK_REGIS
ac60: 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  TER );.  }else i
ac70: 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  f( op==TK_STRING
ac80: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69 67   ){.    z = pRig
ac90: 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ht->u.zToken;.  
aca0: 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20  }.  if( z ){.   
acb0: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68   cnt = 0;.    wh
acc0: 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21  ile( (c=z[cnt])!
acd0: 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26  =0 && c!=wc[0] &
ace0: 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21  & c!=wc[1] && c!
acf0: 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20  =wc[2] ){.      
ad00: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  cnt++;.    }.   
ad10: 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26 20 32   if( cnt!=0 && 2
ad20: 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d  55!=(u8)z[cnt-1]
ad30: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
ad40: 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 2a  pPrefix;.      *
ad50: 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d  pisComplete = c=
ad60: 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b  =wc[0] && z[cnt+
ad70: 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50 72  1]==0;.      pPr
ad80: 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45 78  efix = sqlite3Ex
ad90: 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47  pr(db, TK_STRING
ada0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , z);.      if( 
adb0: 70 50 72 65 66 69 78 20 29 20 70 50 72 65 66 69  pPrefix ) pPrefi
adc0: 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d  x->u.zToken[cnt]
add0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 70 50   = 0;.      *ppP
ade0: 72 65 66 69 78 20 3d 20 70 50 72 65 66 69 78 3b  refix = pPrefix;
adf0: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  .      if( op==T
ae00: 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20  K_VARIABLE ){.  
ae10: 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20        Vdbe *v = 
ae20: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
ae30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ae40: 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c 20  beSetVarmask(v, 
ae50: 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29  pRight->iColumn)
ae60: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70  ;.        if( *p
ae70: 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70 52  isComplete && pR
ae80: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  ight->u.zToken[1
ae90: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ] ){.          /
aea0: 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f 66 20  * If the rhs of 
aeb0: 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73 73  the LIKE express
aec0: 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62 6c  ion is a variabl
aed0: 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  e, and the curre
aee0: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
aef0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61 72  value of the var
af00: 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65 72  iable means ther
af10: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
af20: 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a  invoke the LIKE.
af30: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e            ** fun
af40: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f  ction, then no O
af50: 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c 20  P_Variable will 
af60: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
af70: 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20 20  program..       
af80: 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73 65     ** This cause
af90: 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74  s problems for t
afa0: 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
afb0: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29  parameter_name()
afc0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 50  .          ** AP
afd0: 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64  I. To workaround
afe0: 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75 6d   them, add a dum
aff0: 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 68  my OP_Variable h
b000: 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ere..          *
b010: 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  / .          int
b020: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
b030: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
b040: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b050: 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
b060: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
b070: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
b080: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
b090: 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56 64  eP3(v, sqlite3Vd
b0a0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
b0b0: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  -1, 0);.        
b0c0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
b0d0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
b0e0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r1);.        }. 
b0f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
b100: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20  {.      z = 0;. 
b110: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
b120: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
b130: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a 21  l);.  return (z!
b140: 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  =0);.}.#endif /*
b150: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
b160: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
b170: 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
b180: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
b190: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ABLE./*.** Check
b1a0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67   to see if the g
b1b0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
b1c0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  is of the form.*
b1d0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c  *.**         col
b1e0: 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a  umn MATCH expr.*
b1f0: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68  *.** If it is th
b200: 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20  en return TRUE. 
b210: 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   If not, return 
b220: 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  FALSE..*/.static
b230: 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f   int isMatchOfCo
b240: 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45  lumn(.  Expr *pE
b250: 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74  xpr      /* Test
b260: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
b270: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73   */.){.  ExprLis
b280: 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28  t *pList;..  if(
b290: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46   pExpr->op!=TK_F
b2a0: 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72  UNCTION ){.    r
b2b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
b2c0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
b2d0: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
b2e0: 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29 7b  n,"match")!=0 ){
b2f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
b300: 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78   }.  pList = pEx
b310: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69  pr->x.pList;.  i
b320: 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  f( pList->nExpr!
b330: 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =2 ){.    return
b340: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   0;.  }.  if( pL
b350: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d  ist->a[1].pExpr-
b360: 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  >op != TK_COLUMN
b370: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
b380: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
b390: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
b3a0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
b3b0: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
b3c0: 20 49 66 20 74 68 65 20 70 42 61 73 65 20 65 78   If the pBase ex
b3d0: 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61  pression origina
b3e0: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
b3f0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
b400: 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e  .** a join, then
b410: 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 61 70   transfer the ap
b420: 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e  propriate markin
b430: 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76  gs over to deriv
b440: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
b450: 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d  id transferJoinM
b460: 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44  arkings(Expr *pD
b470: 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42  erived, Expr *pB
b480: 61 73 65 29 7b 0a 20 20 69 66 28 20 70 44 65 72  ase){.  if( pDer
b490: 69 76 65 64 20 29 7b 0a 20 20 20 20 70 44 65 72  ived ){.    pDer
b4a0: 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70  ived->flags |= p
b4b0: 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50  Base->flags & EP
b4c0: 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70  _FromJoin;.    p
b4d0: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
b4e0: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
b4f0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
b500: 65 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  e;.  }.}..#if !d
b510: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b520: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
b530: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
b540: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b550: 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  UERY)./*.** Anal
b560: 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20  yze a term that 
b570: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20  consists of two 
b580: 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65  or more OR-conne
b590: 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73  cted.** subterms
b5a0: 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20  .  So in:.**.** 
b5b0: 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28      ... WHERE  (
b5c0: 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52  a=5) AND (b=7 OR
b5d0: 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e   c=9 OR d=13) AN
b5e0: 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20  D (d=13).**     
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b600: 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e       ^^^^^^^^^^^
b610: 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20  ^^^^^^^^^.**.** 
b620: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61  This routine ana
b630: 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68  lyzes terms such
b640: 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74   as the middle t
b650: 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65  erm in the above
b660: 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57   example..** A W
b670: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
b680: 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  t is computed an
b690: 64 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  d attached to th
b6a0: 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20  e term under.** 
b6b0: 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64  analysis, regard
b6c0: 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63  less of the outc
b6d0: 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79  ome of the analy
b6e0: 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a  sis.  Hence:.**.
b6f0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
b700: 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54  .wtFlags   |=  T
b710: 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20  ERM_ORINFO.**   
b720: 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f    WhereTerm.u.pO
b730: 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61  rInfo  =  a dyna
b740: 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
b750: 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62  d WhereOrTerm ob
b760: 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ject.**.** The t
b770: 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  erm being analyz
b780: 65 64 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f  ed must have two
b790: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63   or more of OR-c
b7a0: 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d  onnected subterm
b7b0: 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73  s..** A single s
b7c0: 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20  ubterm might be 
b7d0: 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e  a set of AND-con
b7e0: 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62 74 65  nected sub-subte
b7f0: 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  rms..** Examples
b800: 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20   of terms under 
b810: 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20  analysis:.**.** 
b820: 20 20 20 20 28 41 29 20 20 20 20 20 74 31 2e 78      (A)     t1.x
b830: 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32  =t2.y OR t1.x=t2
b840: 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52  .z OR t1.y=15 OR
b850: 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20   t1.z=t3.a+5.** 
b860: 20 20 20 20 28 42 29 20 20 20 20 20 78 3d 65 78      (B)     x=ex
b870: 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f  pr1 OR expr2=x O
b880: 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20  R x=expr3.**    
b890: 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (C)     t1.x=t2
b8a0: 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a  .y OR (t1.x=t2.z
b8b0: 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a   AND t1.y=15).**
b8c0: 20 20 20 20 20 28 44 29 20 20 20 20 20 78 3d 65       (D)     x=e
b8d0: 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e  xpr1 OR (y>11 AN
b8e0: 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b  D y<22 AND z LIK
b8f0: 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20  E '*hello*').** 
b900: 20 20 20 20 28 45 29 20 20 20 20 20 28 70 2e 61      (E)     (p.a
b910: 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44  =1 AND q.b=2 AND
b920: 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d   r.c=3) OR (p.x=
b930: 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20  4 AND q.y=5 AND 
b940: 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53  r.z=6).**.** CAS
b950: 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  E 1:.**.** If al
b960: 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f  l subterms are o
b970: 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65  f the form T.C=e
b980: 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e  xpr for some sin
b990: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20  gle column of C 
b9a0: 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  and.** a single 
b9b0: 74 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77  table T (as show
b9c0: 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61  n in example B a
b9d0: 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74  bove) then creat
b9e0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a  e a new virtual.
b9f0: 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  ** term that is 
ba00: 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e  an equivalent IN
ba10: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e   expression.  In
ba20: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
ba30: 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69   the term.** bei
ba40: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a  ng analyzed is:.
ba50: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65  **.**      x = e
ba60: 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20  xpr1  OR  expr2 
ba70: 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70  = x  OR  x = exp
ba80: 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72  r3.**.** then cr
ba90: 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75  eate a new virtu
baa0: 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69  al term like thi
bab0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  s:.**.**      x 
bac0: 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c  IN (expr1,expr2,
bad0: 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53  expr3).**.** CAS
bae0: 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  E 2:.**.** If al
baf0: 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69  l subterms are i
bb00: 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69  ndexable by a si
bb10: 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68  ngle table T, th
bb20: 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20  en set.**.**    
bb30: 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72   WhereTerm.eOper
bb40: 61 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  ator            
bb50: 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20    =  WO_OR.**   
bb60: 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f    WhereTerm.u.pO
bb70: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
bb80: 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72    |=  the cursor
bb90: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c   number for tabl
bba0: 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74  e T.**.** A subt
bbb0: 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c  erm is "indexabl
bbc0: 65 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74  e" if it is of t
bbd0: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20  he form.** "T.C 
bbe0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
bbf0: 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75  re C is any colu
bc00: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e  mn of table T an
bc10: 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e  d .** <op> is on
bc20: 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22  e of "=", "<", "
bc30: 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20  <=", ">", ">=", 
bc40: 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49  "IS NULL", or "I
bc50: 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  N"..** A subterm
bc60: 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62   is also indexab
bc70: 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41  le if it is an A
bc80: 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ND of two or mor
bc90: 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73  e.** subsubterms
bca0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
bcb0: 20 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61   which is indexa
bcc0: 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20  ble.  Indexable 
bcd0: 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73  AND .** subterms
bce0: 20 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65   have their eOpe
bcf0: 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f  rator set to WO_
bd00: 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76  AND and they hav
bd10: 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20  e.** u.pAndInfo 
bd20: 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63  set to a dynamic
bd30: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
bd40: 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65  hereAndTerm obje
bd50: 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61  ct..**.** From a
bd60: 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20  nother point of 
bd70: 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65  view, "indexable
bd80: 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  " means that the
bd90: 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a   subterm could.*
bda0: 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65  * potentially be
bdb0: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
bdc0: 64 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70  dex if an approp
bdd0: 72 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73  riate index exis
bde0: 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c  ts..** This anal
bdf0: 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ysis does not co
be00: 6e 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f  nsider whether o
be10: 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20  r not the index 
be20: 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20  exists; that.** 
be30: 69 73 20 64 65 63 69 64 65 64 20 65 6c 73 65 77  is decided elsew
be40: 68 65 72 65 2e 20 20 54 68 69 73 20 61 6e 61 6c  here.  This anal
be50: 79 73 69 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20  ysis only looks 
be60: 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65  at whether subte
be70: 72 6d 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61  rms.** appropria
be80: 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  te for indexing 
be90: 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  exist..**.** All
bea0: 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f   examples A thro
beb0: 75 67 68 20 45 20 61 62 6f 76 65 20 73 61 74 69  ugh E above sati
bec0: 73 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74  sfy case 2.  But
bed0: 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c   if a term.** al
bee0: 73 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61  so statisfies ca
bef0: 73 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29  se 1 (such as B)
bf00: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
bf10: 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c  e optimizer will
bf20: 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65  .** always prefe
bf30: 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20  r case 1, so in 
bf40: 74 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65  that case we pre
bf50: 74 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32  tend that case 2
bf60: 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73   is not.** satis
bf70: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d  fied..**.** It m
bf80: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
bf90: 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74   that multiple t
bfa0: 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61  ables are indexa
bfb0: 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ble.  For exampl
bfc0: 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20  e,.** (E) above 
bfd0: 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20  is indexable on 
bfe0: 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64  tables P, Q, and
bff0: 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20   R..**.** Terms 
c000: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73  that satisfy cas
c010: 65 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74  e 2 are candidat
c020: 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79  es for lookup by
c030: 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61   using.** separa
c040: 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69  te indices to fi
c050: 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61  nd rowids for ea
c060: 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63  ch subterm and c
c070: 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20  omposing.** the 
c080: 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77  union of all row
c090: 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53  ids using a RowS
c0a0: 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  et object.  This
c0b0: 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74   is similar.** t
c0c0: 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65  o "bitmap indice
c0d0: 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61  s" in other data
c0e0: 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a  base engines..**
c0f0: 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a  .** OTHERWISE:.*
c100: 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20  *.** If neither 
c110: 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20  case 1 nor case 
c120: 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65  2 apply, then le
c130: 61 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f  ave the eOperato
c140: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f  r set to.** zero
c150: 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20  .  This term is 
c160: 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73  not useful for s
c170: 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  earch..*/.static
c180: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
c190: 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69  eOrTerm(.  SrcLi
c1a0: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
c1b0: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
c1c0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
c1d0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
c1e0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f         /* the co
c1f0: 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61  mplete WHERE cla
c200: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
c210: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
c220: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
c230: 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65  he OR-term to be
c240: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
c250: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
c260: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
c270: 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45  o;        /* WHE
c280: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
c290: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c2a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
c2b0: 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
c2c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
c2d0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
c2e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c2f0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
c300: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
c310: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
c320: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
c330: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
c340: 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20  idxTerm];    /* 
c350: 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
c360: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70  nalyzed */.  Exp
c370: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
c380: 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->pExpr;        
c390: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
c3a0: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65  ession of the te
c3b0: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  rm */.  int i;  
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3e0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
c3f0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
c400: 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20  e *pOrWc;       
c410: 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54  /* Breakup of pT
c420: 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  erm into subterm
c430: 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  s */.  WhereTerm
c440: 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20   *pOrTerm;      
c450: 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77   /* A Sub-term w
c460: 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20  ithin the pOrWc 
c470: 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f  */.  WhereOrInfo
c480: 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f   *pOrInfo;     /
c490: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  * Additional inf
c4a0: 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61  ormation associa
c4b0: 74 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a  ted with pTerm *
c4c0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67  /.  Bitmask chng
c4d0: 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a  ToIN;         /*
c4e0: 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   Tables that mig
c4f0: 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ht satisfy case 
c500: 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  1 */.  Bitmask i
c510: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
c520: 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
c530: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73  are indexable, s
c540: 61 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32  atisfying case 2
c550: 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42   */..  /*.  ** B
c560: 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75  reak the OR clau
c570: 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61  se into its sepa
c580: 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20  rate subterms.  
c590: 54 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65  The subterms are
c5a0: 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  .  ** stored in 
c5b0: 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  a WhereClause st
c5c0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
c5d0: 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68  ng within the Wh
c5e0: 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f  ereOrInfo.  ** o
c5f0: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74  bject that is at
c600: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72  tached to the or
c610: 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65  iginal OR clause
c620: 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73   term..  */.  as
c630: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74  sert( (pTerm->wt
c640: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59  Flags & (TERM_DY
c650: 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46  NAMIC|TERM_ORINF
c660: 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29  O|TERM_ANDINFO))
c670: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
c680: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f   pExpr->op==TK_O
c690: 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e  R );.  pTerm->u.
c6a0: 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66  pOrInfo = pOrInf
c6b0: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
c6c0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
c6d0: 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20  of(*pOrInfo));. 
c6e0: 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20   if( pOrInfo==0 
c6f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72  ) return;.  pTer
c700: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
c710: 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72  RM_ORINFO;.  pOr
c720: 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77  Wc = &pOrInfo->w
c730: 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  c;.  whereClause
c740: 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 49 6e  Init(pOrWc, pWIn
c750: 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  fo);.  whereSpli
c760: 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20  t(pOrWc, pExpr, 
c770: 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e  TK_OR);.  exprAn
c780: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
c790: 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d  OrWc);.  if( db-
c7a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
c7b0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
c7c0: 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d  ( pOrWc->nTerm>=
c7d0: 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  2 );..  /*.  ** 
c7e0: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20  Compute the set 
c7f0: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d  of tables that m
c800: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
c810: 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a  es 1 or 2..  */.
c820: 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28    indexable = ~(
c830: 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e  Bitmask)0;.  chn
c840: 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73  gToIN = ~(Bitmas
c850: 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72  k)0;.  for(i=pOr
c860: 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72  Wc->nTerm-1, pOr
c870: 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69  Term=pOrWc->a; i
c880: 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65  >=0 && indexable
c890: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
c8a0: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54  ){.    if( (pOrT
c8b0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
c8c0: 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29   WO_SINGLE)==0 )
c8d0: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e 64  {.      WhereAnd
c8e0: 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a  Info *pAndInfo;.
c8f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
c900: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
c910: 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c  & (TERM_ANDINFO|
c920: 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30  TERM_ORINFO))==0
c930: 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f   );.      chngTo
c940: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41  IN = 0;.      pA
c950: 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  ndInfo = sqlite3
c960: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
c970: 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f  sizeof(*pAndInfo
c980: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  ));.      if( pA
c990: 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  ndInfo ){.      
c9a0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
c9b0: 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57  AndWC;.        W
c9c0: 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65  hereTerm *pAndTe
c9d0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rm;.        int 
c9e0: 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  j;.        Bitma
c9f0: 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk b = 0;.      
ca00: 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e    pOrTerm->u.pAn
ca10: 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f  dInfo = pAndInfo
ca20: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
ca30: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
ca40: 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20  RM_ANDINFO;.    
ca50: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70      pOrTerm->eOp
ca60: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b  erator = WO_AND;
ca70: 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20  .        pAndWC 
ca80: 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  = &pAndInfo->wc;
ca90: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c  .        whereCl
caa0: 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c  auseInit(pAndWC,
cab0: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20   pWC->pWInfo);. 
cac0: 20 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69         whereSpli
cad0: 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72  t(pAndWC, pOrTer
cae0: 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44  m->pExpr, TK_AND
caf0: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41  );.        exprA
cb00: 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20  nalyzeAll(pSrc, 
cb10: 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20  pAndWC);.       
cb20: 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20   pAndWC->pOuter 
cb30: 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74  = pWC;.        t
cb40: 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c  estcase( db->mal
cb50: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
cb60: 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61       if( !db->ma
cb70: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
cb80: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
cb90: 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43   pAndTerm=pAndWC
cba0: 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e  ->a; j<pAndWC->n
cbb0: 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54  Term; j++, pAndT
cbc0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
cbd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64      assert( pAnd
cbe0: 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
cbf0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
cc00: 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72  llowedOp(pAndTer
cc10: 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b  m->pExpr->op) ){
cc20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
cc30: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49   |= getMask(&pWI
cc40: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
cc50: 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  AndTerm->leftCur
cc60: 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sor);.          
cc70: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
cc80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cc90: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
cca0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
ccb0: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
ccc0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
ccd0: 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20 20  COPIED ){.      
cce0: 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65 72  /* Skip this ter
ccf0: 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72  m for now.  We r
cd00: 65 76 69 73 69 74 20 69 74 20 77 68 65 6e 20 77  evisit it when w
cd10: 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20 20  e process the.  
cd20: 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e      ** correspon
cd30: 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55 41  ding TERM_VIRTUA
cd40: 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65  L term */.    }e
cd50: 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
cd60: 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20  sk b;.      b = 
cd70: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
cd80: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  >sMaskSet, pOrTe
cd90: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  rm->leftCursor);
cda0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
cdb0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
cdc0: 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20  RM_VIRTUAL ){.  
cdd0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
cde0: 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63  *pOther = &pOrWc
cdf0: 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61  ->a[pOrTerm->iPa
ce00: 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62  rent];.        b
ce10: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49   |= getMask(&pWI
ce20: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
ce30: 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f  Other->leftCurso
ce40: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
ce50: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
ce60: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 72  ;.      if( (pOr
ce70: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
ce80: 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20  & WO_EQ)==0 ){. 
ce90: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
cea0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
ceb0: 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f  {.        chngTo
cec0: 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d  IN &= b;.      }
ced0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
cee0: 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  .  ** Record the
cef0: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
cf00: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
cf10: 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67   2.  The set mig
cf20: 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79  ht be.  ** empty
cf30: 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f  ..  */.  pOrInfo
cf40: 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e  ->indexable = in
cf50: 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d  dexable;.  pTerm
cf60: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e  ->eOperator = in
cf70: 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a  dexable==0 ? 0 :
cf80: 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20   WO_OR;..  /*.  
cf90: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64  ** chngToIN hold
cfa0: 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65  s a set of table
cfb0: 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73  s that *might* s
cfc0: 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20  atisfy case 1.  
cfd0: 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65  But.  ** we have
cfe0: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69   to do some addi
cff0: 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20  tional checking 
d000: 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31  to see if case 1
d010: 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20   really.  ** is 
d020: 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a  satisfied..  **.
d030: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69    ** chngToIN wi
d040: 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30  ll hold either 0
d050: 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20  , 1, or 2 bits. 
d060: 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 20   The 0-bit case 
d070: 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
d080: 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73  there is no poss
d090: 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73  ibility of trans
d0a0: 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63  forming the OR c
d0b0: 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20  lause into an.  
d0c0: 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62  ** IN operator b
d0d0: 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f  ecause one or mo
d0e0: 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
d0f0: 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  OR clause contai
d100: 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67  n.  ** something
d110: 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f   other than == o
d120: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  n a column in th
d130: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
d140: 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20   The 1-bit.  ** 
d150: 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20  case means that 
d160: 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
d170: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f  e OR clause is o
d180: 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20  f the form.  ** 
d190: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78  "table.column=ex
d1a0: 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e  pr" for some sin
d1b0: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
d1c0: 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 20  one bit that is 
d1d0: 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f  set.  ** will co
d1e0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
d1f0: 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57  common table.  W
d200: 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
d210: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20  check to make.  
d220: 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d 65  ** sure the same
d230: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
d240: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54  on all terms.  T
d250: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 73  he 2-bit case is
d260: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61   when.  ** the a
d270: 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20  ll terms are of 
d280: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31  the form "table1
d290: 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63  .column=table2.c
d2a0: 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a  olumn".  It.  **
d2b0: 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62   might be possib
d2c0: 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e  le to form an IN
d2d0: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 65   operator with e
d2e0: 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c  ither table1.col
d2f0: 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c  umn.  ** or tabl
d300: 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  e2.column as the
d310: 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 69   LHS if either i
d320: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72  s common to ever
d330: 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74  y term of.  ** t
d340: 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20  he OR clause..  
d350: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
d360: 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  t terms of the f
d370: 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d  orm "table.colum
d380: 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32  n1=table.column2
d390: 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  " (the.  ** same
d3a0: 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73   table on both s
d3b0: 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20  izes of the ==) 
d3c0: 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
d3d0: 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
d3e0: 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20  chngToIN ){.    
d3f0: 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  int okToChngToIN
d400: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
d410: 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73  e if the convers
d420: 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c  ion to IN is val
d430: 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  id */.    int iC
d440: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20  olumn = -1;     
d450: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e      /* Column in
d460: 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e  dex on lhs of IN
d470: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
d480: 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d   int iCursor = -
d490: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  1;         /* Ta
d4a0: 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f  ble cursor commo
d4b0: 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a  n to all terms *
d4c0: 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b  /.    int j = 0;
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
d4f0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  */..    /* Searc
d500: 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e  h for a table an
d510: 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70  d column that ap
d520: 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64  pears on one sid
d530: 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  e or the.    ** 
d540: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20  other of the == 
d550: 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72  operator in ever
d560: 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74  y subterm.  That
d570: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
d580: 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65  n.    ** will be
d590: 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75   recorded in iCu
d5a0: 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e  rsor and iColumn
d5b0: 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e  .  There might n
d5c0: 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a  ot be any.    **
d5d0: 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20   such table and 
d5e0: 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54  column.  Set okT
d5f0: 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20  oChngToIN if an 
d600: 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c  appropriate tabl
d610: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c  e.    ** and col
d620: 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74  umn is found but
d630: 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54   leave okToChngT
d640: 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  oIN false if not
d650: 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20   found..    */. 
d660: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20     for(j=0; j<2 
d670: 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  && !okToChngToIN
d680: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f  ; j++){.      pO
d690: 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61  rTerm = pOrWc->a
d6a0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f  ;.      for(i=pO
d6b0: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e  rWc->nTerm-1; i>
d6c0: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
d6d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
d6e0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
d6f0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
d700: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  );.        pOrTe
d710: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e  rm->wtFlags &= ~
d720: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
d730: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
d740: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
d750: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
d760: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
d770: 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20   2-bit case and 
d780: 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65  we are on the se
d790: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61  cond iteration a
d7a0: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
d7b0: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20  current term is 
d7c0: 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69  from the first i
d7d0: 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b  teration.  So sk
d7e0: 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f  ip this term. */
d7f0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
d800: 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20  t( j==1 );.     
d810: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
d820: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d830: 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26   if( (chngToIN &
d840: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
d850: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  ->sMaskSet, pOrT
d860: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
d870: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
d880: 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d    /* This term m
d890: 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f  ust be of the fo
d8a0: 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68  rm t1.a==t2.b wh
d8b0: 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65  ere t2 is in the
d8c0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68  .          ** ch
d8d0: 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74  ngToIN set but t
d8e0: 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20  1 is not.  This 
d8f0: 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74  term will be eit
d900: 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20  her preceeded.  
d910: 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f          ** or fo
d920: 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65  llwed by an inve
d930: 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d  rted copy (t2.b=
d940: 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68  =t1.a).  Skip th
d950: 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20  is term .       
d960: 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74     ** and use it
d970: 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a  s inversion. */.
d980: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
d990: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
d9a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
d9b0: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ED );.          
d9c0: 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72  testcase( pOrTer
d9d0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
d9e0: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
d9f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
da00: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
da10: 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54  & (TERM_COPIED|T
da20: 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a  ERM_VIRTUAL) );.
da30: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
da40: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
da50: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
da60: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
da70: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69  olumn;.        i
da80: 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d  Cursor = pOrTerm
da90: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20  ->leftCursor;.  
daa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dab0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
dac0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
dad0: 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61   No candidate ta
dae0: 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66  ble+column was f
daf0: 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20  ound.  This can 
db00: 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20  only occur.     
db10: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63     ** on the sec
db20: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ond iteration */
db30: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
db40: 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20   j==1 );.       
db50: 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72   assert( IsPower
db60: 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20  OfTwo(chngToIN) 
db70: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
db80: 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74  t( chngToIN==get
db90: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
dba0: 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29  askSet, iCursor)
dbb0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
dbc0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
dbd0: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20   testcase( j==1 
dbe0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  );..      /* We 
dbf0: 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e  have found a can
dc00: 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64  didate table and
dc10: 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20   column.  Check 
dc20: 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20  to see if that. 
dc30: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e       ** table an
dc40: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d  d column is comm
dc50: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
dc60: 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73   in the OR claus
dc70: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43  e */.      okToC
dc80: 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  hngToIN = 1;.   
dc90: 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26     for(; i>=0 &&
dca0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69   okToChngToIN; i
dcb0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
dcc0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
dcd0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
dce0: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
dcf0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
dd00: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
dd10: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
dd20: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
dd30: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
dd40: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
dd50: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
dd60: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43  u.leftColumn!=iC
dd70: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
dd80: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
dd90: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
dda0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
ddb0: 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69  t affLeft, affRi
ddc0: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  ght;.          /
ddd0: 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68  * If the right-h
dde0: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f  and side is also
ddf0: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
de00: 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20  the affinities. 
de10: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62           ** of b
de20: 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65  oth right and le
de30: 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65  ft sides must be
de40: 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79   such that no ty
de50: 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  pe.          ** 
de60: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20  conversions are 
de70: 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  required on the 
de80: 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20  right.  (Ticket 
de90: 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20  #2249).         
dea0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66   */.          af
deb0: 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  fRight = sqlite3
dec0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
ded0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
dee0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
def0: 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  affLeft = sqlite
df00: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
df10: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
df20: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
df30: 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20  if( affRight!=0 
df40: 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66  && affRight!=aff
df50: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
df60: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
df70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
df80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
df90: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
dfa0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f  ags |= TERM_OR_O
dfb0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
dfc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
dfd0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
dfe0: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b  t this point, ok
dff0: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72  ToChngToIN is tr
e000: 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70  ue if original p
e010: 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20  Term satisfies. 
e020: 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49     ** case 1.  I
e030: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e  n that case, con
e040: 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72  struct a new vir
e050: 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69  tual term that i
e060: 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20  s .    ** pTerm 
e070: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
e080: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n IN operator.. 
e090: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b     */.    if( ok
e0a0: 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ToChngToIN ){.  
e0b0: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20      Expr *pDup; 
e0c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
e0d0: 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63  transient duplic
e0e0: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  ate expression *
e0f0: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
e100: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f   *pList = 0;   /
e110: 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65  * The RHS of the
e120: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
e130: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
e140: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
e150: 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
e160: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
e170: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20      Expr *pNew; 
e180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e190: 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70  e complete IN op
e1a0: 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20  erator */..     
e1b0: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
e1c0: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
e1d0: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  OrWc->a; i>=0; i
e1e0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
e1f0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
e200: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
e210: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29  TERM_OR_OK)==0 )
e220: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
e230: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
e240: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
e250: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
e260: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
e270: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
e280: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20  ursor );.       
e290: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
e2a0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
e2b0: 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  iColumn );.     
e2c0: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
e2d0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72  3ExprDup(db, pOr
e2e0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
e2f0: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
e300: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
e310: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
e320: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
e330: 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20  List, pDup);.   
e340: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72       pLeft = pOr
e350: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
e360: 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ft;.      }.    
e370: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
e380: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70  =0 );.      pDup
e390: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
e3a0: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
e3b0: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
e3c0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
e3d0: 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20  e, TK_IN, pDup, 
e3e0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
e3f0: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
e400: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
e410: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
e420: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20  nMarkings(pNew, 
e430: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
e440: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
e450: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
e460: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
e470: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
e480: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
e490: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
e4a0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
e4b0: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52  t(pWC, pNew, TER
e4c0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
e4d0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
e4e0: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
e4f0: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  w==0 );.        
e500: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
e510: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
e520: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
e530: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
e540: 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61  ;.        pWC->a
e550: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
e560: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
e570: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
e580: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 1;.      }el
e590: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
e5a0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
e5b0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
e5c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72      }.      pTer
e5d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
e5e0: 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65  O_NOOP;  /* case
e5f0: 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32   1 trumps case 2
e600: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   */.    }.  }.}.
e610: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
e620: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
e630: 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54  ZATION && !SQLIT
e640: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
e650: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  */../*.** The in
e660: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
e670: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
e680: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
e690: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
e6a0: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
e6b0: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
e6c0: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
e6d0: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
e6e0: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
e6f0: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
e700: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
e710: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
e720: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
e730: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
e740: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e750: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
e760: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
e770: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
e780: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
e790: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
e7a0: 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49  <expr>"..**.** I
e7b0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e7c0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
e7d0: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
e7e0: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72   both X and Y ar
e7f0: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  e.** columns, th
e800: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
e810: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
e820: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65  changed and a ne
e830: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
e840: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59  m of the form "Y
e850: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
e860: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
e870: 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61  lause and.** ana
e880: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
e890: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
e8a0: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
e8b0: 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a  ith TERM_COPIED.
e8c0: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74  ** and the new t
e8d0: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
e8e0: 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20  th TERM_DYNAMIC 
e8f0: 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45  (because it's pE
e900: 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  xpr.** needs to 
e910: 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68  be freed with th
e920: 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61  e WhereClause) a
e930: 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  nd TERM_VIRTUAL 
e940: 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69  (because it.** i
e950: 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70  s a commuted cop
e960: 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72  y of a prior ter
e970: 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61  m.)  The origina
e980: 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c  l term has nChil
e990: 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  d=1.** and the c
e9a0: 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e  opy has idxParen
e9b0: 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  t set to the ind
e9c0: 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ex of the origin
e9d0: 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  al term..*/.stat
e9e0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
e9f0: 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  yze(.  SrcList *
ea00: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
ea10: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
ea20: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
ea30: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
ea40: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
ea50: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
ea60: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
ea70: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
ea80: 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  f the term to be
ea90: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
eaa0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
eab0: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
eac0: 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  o; /* WHERE clau
ead0: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f  se processing co
eae0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
eaf0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
eb10: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
eb20: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alyzed */.  Wher
eb30: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
eb40: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
eb50: 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64  Set of table ind
eb60: 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78  ex masks */.  Ex
eb70: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eb90: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
eba0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
ebb0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
ebc0: 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20  reqLeft;        
ebd0: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
ebe0: 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45  esites of the pE
ebf0: 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20  xpr->pLeft */.  
ec00: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
ec10: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
ec20: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
ec30: 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20  s of pExpr */.  
ec40: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67  Bitmask extraRig
ec50: 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ht = 0;         
ec60: 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64   /* Extra depend
ec70: 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a  encies on LEFT J
ec80: 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  OIN */.  Expr *p
ec90: 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Str1 = 0;       
eca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
ecb0: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
ecc0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
ecd0: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ecf0: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
ed00: 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63   ends with wildc
ed10: 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ard */.  int noC
ed20: 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ase = 0;        
ed30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b            /* LIK
ed40: 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69  E/GLOB distingui
ed50: 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69  shes case */.  i
ed60: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed80: 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65  /* Top-level ope
ed90: 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f  rator.  pExpr->o
eda0: 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  p */.  Parse *pP
edb0: 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
edc0: 50 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69  Parse;  /* Parsi
edd0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
ede0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
edf0: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
ee00: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
ee10: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  nection */..  if
ee20: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
ee30: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
ee40: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
ee50: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
ee60: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
ee70: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
ee80: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
ee90: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  m->pExpr;.  asse
eea0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
eeb0: 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_AS && pExpr->o
eec0: 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p!=TK_COLLATE );
eed0: 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20  .  prereqLeft = 
eee0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
eef0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
ef00: 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70  pLeft);.  op = p
ef10: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
ef20: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
ef30: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
ef40: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
ef50: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
ef60: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
ef70: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
ef80: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
ef90: 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65  Right = exprSele
efa0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
efb0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
efc0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
efd0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
efe0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
eff0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
f000: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
f010: 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
f020: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
f030: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
f040: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
f050: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d  eqRight = 0;.  }
f060: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
f070: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
f080: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
f090: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
f0a0: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
f0b0: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
f0c0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
f0d0: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
f0e0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
f0f0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
f100: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d  oin) ){.    Bitm
f110: 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28  ask x = getMask(
f120: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
f130: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
f140: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c  );.    prereqAll
f150: 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61   |= x;.    extra
f160: 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a  Right = x-1;  /*
f170: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
f180: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
f190: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20   with an index. 
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74        ** on left
f1c0: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
f1d0: 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23   JOIN.  Ticket #
f1e0: 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  3015 */.  }.  pT
f1f0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
f200: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
f210: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
f220: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
f230: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
f240: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f250: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
f260: 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20  edOp(op) ){.    
f270: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
f280: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
f290: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  late(pExpr->pLef
f2a0: 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  t);.    Expr *pR
f2b0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
f2c0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
f2d0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
f2e0: 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28    u16 opMask = (
f2f0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
f300: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
f310: 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57  ==0 ? WO_ALL : W
f320: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28  O_EQUIV;.    if(
f330: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
f340: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
f350: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
f360: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
f370: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75  ;.      pTerm->u
f380: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
f390: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
f3a0: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
f3b0: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
f3c0: 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b  ask(op) & opMask
f3d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f3e0: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
f3f0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
f400: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
f410: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
f420: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
f430: 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d    u16 eExtraOp =
f440: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78   0;        /* Ex
f450: 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65  tra bits for pNe
f460: 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  w->eOperator */.
f470: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
f480: 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29  >leftCursor>=0 )
f490: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
f4a0: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44  xNew;.        pD
f4b0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
f4c0: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
f4d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
f4e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f4f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
f500: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
f510: 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
f520: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
f530: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64      }.        id
f540: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
f550: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44  seInsert(pWC, pD
f560: 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  up, TERM_VIRTUAL
f570: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
f580: 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e          if( idxN
f590: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
f5a0: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26          pNew = &
f5b0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
f5c0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50          pNew->iP
f5d0: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
f5e0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
f5f0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
f600: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
f610: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
f620: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
f630: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
f640: 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IED;.        if(
f650: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
f660: 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45  Q.         && !E
f670: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
f680: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
f690: 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  n).         && O
f6a0: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
f6b0: 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72  ed(db, SQLITE_Tr
f6c0: 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20  ansitive).      
f6d0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
f6e0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f6f0: 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20  |= WO_EQUIV;.   
f700: 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20         eExtraOp 
f710: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
f720: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f730: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e{.        pDup 
f740: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
f750: 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20   pNew = pTerm;. 
f760: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
f770: 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c  rCommute(pParse,
f780: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c   pDup);.      pL
f790: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
f7a0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75  rSkipCollate(pDu
f7b0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  p->pLeft);.     
f7c0: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
f7d0: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
f7e0: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  e;.      pNew->u
f7f0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
f800: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
f810: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
f820: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
f830: 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65  aRight) != prere
f840: 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70  qLeft );.      p
f850: 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74  New->prereqRight
f860: 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20   = prereqLeft | 
f870: 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20  extraRight;.    
f880: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c    pNew->prereqAl
f890: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
f8a0: 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72       pNew->eOper
f8b0: 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72  ator = (operator
f8c0: 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b  Mask(pDup->op) +
f8d0: 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d   eExtraOp) & opM
f8e0: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ask;.    }.  }..
f8f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f900: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
f910: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66  MIZATION.  /* If
f920: 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42   a term is the B
f930: 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c  ETWEEN operator,
f940: 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20   create two new 
f950: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20  virtual terms.  
f960: 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74  ** that define t
f970: 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68  he range that th
f980: 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d  e BETWEEN implem
f990: 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ents.  For examp
f9a0: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
f9b0: 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41     a BETWEEN b A
f9c0: 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69  ND c.  **.  ** i
f9d0: 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  s converted into
f9e0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
f9f0: 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e   (a BETWEEN b AN
fa00: 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20  D c) AND (a>=b) 
fa10: 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a  AND (a<=c).  **.
fa20: 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77    ** The two new
fa30: 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
fa40: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
fa50: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
fa60: 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68   object..  ** Th
fa70: 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  e new terms are 
fa80: 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72  "dynamic" and ar
fa90: 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68  e children of th
faa0: 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45  e original BETWE
fab0: 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54  EN.  ** term.  T
fac0: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69  hat means that i
fad0: 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65  f the BETWEEN te
fae0: 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65  rm is coded, the
faf0: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20   children are.  
fb00: 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c  ** skipped.  Or,
fb10: 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e   if the children
fb20: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62   are satisfied b
fb30: 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20  y an index, the 
fb40: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45  original.  ** BE
fb50: 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b  TWEEN term is sk
fb60: 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
fb70: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
fb80: 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20  ==TK_BETWEEN && 
fb90: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
fba0: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
fbb0: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
fbc0: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  x.pList;.    int
fbd0: 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   i;.    static c
fbe0: 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20  onst u8 ops[] = 
fbf0: 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a  {TK_GE, TK_LE};.
fc00: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
fc10: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
fc20: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
fc30: 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==2 );.    for(i
fc40: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
fc50: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
fc60: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
fc70: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65  dxNew;.      pNe
fc80: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
fc90: 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73  Expr(pParse, ops
fca0: 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  [i], .          
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcc0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
fcd0: 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  p(db, pExpr->pLe
fce0: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fd10: 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
fd20: 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30  [i].pExpr, 0), 0
fd30: 29 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 66 65  );.      transfe
fd40: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e  rJoinMarkings(pN
fd50: 65 77 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a  ewExpr, pExpr);.
fd60: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
fd70: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
fd80: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
fd90: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
fda0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
fdb0: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
fdc0: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ew==0 );.      e
fdd0: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
fde0: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
fdf0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
fe00: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
fe10: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
fe20: 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew].iParent = id
fe30: 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  xTerm;.    }.   
fe40: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
fe50: 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   2;.  }.#endif /
fe60: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  * SQLITE_OMIT_BE
fe70: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
fe80: 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  ON */..#if !defi
fe90: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
fea0: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
feb0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
fec0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
fed0: 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  Y).  /* Analyze 
fee0: 61 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 63  a term that is c
fef0: 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f  omposed of two o
ff00: 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20  r more subterms 
ff10: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a  connected by.  *
ff20: 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72  * an OR operator
ff30: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
ff40: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
ff50: 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OR ){.    assert
ff60: 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  ( pWC->op==TK_AN
ff70: 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  D );.    exprAna
ff80: 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c  lyzeOrTerm(pSrc,
ff90: 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a   pWC, idxTerm);.
ffa0: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
ffb0: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
ffc0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ffd0: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
ffe0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
fff0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10000 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
10010 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74  N.  /* Add const
10020 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65  raints to reduce
10030 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
10040 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47  e on a LIKE or G
10050 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  LOB.  ** operato
10060 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c  r..  **.  ** A l
10070 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74  ike pattern of t
10080 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20  he form "x LIKE 
10090 27 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67  'abc%'" is chang
100a0 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69  ed into constrai
100b0 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  nts.  **.  **   
100c0 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20         x>='abc' 
100d0 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20  AND x<'abd' AND 
100e0 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20  x LIKE 'abc%'.  
100f0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74  **.  ** The last
10100 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
10110 65 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69  e prefix "abc" i
10120 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f  s incremented to
10130 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74   form the.  ** t
10140 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69  ermination condi
10150 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f  tion "abd"..  */
10160 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d  .  if( pWC->op==
10170 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73  TK_AND .   && is
10180 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73  LikeOrGlob(pPars
10190 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31  e, pExpr, &pStr1
101a0 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26  , &isComplete, &
101b0 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20  noCase).  ){.   
101c0 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20   Expr *pLeft;   
101d0 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49      /* LHS of LI
101e0 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
101f0 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53   */.    Expr *pS
10200 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f  tr2;       /* Co
10210 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48  py of pStr1 - RH
10220 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
10230 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
10240 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a  xpr *pNewExpr1;.
10250 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
10260 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  pr2;.    int idx
10270 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64  New1;.    int id
10280 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e  xNew2;.    Token
10290 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20   sCollSeqName;  
102a0 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
102b0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
102c0 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45  ..    pLeft = pE
102d0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
102e0 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53  1].pExpr;.    pS
102f0 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tr2 = sqlite3Exp
10300 72 44 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20  rDup(db, pStr1, 
10310 30 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d  0);.    if( !db-
10320 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
10330 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43  .      u8 c, *pC
10340 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  ;       /* Last 
10350 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65  character before
10360 20 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63   the first wildc
10370 61 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20  ard */.      pC 
10380 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75  = (u8*)&pStr2->u
10390 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53  .zToken[sqlite3S
103a0 74 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75  trlen30(pStr2->u
103b0 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20  .zToken)-1];.   
103c0 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20     c = *pC;.    
103d0 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a    if( noCase ){.
103e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
103f0 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65  oint is to incre
10400 6d 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68  ment the last ch
10410 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74  aracter before t
10420 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
10430 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42   ** wildcard.  B
10440 75 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65  ut if we increme
10450 6e 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c  nt '@', that wil
10460 6c 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74  l push it into t
10470 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  he.        ** al
10480 70 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77  phabetic range w
10490 68 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72  here case conver
104a0 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20  sions will mess 
104b0 75 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  up the .        
104c0 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  ** inequality.  
104d0 54 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d  To avoid this, m
104e0 61 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f  ake sure to also
104f0 20 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20   run the full.  
10500 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e        ** LIKE on
10510 20 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65   all candidate e
10520 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c  xpressions by cl
10530 65 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d  earing the isCom
10540 70 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20  plete flag.     
10550 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
10560 28 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43  ( c=='A'-1 ) isC
10570 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20  omplete = 0;.   
10580 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
10590 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b  UpperToLower[c];
105a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
105b0 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20  pC = c + 1;.    
105c0 7d 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61  }.    sCollSeqNa
105d0 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20  me.z = noCase ? 
105e0 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41  "NOCASE" : "BINA
105f0 52 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65  RY";.    sCollSe
10600 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20  qName.n = 6;.   
10610 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
10620 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
10630 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70  pLeft, 0);.    p
10640 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
10650 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
10660 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20  TK_GE, .        
10670 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
10680 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
10690 61 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26  arse,pNewExpr1,&
106a0 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20  sCollSeqName),. 
106b0 20 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c            pStr1,
106c0 20 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65   0);.    transfe
106d0 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e  rJoinMarkings(pN
106e0 65 77 45 78 70 72 31 2c 20 70 45 78 70 72 29 3b  ewExpr1, pExpr);
106f0 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77  .    idxNew1 = w
10700 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
10710 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c  (pWC, pNewExpr1,
10720 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
10730 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
10740 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
10750 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70  w1==0 );.    exp
10760 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
10770 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20  WC, idxNew1);.  
10780 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71    pNewExpr2 = sq
10790 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
107a0 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20   pLeft, 0);.    
107b0 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69  pNewExpr2 = sqli
107c0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
107d0 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20   TK_LT,.        
107e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
107f0 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
10800 61 72 73 65 2c 70 4e 65 77 45 78 70 72 32 2c 26  arse,pNewExpr2,&
10810 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20  sCollSeqName),. 
10820 20 20 20 20 20 20 20 20 20 20 70 53 74 72 32 2c            pStr2,
10830 20 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65   0);.    transfe
10840 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e  rJoinMarkings(pN
10850 65 77 45 78 70 72 32 2c 20 70 45 78 70 72 29 3b  ewExpr2, pExpr);
10860 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77  .    idxNew2 = w
10870 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
10880 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c  (pWC, pNewExpr2,
10890 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
108a0 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
108b0 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
108c0 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70  w2==0 );.    exp
108d0 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
108e0 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20  WC, idxNew2);.  
108f0 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
10900 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
10910 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29  if( isComplete )
10920 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  {.      pWC->a[i
10930 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20  dxNew1].iParent 
10940 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
10950 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d   pWC->a[idxNew2]
10960 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
10970 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  rm;.      pTerm-
10980 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20  >nChild = 2;.   
10990 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
109a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
109b0 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
109c0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
109d0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
109e0 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57  BLE.  /* Add a W
109f0 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72  O_MATCH auxiliar
10a00 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f  y term to the co
10a10 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20  nstraint set if 
10a20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
10a30 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
10a40 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c  f the form:  col
10a50 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a  umn MATCH expr..
10a60 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d    ** This inform
10a70 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  ation is used by
10a80 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
10a90 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20  methods of.  ** 
10aa0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20  virtual tables. 
10ab0 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72   The native quer
10ac0 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73  y optimizer does
10ad0 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a   not attempt.  *
10ae0 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67  * to do anything
10af0 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63   with MATCH func
10b00 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
10b10 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  ( isMatchOfColum
10b20 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
10b30 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
10b40 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
10b50 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54  Left;.    WhereT
10b60 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20  erm *pNewTerm;. 
10b70 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65     Bitmask prere
10b80 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45  qColumn, prereqE
10b90 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74  xpr;..    pRight
10ba0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
10bb0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
10bc0 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
10bd0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
10be0 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65  pExpr;.    prere
10bf0 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c  qExpr = exprTabl
10c00 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
10c10 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72   pRight);.    pr
10c20 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70  ereqColumn = exp
10c30 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
10c40 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20  kSet, pLeft);.  
10c50 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78 70    if( (prereqExp
10c60 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  r & prereqColumn
10c70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
10c80 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
10c90 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
10ca0 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
10cb0 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20  se, TK_MATCH, . 
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
10ce0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
10cf0 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30  b, pRight, 0), 0
10d00 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
10d10 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
10d20 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
10d30 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
10d40 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
10d50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
10d60 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
10d70 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57    pNewTerm = &pW
10d80 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
10d90 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
10da0 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72  ereqRight = prer
10db0 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  eqExpr;.      pN
10dc0 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ewTerm->leftCurs
10dd0 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
10de0 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  le;.      pNewTe
10df0 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
10e00 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
10e10 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  n;.      pNewTer
10e20 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
10e30 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70  O_MATCH;.      p
10e40 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  NewTerm->iParent
10e50 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
10e60 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
10e70 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
10e80 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
10e90 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  = 1;.      pTerm
10ea0 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
10eb0 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
10ec0 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
10ed0 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65  All = pTerm->pre
10ee0 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  reqAll;.    }.  
10ef0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10f00 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
10f10 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ABLE */..#ifdef 
10f20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
10f30 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f  AT3_OR_STAT4.  /
10f40 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74  * When sqlite_st
10f50 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61  at3 histogram da
10f60 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ta is available 
10f70 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74  an operator of t
10f80 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20  he.  ** form "x 
10f90 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e  IS NOT NULL" can
10fa0 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76   sometimes be ev
10fb0 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66  aluated more eff
10fc0 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73  iciently.  ** as
10fd0 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69   "x>NULL" if x i
10fe0 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
10ff0 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53   PRIMARY KEY.  S
11000 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20  o construct a.  
11010 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  ** virtual term 
11020 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20  of that form..  
11030 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
11040 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 65  t the virtual te
11050 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67 65  rm must be tagge
11060 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c  d with TERM_VNUL
11070 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45  L.  This.  ** TE
11080 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c  RM_VNULL tag wil
11090 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20 6e  l suppress the n
110a0 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74  ot-null check at
110b0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
110c0 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e   ** of the loop.
110d0 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54 45    Without the TE
110e0 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74  RM_VNULL flag, t
110f0 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63  he not-null chec
11100 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74  k at.  ** the st
11110 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  art of the loop 
11120 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79  will prevent any
11130 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65   results from be
11140 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  ing returned..  
11150 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
11160 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20  op==TK_NOTNULL. 
11170 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
11180 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
11190 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
111a0 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a  eft->iColumn>=0.
111b0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
111c0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
111d0 4c 49 54 45 5f 53 74 61 74 33 29 0a 20 20 29 7b  LITE_Stat3).  ){
111e0 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
111f0 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
11200 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
11210 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  eft;.    int idx
11220 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65  New;.    WhereTe
11230 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20  rm *pNewTerm;.. 
11240 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
11250 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
11260 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20  e, TK_GT,.      
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11290 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20  rDup(db, pLeft, 
112a0 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
112d0 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c  rse, TK_NULL, 0,
112e0 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20   0, 0), 0);..   
112f0 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
11300 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
11310 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20   pNewExpr,.     
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11330 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56 49           TERM_VI
11340 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
11350 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a  IC|TERM_VNULL);.
11360 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 20 29      if( idxNew )
11370 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  {.      pNewTerm
11380 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65   = &pWC->a[idxNe
11390 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  w];.      pNewTe
113a0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
113b0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  = 0;.      pNewT
113c0 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
113d0 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
113e0 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
113f0 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
11400 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
11410 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
11420 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47  eOperator = WO_G
11430 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  T;.      pNewTer
11440 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  m->iParent = idx
11450 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
11460 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
11470 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  erm];.      pTer
11480 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
11490 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
114a0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
114b0 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  ED;.      pNewTe
114c0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
114d0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
114e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
114f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
11500 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
11510 54 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76  T4 */..  /* Prev
11520 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65  ent ON clause te
11530 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  rms of a LEFT JO
11540 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73  IN from being us
11550 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a  ed to drive.  **
11560 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61   an index for ta
11570 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
11580 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
11590 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  */.  pTerm->prer
115a0 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72 61  eqRight |= extra
115b0 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Right;.}../*.** 
115c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
115d0 61 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72  arches pList for
115e0 20 61 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61   a entry that ma
115f0 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74  tches the iCol-t
11600 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69  h column.** of i
11610 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
11620 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72   If such an expr
11630 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
11640 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c   its index in pL
11650 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75  ist->a[] is retu
11660 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65  rned. If.** no e
11670 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
11680 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  nd, -1 is return
11690 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
116a0 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a  t findIndexCol(.
116b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
116c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116d0 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
116e0 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
116f0 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
11700 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
11710 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65  ssion list to se
11720 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42  arch */.  int iB
11730 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
11740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
11750 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73  sor for table as
11760 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
11770 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
11780 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
11790 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
117a0 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e   to match column
117b0 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   of */.  int iCo
117c0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
117d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
117e0 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d  mn of index to m
117f0 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
11800 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
11810 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
11820 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20  azColl[iCol];.. 
11830 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
11840 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
11850 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
11860 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
11870 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  late(pList->a[i]
11880 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
11890 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
118a0 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f  N.     && p->iCo
118b0 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
118c0 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20  lumn[iCol].     
118d0 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
118e0 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ase.    ){.     
118f0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
11900 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
11910 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
11920 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
11930 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
11940 53 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73  S(pColl) && 0==s
11950 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
11960 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  oll->zName, zCol
11970 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  l) ){.        re
11980 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a  turn i;.      }.
11990 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
119a0 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
119b0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
119c0 74 68 65 20 44 49 53 54 49 4e 43 54 20 65 78 70  the DISTINCT exp
119d0 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73  ression-list pas
119e0 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72 64  sed as the third
119f0 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
11a00 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a  redundant..**.**
11a10 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74   A DISTINCT list
11a20 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66   is redundant if
11a30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
11a40 6e 74 61 69 6e 73 20 73 6f 6d 65 20 73 75 62 73  ntains some subs
11a50 65 74 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73  et of.** columns
11a60 20 74 68 61 74 20 61 72 65 20 75 6e 69 71 75 65   that are unique
11a70 20 61 6e 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a   and non-null..*
11a80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 44  /.static int isD
11a90 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74  istinctRedundant
11aa0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11ab0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
11ac0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
11ad0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
11ae0 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20  TabList,        
11af0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
11b00 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
11b10 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
11b20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
11b30 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
11b40 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20  ist *pDistinct  
11b50 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75       /* The resu
11b60 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65 65 64  lt set that need
11b70 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54  s to be DISTINCT
11b80 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
11b90 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
11ba0 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20  Idx;.  int i;   
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42         .  int iB
11bd0 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ase;..  /* If th
11be0 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  ere is more than
11bf0 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75   one table or su
11c00 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20  b-select in the 
11c10 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20  FROM clause of. 
11c20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20   ** this query, 
11c30 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74  then it will not
11c40 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
11c50 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44 49  show that the DI
11c60 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61  STINCT .  ** cla
11c70 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74  use is redundant
11c80 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c  . */.  if( pTabL
11c90 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  ist->nSrc!=1 ) r
11ca0 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65  eturn 0;.  iBase
11cb0 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30   = pTabList->a[0
11cc0 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61  ].iCursor;.  pTa
11cd0 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
11ce0 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49  0].pTab;..  /* I
11cf0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70  f any of the exp
11d00 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49  ressions is an I
11d10 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62  PK column on tab
11d20 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72  le iBase, then r
11d30 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65  eturn .  ** true
11d40 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e  . Note: The (p->
11d50 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70  iTable==iBase) p
11d60 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73 74  art of this test
11d70 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69 66   may be false if
11d80 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
11d90 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f  t SELECT is a co
11da0 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65  rrelated sub-que
11db0 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ry..  */.  for(i
11dc0 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d  =0; i<pDistinct-
11dd0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11de0 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
11df0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
11e00 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b  te(pDistinct->a[
11e10 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
11e20 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
11e30 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65  UMN && p->iTable
11e40 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43  ==iBase && p->iC
11e50 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
11e60 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f   1;.  }..  /* Lo
11e70 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69  op through all i
11e80 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
11e90 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61  ble, checking ea
11ea0 63 68 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ch to see if it 
11eb0 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44  makes.  ** the D
11ec0 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65  ISTINCT qualifie
11ed0 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20  r redundant. It 
11ee0 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a  does so if:.  **
11ef0 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69  .  **   1. The i
11f00 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66 20 55  ndex is itself U
11f10 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a  NIQUE, and.  **.
11f20 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66    **   2. All of
11f30 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   the columns in 
11f40 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 65 69  the index are ei
11f50 74 68 65 72 20 70 61 72 74 20 6f 66 20 74 68 65  ther part of the
11f60 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20   pDistinct.  ** 
11f70 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c       list, or el
11f80 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  se the WHERE cla
11f90 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74  use contains a t
11fa0 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  erm of the form 
11fb0 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20  "col=X",.  **   
11fc0 20 20 20 77 68 65 72 65 20 58 20 69 73 20 61 20     where X is a 
11fd0 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20  constant value. 
11fe0 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
11ff0 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20  quences of the. 
12000 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69   **      compari
12010 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c  son and select-l
12020 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ist expressions 
12030 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65  must match those
12040 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
12050 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c   **.  **   3. Al
12060 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78  l of those index
12070 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69   columns for whi
12080 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ch the WHERE cla
12090 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a  use does not.  *
120a0 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61  *      contain a
120b0 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72   "col=X" term ar
120c0 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e  e subject to a N
120d0 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
120e0 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  nt..  */.  for(p
120f0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
12100 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
12110 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
12120 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
12130 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74  ==OE_None ) cont
12140 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  inue;.    for(i=
12150 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
12160 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
12170 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d  int iCol = pIdx-
12180 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
12190 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e 64 54      if( 0==findT
121a0 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c 20  erm(pWC, iBase, 
121b0 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29  iCol, ~(Bitmask)
121c0 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 20  0, WO_EQ, pIdx) 
121d0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
121e0 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64  IdxCol = findInd
121f0 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44  exCol(pParse, pD
12200 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c 20  istinct, iBase, 
12210 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 20 20  pIdx, i);.      
12220 20 20 69 66 28 20 69 49 64 78 43 6f 6c 3c 30 20    if( iIdxCol<0 
12230 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49  || pTab->aCol[pI
12240 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  dx->aiColumn[i]]
12250 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  .notNull==0 ){. 
12260 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
12270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12280 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
12290 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  i==pIdx->nColumn
122a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
122b0 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20  s index implies 
122c0 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43  that the DISTINC
122d0 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72  T qualifier is r
122e0 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20  edundant. */.   
122f0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
12300 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
12310 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 46 69   0;.}../* .** Fi
12320 6e 64 20 28 61 6e 20 61 70 70 72 6f 78 69 6d 61  nd (an approxima
12330 74 65 29 20 73 75 6d 20 6f 66 20 74 77 6f 20 57  te) sum of two W
12340 68 65 72 65 43 6f 73 74 73 2e 20 20 54 68 69 73  hereCosts.  This
12350 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 0a   computation is.
12360 2a 2a 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20  ** not a simple 
12370 22 2b 22 20 6f 70 65 72 61 74 6f 72 20 62 65 63  "+" operator bec
12380 61 75 73 65 20 57 68 65 72 65 43 6f 73 74 20 69  ause WhereCost i
12390 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6c 6f  s stored as a lo
123a0 67 61 72 69 74 68 6d 69 63 0a 2a 2a 20 76 61 6c  garithmic.** val
123b0 75 65 2e 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  ue..** .*/.stati
123c0 63 20 57 68 65 72 65 43 6f 73 74 20 77 68 65 72  c WhereCost wher
123d0 65 43 6f 73 74 41 64 64 28 57 68 65 72 65 43 6f  eCostAdd(WhereCo
123e0 73 74 20 61 2c 20 57 68 65 72 65 43 6f 73 74 20  st a, WhereCost 
123f0 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  b){.  static con
12400 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
12410 20 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 31 30   x[] = {.     10
12420 2c 20 31 30 2c 20 20 20 20 20 20 20 20 20 20 20  , 10,           
12430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12440 20 30 2c 31 20 2a 2f 0a 20 20 20 20 20 20 39 2c   0,1 */.      9,
12450 20 39 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   9,             
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12470 32 2c 33 20 2a 2f 0a 20 20 20 20 20 20 38 2c 20  2,3 */.      8, 
12480 38 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8,              
12490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34              /* 4
124a0 2c 35 20 2a 2f 0a 20 20 20 20 20 20 37 2c 20 37  ,5 */.      7, 7
124b0 2c 20 37 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 7,            
124c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 2c             /* 6,
124d0 37 2c 38 20 2a 2f 0a 20 20 20 20 20 20 36 2c 20  7,8 */.      6, 
124e0 36 2c 20 36 2c 20 20 20 20 20 20 20 20 20 20 20  6, 6,           
124f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 39              /* 9
12500 2c 31 30 2c 31 31 20 2a 2f 0a 20 20 20 20 20 20  ,10,11 */.      
12510 35 2c 20 35 2c 20 35 2c 20 20 20 20 20 20 20 20  5, 5, 5,        
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12530 2a 20 31 32 2d 31 34 20 2a 2f 0a 20 20 20 20 20  * 12-14 */.     
12540 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 20 20 20   4, 4, 4, 4,    
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12560 2f 2a 20 31 35 2d 31 38 20 2a 2f 0a 20 20 20 20  /* 15-18 */.    
12570 20 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20 33 2c    3, 3, 3, 3, 3,
12580 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
12590 20 2f 2a 20 31 39 2d 32 34 20 2a 2f 0a 20 20 20   /* 19-24 */.   
125a0 20 20 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32     2, 2, 2, 2, 2
125b0 2c 20 32 2c 20 32 2c 20 20 20 20 20 20 20 20 20  , 2, 2,         
125c0 20 20 2f 2a 20 32 35 2d 33 31 20 2a 2f 0a 20 20    /* 25-31 */.  
125d0 7d 3b 0a 20 20 69 66 28 20 61 3e 3d 62 20 29 7b  };.  if( a>=b ){
125e0 0a 20 20 20 20 69 66 28 20 61 3e 62 2b 34 39 20  .    if( a>b+49 
125f0 29 20 72 65 74 75 72 6e 20 61 3b 0a 20 20 20 20  ) return a;.    
12600 69 66 28 20 61 3e 62 2b 33 31 20 29 20 72 65 74  if( a>b+31 ) ret
12610 75 72 6e 20 61 2b 31 3b 0a 20 20 20 20 72 65 74  urn a+1;.    ret
12620 75 72 6e 20 61 2b 78 5b 61 2d 62 5d 3b 0a 20 20  urn a+x[a-b];.  
12630 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 62  }else{.    if( b
12640 3e 61 2b 34 39 20 29 20 72 65 74 75 72 6e 20 62  >a+49 ) return b
12650 3b 0a 20 20 20 20 69 66 28 20 62 3e 61 2b 33 31  ;.    if( b>a+31
12660 20 29 20 72 65 74 75 72 6e 20 62 2b 31 3b 0a 20   ) return b+1;. 
12670 20 20 20 72 65 74 75 72 6e 20 62 2b 78 5b 62 2d     return b+x[b-
12680 61 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a];.  }.}../*.**
12690 20 43 6f 6e 76 65 72 74 20 61 6e 20 69 6e 74 65   Convert an inte
126a0 67 65 72 20 69 6e 74 6f 20 61 20 57 68 65 72 65  ger into a Where
126b0 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  Cost.  In other 
126c0 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65 20 61  words, compute a
126d0 0a 2a 2a 20 67 6f 6f 64 20 61 70 70 72 6f 78 69  .** good approxi
126e0 6d 61 74 61 74 69 6f 6e 20 66 6f 72 20 31 30 2a  matation for 10*
126f0 6c 6f 67 32 28 78 29 2e 0a 2a 2f 0a 73 74 61 74  log2(x)..*/.stat
12700 69 63 20 57 68 65 72 65 43 6f 73 74 20 77 68 65  ic WhereCost whe
12710 72 65 43 6f 73 74 28 74 52 6f 77 63 6e 74 20 78  reCost(tRowcnt x
12720 29 7b 0a 20 20 73 74 61 74 69 63 20 57 68 65 72  ){.  static Wher
12730 65 43 6f 73 74 20 61 5b 5d 20 3d 20 7b 20 30 2c  eCost a[] = { 0,
12740 20 32 2c 20 33 2c 20 35 2c 20 36 2c 20 37 2c 20   2, 3, 5, 6, 7, 
12750 38 2c 20 39 20 7d 3b 0a 20 20 57 68 65 72 65 43  8, 9 };.  WhereC
12760 6f 73 74 20 79 20 3d 20 34 30 3b 0a 20 20 69 66  ost y = 40;.  if
12770 28 20 78 3c 38 20 29 7b 0a 20 20 20 20 69 66 28  ( x<8 ){.    if(
12780 20 78 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b   x<2 ) return 0;
12790 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3c 38 20  .    while( x<8 
127a0 29 7b 20 20 79 20 2d 3d 20 31 30 3b 20 78 20 3c  ){  y -= 10; x <
127b0 3c 3d 20 31 3b 20 7d 0a 20 20 7d 65 6c 73 65 7b  <= 1; }.  }else{
127c0 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3e 32 35  .    while( x>25
127d0 35 20 29 7b 20 79 20 2b 3d 20 34 30 3b 20 78 20  5 ){ y += 40; x 
127e0 3e 3e 3d 20 34 3b 20 7d 0a 20 20 20 20 77 68 69  >>= 4; }.    whi
127f0 6c 65 28 20 78 3e 31 35 20 29 7b 20 20 79 20 2b  le( x>15 ){  y +
12800 3d 20 31 30 3b 20 78 20 3e 3e 3d 20 31 3b 20 7d  = 10; x >>= 1; }
12810 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 5b  .  }.  return a[
12820 78 26 37 5d 20 2b 20 79 20 2d 20 31 30 3b 0a 7d  x&7] + y - 10;.}
12830 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12840 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12850 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  LE./*.** Convert
12860 20 61 20 64 6f 75 62 6c 65 20 28 61 73 20 72 65   a double (as re
12870 63 65 69 76 65 64 20 66 72 6f 6d 20 78 42 65 73  ceived from xBes
12880 74 49 6e 64 65 78 20 6f 66 20 61 20 76 69 72 74  tIndex of a virt
12890 75 61 6c 20 74 61 62 6c 65 29 0a 2a 2a 20 69 6e  ual table).** in
128a0 74 6f 20 61 20 57 68 65 72 65 43 6f 73 74 2e 20  to a WhereCost. 
128b0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
128c0 20 63 6f 6d 70 75 74 65 20 61 6e 20 61 70 70 72   compute an appr
128d0 6f 78 69 6d 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a  oximation for.**
128e0 20 31 30 2a 6c 6f 67 32 28 78 29 2e 0a 2a 2f 0a   10*log2(x)..*/.
128f0 73 74 61 74 69 63 20 57 68 65 72 65 43 6f 73 74  static WhereCost
12900 20 77 68 65 72 65 43 6f 73 74 46 72 6f 6d 44 6f   whereCostFromDo
12910 75 62 6c 65 28 64 6f 75 62 6c 65 20 78 29 7b 0a  uble(double x){.
12920 20 20 75 36 34 20 61 3b 0a 20 20 57 68 65 72 65    u64 a;.  Where
12930 43 6f 73 74 20 65 3b 0a 20 20 61 73 73 65 72 74  Cost e;.  assert
12940 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
12950 26 20 73 69 7a 65 6f 66 28 61 29 3d 3d 38 20 29  & sizeof(a)==8 )
12960 3b 0a 20 20 69 66 28 20 78 3c 3d 31 20 29 20 72  ;.  if( x<=1 ) r
12970 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 78  eturn 0;.  if( x
12980 3c 3d 32 30 30 30 30 30 30 30 30 30 20 29 20 72  <=2000000000 ) r
12990 65 74 75 72 6e 20 77 68 65 72 65 43 6f 73 74 28  eturn whereCost(
129a0 28 74 52 6f 77 63 6e 74 29 78 29 3b 0a 20 20 6d  (tRowcnt)x);.  m
129b0 65 6d 63 70 79 28 26 61 2c 20 26 78 2c 20 38 29  emcpy(&a, &x, 8)
129c0 3b 0a 20 20 65 20 3d 20 28 61 3e 3e 35 32 29 20  ;.  e = (a>>52) 
129d0 2d 20 31 30 32 32 3b 0a 20 20 72 65 74 75 72 6e  - 1022;.  return
129e0 20 65 2a 31 30 3b 0a 7d 0a 23 65 6e 64 69 66 20   e*10;.}.#endif 
129f0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
12a00 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
12a10 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
12a20 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20  he logarithm of 
12a30 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 20  the input value 
12a40 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74  to base 2..*/.st
12a50 61 74 69 63 20 57 68 65 72 65 43 6f 73 74 20 65  atic WhereCost e
12a60 73 74 4c 6f 67 28 57 68 65 72 65 43 6f 73 74 20  stLog(WhereCost 
12a70 4e 29 7b 0a 20 20 57 68 65 72 65 43 6f 73 74 20  N){.  WhereCost 
12a80 78 20 3d 20 77 68 65 72 65 43 6f 73 74 28 4e 29  x = whereCost(N)
12a90 3b 0a 20 20 72 65 74 75 72 6e 20 78 3e 33 33 20  ;.  return x>33 
12aa0 3f 20 78 20 2d 20 33 33 20 3a 20 30 3b 0a 7d 0a  ? x - 33 : 0;.}.
12ab0 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69  ./*.** Two routi
12ac0 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67  nes for printing
12ad0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
12ae0 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  an sqlite3_index
12af0 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  _info.** structu
12b00 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65  re.  Used for te
12b10 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
12b20 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65  ing only.  If ne
12b30 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f  ither.** SQLITE_
12b40 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44  TEST or SQLITE_D
12b50 45 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64  EBUG are defined
12b60 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75  , then these rou
12b70 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d  tines.** are no-
12b80 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ops..*/.#if !def
12b90 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
12ba0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26  _VIRTUALTABLE) &
12bb0 26 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54  & defined(WHERET
12bc0 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74  RACE_ENABLED).st
12bd0 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
12be0 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74  IDX_INPUTS(sqlit
12bf0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
12c00 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
12c10 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
12c20 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
12c30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
12c40 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
12c50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
12c60 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73  ugPrintf("  cons
12c70 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d  traint[%d]: col=
12c80 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d  %d termid=%d op=
12c90 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22  %d usabled=%d\n"
12ca0 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
12cb0 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
12cc0 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  t[i].iColumn,.  
12cd0 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
12ce0 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  int[i].iTermOffs
12cf0 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  et,.       p->aC
12d00 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c  onstraint[i].op,
12d10 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
12d20 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
12d30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
12d40 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b  ; i<p->nOrderBy;
12d50 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
12d60 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
12d70 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f   orderby[%d]: co
12d80 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c  l=%d desc=%d\n",
12d90 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
12da0 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
12db0 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
12dc0 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
12dd0 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  desc);.  }.}.sta
12de0 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
12df0 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74  DX_OUTPUTS(sqlit
12e00 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
12e10 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
12e20 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
12e30 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
12e40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
12e50 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
12e60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
12e70 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67  ugPrintf("  usag
12e80 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25  e[%d]: argvIdx=%
12e90 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20  d omit=%d\n",.  
12ea0 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
12eb0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
12ec0 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c  ge[i].argvIndex,
12ed0 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
12ee0 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f  traintUsage[i].o
12ef0 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mit);.  }.  sqli
12f00 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12f10 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20    idxNum=%d\n", 
12f20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71  p->idxNum);.  sq
12f30 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12f40 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22  ("  idxStr=%s\n"
12f50 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  , p->idxStr);.  
12f60 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
12f70 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e  tf("  orderByCon
12f80 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e  sumed=%d\n", p->
12f90 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29  orderByConsumed)
12fa0 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
12fb0 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61  Printf("  estima
12fc0 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70  tedCost=%g\n", p
12fd0 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
12fe0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
12ff0 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
13000 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
13010 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
13020 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  A).#endif..#ifnd
13030 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13040 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
13050 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
13060 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
13070 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20  ause term pTerm 
13080 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65  is of a form whe
13090 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62  re it.** could b
130a0 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
130b0 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70  ndex to access p
130c0 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e  Src, assuming an
130d0 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
130e0 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a  index existed..*
130f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72  /.static int ter
13100 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a  mCanDriveIndex(.
13110 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
13120 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
13130 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
13140 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a   term to check *
13150 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
13160 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
13170 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61     /* Table we a
13180 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63  re trying to acc
13190 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ess */.  Bitmask
131a0 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20   notReady       
131b0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
131c0 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s in outer loops
131d0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
131e0 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
131f0 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
13200 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43  Cursor!=pSrc->iC
13210 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30  ursor ) return 0
13220 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  ;.  if( (pTerm->
13230 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
13240 51 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  Q)==0 ) return 0
13250 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  ;.  if( (pTerm->
13260 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f  prereqRight & no
13270 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65 74  tReady)!=0 ) ret
13280 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65  urn 0;.  if( pTe
13290 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
132a0 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <0 ) return 0;. 
132b0 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61   aff = pSrc->pTa
132c0 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75  b->aCol[pTerm->u
132d0 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66  .leftColumn].aff
132e0 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71  inity;.  if( !sq
132f0 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
13300 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70  tyOk(pTerm->pExp
13310 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e  r, aff) ) return
13320 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
13330 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
13340 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13350 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
13360 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
13370 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
13380 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
13390 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
133a0 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
133b0 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
133c0 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
133d0 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
133e0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
133f0 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
13400 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
13410 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
13420 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
13430 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
13440 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
13450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13460 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
13470 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
13480 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
13490 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
134a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
134b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
134c0 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
134d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
134e0 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
134f0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
13500 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
13510 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
13520 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
13530 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
13540 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
13550 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
13560 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
13570 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
13580 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20  .  int nColumn; 
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
135a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
135b0 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
135c0 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
135d0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
135e0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
135f0 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
13600 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
13610 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
13620 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
13630 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
13640 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  C->a[] */.  int 
13650 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
13660 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
13670 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64  of memory needed
13680 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 49   for pIdx */.  I
13690 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
136a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
136b0 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20  ject describing 
136c0 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  the transient in
136d0 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
136e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
136f0 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
13700 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
13710 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
13720 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b  .  int addrInit;
13730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13740 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
13750 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
13760 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20  bypass jump */. 
13770 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20   Table *pTable; 
13780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13790 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
137a0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65 79  indexed */.  Key
137b0 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b 20  Info *pKeyinfo; 
137c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20           /* Key 
137d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
137e0 74 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20 0a  the index */   .
137f0 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13810 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65   Top of the inde
13820 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20  x fill loop */. 
13830 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13850 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
13860 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64   an index record
13870 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
13880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13890 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e    /* Column coun
138a0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ter */.  int i; 
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138c0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
138d0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  nter */.  int mx
138e0 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  BitCol;         
138f0 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
13900 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d   column in pSrc-
13910 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f  >colUsed */.  Co
13920 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
13930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
13940 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
13950 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a  to on a column *
13960 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
13970 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
13980 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65  /* The Loop obje
13990 63 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ct */.  Bitmask 
139a0 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  idxCols;        
139b0 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
139c0 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f   columns used fo
139d0 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
139e0 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c  Bitmask extraCol
139f0 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  s;          /* B
13a00 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f  itmap of additio
13a10 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nal columns */. 
13a20 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20   u8 sentWarning 
13a30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
13a40 54 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69  True if a warnni
13a50 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73 73 75  ng has been issu
13a60 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ed */..  /* Gene
13a70 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
13a80 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
13a90 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
13aa0 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
13ab0 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
13ac0 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
13ad0 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
13ae0 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
13af0 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
13b00 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
13b10 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
13b20 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
13b30 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
13b40 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
13b50 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
13b60 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
13b70 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64  added to the ind
13b80 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65 64  ex.  ** and used
13b90 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45 20   to match WHERE 
13ba0 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
13bb0 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d 6e 20  ts */.  nColumn 
13bc0 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20  = 0;.  pTable = 
13bd0 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57  pSrc->pTab;.  pW
13be0 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70  CEnd = &pWC->a[p
13bf0 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c  WC->nTerm];.  pL
13c00 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
13c10 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20  Loop;.  idxCols 
13c20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
13c30 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
13c40 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
13c50 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
13c60 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
13c70 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
13c80 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
13c90 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
13ca0 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
13cb0 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
13cc0 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53   iCol>=BMS ? MAS
13cd0 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41  KBIT(BMS-1) : MA
13ce0 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20  SKBIT(iCol);.   
13cf0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
13d00 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
13d10 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
13d20 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69  BMS-1 );.      i
13d30 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20  f( !sentWarning 
13d40 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13d50 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
13d60 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c  RNING_AUTOINDEX,
13d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75  .            "au
13d80 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e  tomatic index on
13d90 20 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65   %s(%s)", pTable
13da0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
13db0 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
13dc0 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a  l[iCol].zName);.
13dd0 20 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e          sentWarn
13de0 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ing = 1;.      }
13df0 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
13e00 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
13e10 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  ){.        if( w
13e20 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70  hereLoopResize(p
13e30 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70  Parse->db, pLoop
13e40 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 29 20 29 20 72  , nColumn+1) ) r
13e50 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70  eturn;.        p
13e60 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 43 6f  Loop->aLTerm[nCo
13e70 6c 75 6d 6e 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b  lumn++] = pTerm;
13e80 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73  .        idxCols
13e90 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20   |= cMask;.     
13ea0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
13eb0 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3e 30  ssert( nColumn>0
13ec0 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62   );.  pLoop->u.b
13ed0 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70  tree.nEq = pLoop
13ee0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 43 6f 6c 75  ->nLTerm = nColu
13ef0 6d 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  mn;.  pLoop->wsF
13f00 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
13f10 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49  UMN_EQ | WHERE_I
13f20 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f  DX_ONLY | WHERE_
13f30 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20 20  INDEXED.        
13f40 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57               | W
13f50 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b  HERE_AUTO_INDEX;
13f60 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
13f70 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69 74   number of addit
13f80 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
13f90 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  eded to create a
13fa0 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69  .  ** covering i
13fb0 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72 69  ndex.  A "coveri
13fc0 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e 20  ng index" is an 
13fd0 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
13fe0 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c  ins all.  ** col
13ff0 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 65  umns that are ne
14000 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65 72  eded by the quer
14010 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65 72  y.  With a cover
14020 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a 20  ing index, the. 
14030 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
14040 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  le never needs t
14050 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20 20  o be accessed.  
14060 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65  Automatic indice
14070 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61  s must.  ** be a
14080 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
14090 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64 65  because the inde
140a0 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70  x will not be up
140b0 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20 2a  dated if the.  *
140c0 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65  * original table
140d0 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68 65   changes and the
140e0 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
140f0 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20   cannot both be 
14100 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68 65  used.  ** if the
14110 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63  y go out of sync
14120 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f  ..  */.  extraCo
14130 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73  ls = pSrc->colUs
14140 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c  ed & (~idxCols |
14150 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 29   MASKBIT(BMS-1))
14160 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28  ;.  mxBitCol = (
14170 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20  pTable->nCol >= 
14180 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a  BMS-1) ? BMS-1 :
14190 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20   pTable->nCol;. 
141a0 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
141b0 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e->nCol==BMS-1 )
141c0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  ;.  testcase( pT
141d0 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  able->nCol==BMS-
141e0 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  2 );.  for(i=0; 
141f0 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
14200 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
14210 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29  ols & MASKBIT(i)
14220 20 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20   ) nColumn++;.  
14230 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
14240 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
14250 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 43  BMS-1) ){.    nC
14260 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d  olumn += pTable-
14270 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b  >nCol - BMS + 1;
14280 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  .  }.  pLoop->ws
14290 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
142a0 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
142b0 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f 2a  _IDX_ONLY;..  /*
142c0 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   Construct the I
142d0 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64  ndex object to d
142e0 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64  escribe this ind
142f0 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20  ex */.  nByte = 
14300 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20  sizeof(Index);. 
14310 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d   nByte += nColum
14320 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20  n*sizeof(int);  
14330 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f     /* Index.aiCo
14340 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20  lumn */.  nByte 
14350 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f  += nColumn*sizeo
14360 66 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49  f(char*);   /* I
14370 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20  ndex.azColl */. 
14380 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d   nByte += nColum
14390 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
143a0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72     /* Index.aSor
143b0 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78  tOrder */.  pIdx
143c0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
143d0 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
143e0 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  b, nByte);.  if(
143f0 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72   pIdx==0 ) retur
14400 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  n;.  pLoop->u.bt
14410 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
14420 78 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  x;.  pIdx->azCol
14430 6c 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64  l = (char**)&pId
14440 78 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69  x[1];.  pIdx->ai
14450 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26  Column = (int*)&
14460 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f  pIdx->azColl[nCo
14470 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn];.  pIdx->a
14480 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
14490 29 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  )&pIdx->aiColumn
144a0 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64  [nColumn];.  pId
144b0 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f  x->zName = "auto
144c0 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d  -index";.  pIdx-
144d0 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75  >nColumn = nColu
144e0 6d 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62  mn;.  pIdx->pTab
144f0 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e  le = pTable;.  n
14500 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20   = 0;.  idxCols 
14510 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
14520 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
14530 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
14540 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
14550 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
14560 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
14570 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
14580 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
14590 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
145a0 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
145b0 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53   iCol>=BMS ? MAS
145c0 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41  KBIT(BMS-1) : MA
145d0 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20  SKBIT(iCol);.   
145e0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
145f0 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
14600 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
14610 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69  ==BMS );.      i
14620 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
14630 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
14640 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
14650 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
14660 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63      idxCols |= c
14670 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49  Mask;.        pI
14680 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
14690 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
146a0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70  olumn;.        p
146b0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
146c0 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
146d0 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
146e0 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
146f0 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  );.        pIdx-
14700 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57  >azColl[n] = ALW
14710 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f  AYS(pColl) ? pCo
14720 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e  ll->zName : "BIN
14730 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b  ARY";.        n+
14740 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
14750 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
14760 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e  u32)n==pLoop->u.
14770 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20  btree.nEq );..  
14780 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61  /* Add additiona
14790 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  l columns needed
147a0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74   to make the aut
147b0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74  omatic index int
147c0 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e  o.  ** a coverin
147d0 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72  g index */.  for
147e0 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
147f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
14800 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b  extraCols & MASK
14810 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20  BIT(i) ){.      
14820 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
14830 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64  ] = i;.      pId
14840 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22  x->azColl[n] = "
14850 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e  BINARY";.      n
14860 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
14870 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  if( pSrc->colUse
14880 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  d & MASKBIT(BMS-
14890 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  1) ){.    for(i=
148a0 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d  BMS-1; i<pTable-
148b0 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
148c0 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
148d0 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
148e0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
148f0 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
14900 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
14910 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43  .  assert( n==nC
14920 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43  olumn );..  /* C
14930 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61  reate the automa
14940 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  tic index */.  p
14950 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65  Keyinfo = sqlite
14960 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
14970 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 61  arse, pIdx);.  a
14980 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69  ssert( pLevel->i
14990 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70  IdxCur>=0 );.  p
149a0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
149b0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
149c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
149d0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 41  dOp4(v, OP_OpenA
149e0 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c  utoindex, pLevel
149f0 2d 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f 6c 75  ->iIdxCur, nColu
14a00 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20 20  mn+1, 0,.       
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
14a20 61 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20 50 34  ar*)pKeyinfo, P4
14a30 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
14a40 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
14a50 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
14a60 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
14a70 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
14a80 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
14a90 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
14aa0 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
14ab0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
14ac0 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65  OP_Rewind, pLeve
14ad0 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 72  l->iTabCur);.  r
14ae0 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
14af0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
14b00 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  rse);.  sqlite3G
14b10 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
14b20 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c  pParse, pIdx, pL
14b30 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72  evel->iTabCur, r
14b40 65 67 52 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b  egRecord, 1, 0);
14b50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14b60 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
14b70 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  sert, pLevel->iI
14b80 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  dxCur, regRecord
14b90 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14ba0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
14bb0 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
14bc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14bd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
14be0 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  t, pLevel->iTabC
14bf0 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a  ur, addrTop+1);.
14c00 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
14c10 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
14c20 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
14c30 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33  NDEX);.  sqlite3
14c40 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14c50 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
14c60 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
14c70 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
14c80 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75  ord);.  .  /* Ju
14c90 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69  mp here when ski
14ca0 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
14cb0 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  lization */.  sq
14cc0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14cd0 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a  e(v, addrInit);.
14ce0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
14cf0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
14d00 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e  C_INDEX */..#ifn
14d10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14d20 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
14d30 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
14d40 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69  populate an sqli
14d50 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
14d60 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20  tructure. It is 
14d70 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
14d80 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
14d90 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
14da0 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73  ly release the s
14db0 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70  tructure.** by p
14dc0 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74  assing the point
14dd0 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
14de0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
14df0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
14e00 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
14e10 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c  3_index_info *al
14e20 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
14e30 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
14e40 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ,.  WhereClause 
14e50 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53  *pWC,.  struct S
14e60 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
14e70 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
14e80 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74  OrderBy.){.  int
14e90 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
14ea0 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
14eb0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
14ec0 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
14ed0 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
14ee0 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
14ef0 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
14f00 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
14f10 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
14f20 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
14f30 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
14f40 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
14f50 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
14f60 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
14f70 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  o;..  /* Count t
14f80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
14f90 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
14fa0 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
14fb0 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
14fc0 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
14fd0 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
14fe0 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
14ff0 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
15000 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
15010 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
15020 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
15030 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
15040 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
15050 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
15060 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
15070 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
15080 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
15090 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
150a0 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
150b0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
150c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
150d0 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
150e0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
150f0 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
15100 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
15110 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
15120 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
15130 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
15140 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a     nTerm++;.  }.
15150 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44  .  /* If the ORD
15160 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e  ER BY clause con
15170 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d  tains only colum
15180 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ns in the curren
15190 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  t .  ** virtual 
151a0 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63  table then alloc
151b0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
151c0 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20  e aOrderBy part 
151d0 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  of.  ** the sqli
151e0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
151f0 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  tructure..  */. 
15200 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
15210 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
15220 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72  .    int n = pOr
15230 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
15240 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
15250 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
15260 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
15270 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
15280 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
15290 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
152a0 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
152b0 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
152c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
152d0 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20    if( i==n){.   
152e0 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b     nOrderBy = n;
152f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
15300 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
15310 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
15320 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a   structure.  */.
15330 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c    pIdxInfo = sql
15340 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
15350 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
15360 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20  eof(*pIdxInfo). 
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15380 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a            + (siz
15390 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b  eof(*pIdxCons) +
153a0 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29   sizeof(*pUsage)
153b0 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  )*nTerm.        
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153d0 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64     + sizeof(*pId
153e0 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72  xOrderBy)*nOrder
153f0 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78  By );.  if( pIdx
15400 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Info==0 ){.    s
15410 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15420 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d  Parse, "out of m
15430 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74  emory");.    ret
15440 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
15450 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
15460 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
15470 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
15480 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  fo structure con
15490 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20  tains.  ** many 
154a0 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20  fields that are 
154b0 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22  declared "const"
154c0 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73   to prevent xBes
154d0 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a  tIndex from.  **
154e0 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20   changing them. 
154f0 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73   We have to do s
15500 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e  ome funky castin
15510 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20  g in order to.  
15520 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** initialize th
15530 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f  ose fields..  */
15540 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73  .  pIdxCons = (s
15550 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
15560 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29  dex_constraint*)
15570 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20  &pIdxInfo[1];.  
15580 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73  pIdxOrderBy = (s
15590 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
155a0 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49  dex_orderby*)&pI
155b0 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20  dxCons[nTerm];. 
155c0 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63   pUsage = (struc
155d0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
155e0 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
155f0 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e  *)&pIdxOrderBy[n
15600 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e  OrderBy];.  *(in
15610 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t*)&pIdxInfo->nC
15620 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72  onstraint = nTer
15630 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  m;.  *(int*)&pId
15640 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
15650 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  = nOrderBy;.  *(
15660 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
15670 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
15680 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
15690 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43  nstraint = pIdxC
156a0 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  ons;.  *(struct 
156b0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
156c0 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66  derby**)&pIdxInf
156d0 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49  o->aOrderBy = pI
156e0 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73  dxOrderBy;.  *(s
156f0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
15700 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
15710 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f  sage**)&pIdxInfo
15720 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
15730 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ge =.           
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15770 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a          pUsage;.
15780 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54  .  for(i=j=0, pT
15790 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
157a0 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
157b0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20  Term++){.    u8 
157c0 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  op;.    if( pTer
157d0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
157e0 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
157f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
15800 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
15810 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
15820 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
15830 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
15840 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
15850 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
15860 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
15870 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
15880 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
15890 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
158a0 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
158b0 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LL) ) continue;.
158c0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
158d0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
158e0 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
158f0 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
15900 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d  iColumn = pTerm-
15910 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
15920 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
15930 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a  TermOffset = i;.
15940 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54 65      op = (u8)pTe
15950 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
15960 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20  WO_ALL;.    if( 
15970 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d  op==WO_IN ) op =
15980 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64 78   WO_EQ;.    pIdx
15990 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b  Cons[j].op = op;
159a0 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65  .    /* The dire
159b0 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e  ct assignment in
159c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69   the previous li
159d0 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f  ne is possible o
159e0 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20  nly because.    
159f0 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53  ** the WO_ and S
15a00 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
15a10 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72  TRAINT_ codes ar
15a20 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68  e identical.  Th
15a30 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  e.    ** followi
15a40 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66  ng asserts verif
15a50 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  y this fact. */.
15a60 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45      assert( WO_E
15a70 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  Q==SQLITE_INDEX_
15a80 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b  CONSTRAINT_EQ );
15a90 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
15aa0 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LT==SQLITE_INDEX
15ab0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29  _CONSTRAINT_LT )
15ac0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
15ad0 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LE==SQLITE_INDE
15ae0 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20  X_CONSTRAINT_LE 
15af0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
15b00 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GT==SQLITE_IND
15b10 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54  EX_CONSTRAINT_GT
15b20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15b30 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GE==SQLITE_IN
15b40 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
15b50 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
15b60 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54   WO_MATCH==SQLIT
15b70 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
15b80 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20  NT_MATCH );.    
15b90 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
15ba0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
15bb0 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f  N|WO_EQ|WO_LT|WO
15bc0 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _LE|WO_GT|WO_GE|
15bd0 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20  WO_MATCH) );.   
15be0 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   j++;.  }.  for(
15bf0 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
15c00 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
15c10 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
15c20 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
15c30 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
15c40 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ].iColumn = pExp
15c50 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
15c60 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64  pIdxOrderBy[i].d
15c70 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  esc = pOrderBy->
15c80 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
15c90 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
15ca0 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dxInfo;.}../*.**
15cb0 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63   The table objec
15cc0 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73  t reference pass
15cd0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
15ce0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
15cf0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
15d00 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76  st represent a v
15d10 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68  irtual table. Th
15d20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  is function invo
15d30 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64  kes the xBestInd
15d40 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  ex().** method o
15d50 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
15d60 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c  ble with the sql
15d70 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
15d80 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63  object that.** c
15d90 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20 33  omes in as the 3
15da0 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  rd argument to t
15db0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
15dc0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
15dd0 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69  occurs, pParse i
15de0 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
15df0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
15e00 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a  e and a.** non-z
15e10 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74  ero value is ret
15e20 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
15e30 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 0 is returned 
15e40 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
15e50 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71  * part of the sq
15e60 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
15e70 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65   structure is le
15e80 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a  ft populated..**
15e90 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
15ea0 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  ot an error is r
15eb0 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74  eturned, it is t
15ec0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
15ed0 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  y of the.** call
15ee0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
15ef0 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20   free p->idxStr 
15f00 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65  if p->needToFree
15f10 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73  IdxStr indicates
15f20 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73  .** that this is
15f30 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
15f40 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73  atic int vtabBes
15f50 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  tIndex(Parse *pP
15f60 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
15f70 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  b, sqlite3_index
15f80 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c  _info *p){.  sql
15f90 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
15fa0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61   = sqlite3GetVTa
15fb0 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
15fc0 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20  pTab)->pVtab;.  
15fd0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
15fe0 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ..  TRACE_IDX_IN
15ff0 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20  PUTS(p);.  rc = 
16000 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e  pVtab->pModule->
16010 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62  xBestIndex(pVtab
16020 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44  , p);.  TRACE_ID
16030 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20  X_OUTPUTS(p);.. 
16040 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16050 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
16060 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
16070 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
16080 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
16090 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
160a0 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72  if( !pVtab->zErr
160b0 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
160c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
160d0 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  rse, "%s", sqlit
160e0 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20  e3ErrStr(rc));. 
160f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16100 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16110 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56  pParse, "%s", pV
16120 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
16130 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
16140 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
16150 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
16160 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a  ->zErrMsg = 0;..
16170 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
16180 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
16190 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61  ){.    if( !p->a
161a0 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
161b0 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73  able && p->aCons
161c0 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
161d0 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20  rgvIndex>0 ){.  
161e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
161f0 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
16200 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73         "table %s
16210 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74  : xBestIndex ret
16220 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64  urned an invalid
16230 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e   plan", pTab->zN
16240 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
16250 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
16260 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66  ->nErr;.}.#endif
16270 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
16280 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
16290 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23 69 66 64  TABLE) */...#ifd
162a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
162b0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
162c0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
162d0 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61  he location of a
162e0 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20   particular key 
162f0 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69  among all keys i
16300 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20  n an.** index.  
16310 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
16320 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f  s in aStat as fo
16330 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
16340 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73  aStat[0]      Es
16350 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  t. number of row
16360 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c  s less than pVal
16370 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  .**    aStat[1] 
16380 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
16390 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74   of rows equal t
163a0 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74  o pVal.**.** Ret
163b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
163c0 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
163d0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4b 65  tic void whereKe
163e0 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20  yStats(.  Parse 
163f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
16400 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
16410 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
16420 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16440 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
16450 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
16460 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
16470 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a   *pRec,       /*
16480 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65   Vector of value
16490 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f  s to consider */
164a0 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20  .  int roundUp, 
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
164c0 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72  * Round up if tr
164d0 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20  ue.  Round down 
164e0 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52  if false */.  tR
164f0 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20  owcnt *aStat    
16500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
16510 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20  : stats written 
16520 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
16530 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
16540 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  e = pIdx->aSampl
16550 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  e;.  int iCol;  
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16570 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71   /* Index of req
16580 75 69 72 65 64 20 73 74 61 74 73 20 69 6e 20 61  uired stats in a
16590 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20  nEq[] etc. */.  
165a0 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20  int iMin = 0;   
165b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
165c0 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e  mallest sample n
165d0 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f  ot yet tested */
165e0 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 64 78 2d  .  int i = pIdx-
165f0 3e 6e 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 2f  >nSample;      /
16600 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  * Smallest sampl
16610 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72  e larger than or
16620 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a   equal to pRec *
16630 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20  /.  int iTest;  
16640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16650 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74  /* Next sample t
16660 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20  o test */.  int 
16670 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
16680 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
16690 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
166a0 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  operation */..  
166b0 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20  assert( pRec!=0 
166c0 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
166d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
166e0 20 69 66 28 20 70 52 65 63 3d 3d 30 20 29 20 72   if( pRec==0 ) r
166f0 65 74 75 72 6e 3b 0a 20 20 69 43 6f 6c 20 3d 20  eturn;.  iCol = 
16700 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 2d 20 31  pRec->nField - 1
16710 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
16720 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
16730 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e   assert( pRec->n
16740 46 69 65 6c 64 3e 30 20 26 26 20 69 43 6f 6c 3c  Field>0 && iCol<
16750 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  pIdx->nSampleCol
16760 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 54   );.  do{.    iT
16770 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 29 2f 32  est = (iMin+i)/2
16780 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  ;.    res = sqli
16790 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
167a0 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 54 65  pare(aSample[iTe
167b0 73 74 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  st].n, aSample[i
167c0 54 65 73 74 5d 2e 70 2c 20 70 52 65 63 29 3b 0a  Test].p, pRec);.
167d0 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
167e0 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54  .      iMin = iT
167f0 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  est+1;.    }else
16800 7b 0a 20 20 20 20 20 20 69 20 3d 20 69 54 65 73  {.      i = iTes
16810 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  t;.    }.  }whil
16820 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69  e( res && iMin<i
16830 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
16840 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
16850 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
16860 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68  rt statements ch
16870 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e  eck that the bin
16880 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a  ary search code.
16890 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64    ** above found
168a0 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77 65   the right answe
168b0 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  r. This block se
168c0 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20  rves no purpose 
168d0 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20  other.  ** than 
168e0 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73  to invoke the as
168f0 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28  serts.  */.  if(
16900 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   res==0 ){.    /
16910 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73  * If (res==0) is
16920 20 74 72 75 65 2c 20 74 68 65 6e 20 73 61 6d 70   true, then samp
16930 6c 65 20 24 69 20 6d 75 73 74 20 62 65 20 65 71  le $i must be eq
16940 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20  ual to pRec */. 
16950 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64     assert( i<pId
16960 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20  x->nSample );.  
16970 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
16980 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
16990 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d  mpare(aSample[i]
169a0 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70  .n, aSample[i].p
169b0 2c 20 70 52 65 63 29 0a 20 20 20 20 20 20 20 20  , pRec).        
169c0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
169d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
169e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
169f0 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63 20  Otherwise, pRec 
16a00 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20  must be smaller 
16a10 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20 61  than sample $i a
16a20 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  nd larger than. 
16a30 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69     ** sample ($i
16a40 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  -1).  */.    ass
16a50 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  ert( i==pIdx->nS
16a60 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20  ample .         
16a70 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  || sqlite3VdbeRe
16a80 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
16a90 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
16aa0 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a  e[i].p, pRec)>0.
16ab0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
16ac0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
16ad0 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65  iled );.    asse
16ae0 72 74 28 20 69 3d 3d 30 0a 20 20 20 20 20 20 20  rt( i==0.       
16af0 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65    || sqlite3Vdbe
16b00 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
16b10 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53  ample[i-1].n, aS
16b20 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52  ample[i-1].p, pR
16b30 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  ec)<0.         |
16b40 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
16b50 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
16b60 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65  }.#endif /* ifde
16b70 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
16b80 2f 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  /..  /* At this 
16b90 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69  point, aSample[i
16ba0 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  ] is the first s
16bb0 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67 72  ample that is gr
16bc0 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20  eater than.  ** 
16bd0 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c  or equal to pVal
16be0 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49 64 78  .  Or if i==pIdx
16bf0 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20  ->nSample, then 
16c00 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72 65 20  all samples are 
16c10 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70  less.  ** than p
16c20 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c 65  Val.  If aSample
16c30 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20  [i]==pVal, then 
16c40 72 65 73 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 69  res==0..  */.  i
16c50 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
16c60 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d   aStat[0] = aSam
16c70 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  ple[i].anLt[iCol
16c80 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  ];.    aStat[1] 
16c90 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45  = aSample[i].anE
16ca0 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65  q[iCol];.  }else
16cb0 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c  {.    tRowcnt iL
16cc0 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20 69 47  ower, iUpper, iG
16cd0 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 30  ap;.    if( i==0
16ce0 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
16cf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70   = 0;.      iUpp
16d00 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e  er = aSample[0].
16d10 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
16d20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70  }else{.      iUp
16d30 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e  per = i>=pIdx->n
16d40 53 61 6d 70 6c 65 20 3f 20 70 49 64 78 2d 3e 61  Sample ? pIdx->a
16d50 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 61 53 61  iRowEst[0] : aSa
16d60 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
16d70 6c 5d 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72  l];.      iLower
16d80 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e   = aSample[i-1].
16d90 61 6e 45 71 5b 69 43 6f 6c 5d 20 2b 20 61 53 61  anEq[iCol] + aSa
16da0 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 4c 74 5b 69  mple[i-1].anLt[i
16db0 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col];.    }.    
16dc0 61 53 74 61 74 5b 31 5d 20 3d 20 28 70 49 64 78  aStat[1] = (pIdx
16dd0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 69 43 6f 6c 20 3f  ->nColumn>iCol ?
16de0 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43   pIdx->aAvgEq[iC
16df0 6f 6c 5d 20 3a 20 31 29 3b 0a 20 20 20 20 69 66  ol] : 1);.    if
16e00 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72  ( iLower>=iUpper
16e10 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
16e20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
16e30 20 20 20 20 20 69 47 61 70 20 3d 20 69 55 70 70       iGap = iUpp
16e40 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20  er - iLower;.   
16e50 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64   }.    if( round
16e60 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70  Up ){.      iGap
16e70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20   = (iGap*2)/3;. 
16e80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16e90 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20  iGap = iGap/3;. 
16ea0 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30     }.    aStat[0
16eb0 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61  ] = iLower + iGa
16ec0 70 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  p;.  }.}.#endif 
16ed0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
16ee0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
16ef0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
16f00 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
16f10 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
16f20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
16f30 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69  hat will be visi
16f40 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69  ted.** by scanni
16f50 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ng an index for 
16f60 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65  a range of value
16f70 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79  s. The range may
16f80 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a   have an upper.*
16f90 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72  * bound, a lower
16fa0 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e   bound, or both.
16fb0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
16fc0 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74  e terms that set
16fd0 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e   the upper.** an
16fe0 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61  d lower bounds a
16ff0 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62  re represented b
17000 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  y pLower and pUp
17010 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
17020 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65  . For.** example
17030 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
17040 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
17050 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  (a):.**.**   ...
17060 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
17070 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
17080 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
17090 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c           |_____|
170a0 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20     |_____|.**   
170b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170c0 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a      |         |.
170d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
170e0 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20         pLower   
170f0 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66   pUpper.**.** If
17100 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75   either of the u
17110 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f  pper or lower bo
17120 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65  und is not prese
17130 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73  nt, then NULL is
17140 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c   passed in.** pl
17150 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ace of the corre
17160 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65  sponding WhereTe
17170 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  rm..**.** The va
17180 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72  lue in (pBuilder
17190 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
171a0 6e 45 71 29 20 69 73 20 74 68 65 20 69 6e 64 65  nEq) is the inde
171b0 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a  x of the index.*
171c0 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74  * column subject
171d0 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63 6f   to the range co
171e0 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71  nstraint. Or, eq
171f0 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20  uivalently, the 
17200 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75  number of.** equ
17210 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
17220 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74  s optimized by t
17230 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65  he proposed inde
17240 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d  x scan. For exam
17250 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67  ple,.** assuming
17260 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74   index p is on t
17270 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65  1(a, b), and the
17280 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a   SQL query is:.*
17290 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
172a0 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41  t1 WHERE a = ? A
172b0 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c  ND b > ? AND b <
172c0 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
172d0 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20  n nEq is set to 
172e0 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20  1 (as the range 
172f0 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d  restricted colum
17300 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65 63  n, b, is the sec
17310 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73  ond .** left-mos
17320 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
17330 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74  index). Or, if t
17340 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  he query is:.**.
17350 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
17360 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
17370 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   a < ? ....**.**
17380 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74   then nEq is set
17390 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   to 0..**.** Whe
173a0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
173b0 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75  is called, *pnOu
173c0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
173d0 77 68 65 72 65 43 6f 73 74 28 29 20 6f 66 20 74  whereCost() of t
173e0 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
173f0 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 69 6e  rows that the in
17400 64 65 78 20 73 63 61 6e 20 69 73 20 65 78 70 65  dex scan is expe
17410 63 74 65 64 20 74 6f 20 76 69 73 69 74 20 77 69  cted to visit wi
17420 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  thout .** consid
17430 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20  ering the range 
17440 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20  constraints. If 
17450 6e 45 71 20 69 73 20 30 2c 20 74 68 69 73 20 69  nEq is 0, this i
17460 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
17470 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20  .** rows in the 
17480 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20  index. Assuming 
17490 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
174a0 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73   *pnOut is adjus
174b0 74 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a  ted (reduced).**
174c0 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
174d0 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 74 72 61  the range contra
174e0 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20  ints pLower and 
174f0 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49  pUpper..** .** I
17500 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66  n the absence of
17510 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e   sqlite_stat4 AN
17520 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69  ALYZE data, or i
17530 66 20 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e  f such data cann
17540 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 65  ot be.** used, e
17550 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75 61  ach range inequa
17560 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68 65  lity reduces the
17570 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79   search space by
17580 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20   a factor of 4. 
17590 0a 2a 2a 20 48 65 6e 63 65 20 61 20 70 61 69 72  .** Hence a pair
175a0 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   of constraints 
175b0 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65  (x>? AND x<?) re
175c0 64 75 63 65 73 20 74 68 65 20 65 78 70 65 63 74  duces the expect
175d0 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  ed number of.** 
175e0 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  rows visited by 
175f0 61 20 66 61 63 74 6f 72 20 6f 66 20 31 36 2e 0a  a factor of 16..
17600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
17610 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
17620 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
17630 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
17640 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
17650 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
17660 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
17670 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
17680 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
17690 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
176a0 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
176b0 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
176c0 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
176d0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
176e0 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
176f0 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
17700 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
17710 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
17720 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 6e 4f    WhereCost *pnO
17730 75 74 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54  ut     /* IN/OUT
17740 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  : Number of rows
17750 20 76 69 73 69 74 65 64 20 2a 2f 0a 29 7b 0a 20   visited */.){. 
17760 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17770 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20  _OK;.  int nOut 
17780 3d 20 28 69 6e 74 29 2a 70 6e 4f 75 74 3b 0a 20  = (int)*pnOut;. 
17790 20 57 68 65 72 65 43 6f 73 74 20 6e 4e 65 77 3b   WhereCost nNew;
177a0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
177b0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
177c0 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70  STAT4.  Index *p
177d0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
177e0 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
177f0 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
17800 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
17810 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69  .btree.nEq;..  i
17820 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 0a  f( p->nSample>0.
17830 20 20 20 26 26 20 6e 45 71 3d 3d 70 42 75 69 6c     && nEq==pBuil
17840 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a 20  der->nRecValid. 
17850 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d    && nEq<p->nSam
17860 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70 74  pleCol.   && Opt
17870 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
17880 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  (pParse->db, SQL
17890 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29 7b  ITE_Stat3) .  ){
178a0 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63  .    UnpackedRec
178b0 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
178c0 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20  lder->pRec;.    
178d0 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20  tRowcnt a[2];.  
178e0 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 2f    u8 aff;..    /
178f0 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65  * Variable iLowe
17900 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  r will be set to
17910 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66   the estimate of
17920 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
17930 6f 77 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74  ows in .    ** t
17940 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72  he index that ar
17950 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  e less than the 
17960 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  lower bound of t
17970 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20  he range query. 
17980 54 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65 72  The.    ** lower
17990 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65   bound being the
179a0 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f   concatenation o
179b0 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65  f $P and $L, whe
179c0 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20 20  re $P is the.   
179d0 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66   ** key-prefix f
179e0 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71  ormed by the nEq
179f0 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20   values matched 
17a00 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20  against the nEq 
17a10 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 2a 2a  left-most.    **
17a20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
17a30 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73  index, and $L is
17a40 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c   the value in pL
17a50 6f 77 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ower..    **.   
17a60 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65   ** Or, if pLowe
17a70 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20  r is NULL or $L 
17a80 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
17a90 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63  ted from it (bec
17aa0 61 75 73 65 20 69 74 0a 20 20 20 20 2a 2a 20 69  ause it.    ** i
17ab0 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76  s not a simple v
17ac0 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72  ariable or liter
17ad0 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c  al value), the l
17ae0 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
17af0 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69  e.    ** range i
17b00 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71  s $P. Due to a q
17b10 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20  uirk in the way 
17b20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20  whereKeyStats() 
17b30 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20  works, even.    
17b40 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61 69  ** if $L is avai
17b50 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53  lable, whereKeyS
17b60 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64  tats() is called
17b70 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61   for both ($P) a
17b80 6e 64 20 0a 20 20 20 20 2a 2a 20 28 24 50 3a 24  nd .    ** ($P:$
17b90 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65  L) and the large
17ba0 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74  r of the two ret
17bb0 75 72 6e 65 64 20 76 61 6c 75 65 73 20 75 73 65  urned values use
17bc0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
17bd0 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70   Similarly, iUpp
17be0 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74 20  er is to be set 
17bf0 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
17c00 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
17c10 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 6c 65 73   rows.    ** les
17c20 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72  s than the upper
17c30 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61   bound of the ra
17c40 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65  nge query. Where
17c50 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
17c60 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65  .    ** is eithe
17c70 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55  r ($P) or ($P:$U
17c80 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69  ). Again, even i
17c90 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c  f $U is availabl
17ca0 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  e, both values. 
17cb0 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20     ** of iUpper 
17cc0 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f 66  are requested of
17cd0 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
17ce0 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72   and the smaller
17cf0 20 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20   used..    */.  
17d00 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
17d10 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55  ;.    tRowcnt iU
17d20 70 70 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 6e  pper;..    if( n
17d30 45 71 3d 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Eq==p->nColumn )
17d40 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
17d50 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
17d60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17d70 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62     aff = p->pTab
17d80 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
17d90 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69 6e  lumn[nEq]].affin
17da0 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  ity;.    }.    /
17db0 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77  * Determine iLow
17dc0 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75 73  er and iUpper us
17dd0 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a  ing ($P) only. *
17de0 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30  /.    if( nEq==0
17df0 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
17e00 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70   = 0;.      iUpp
17e10 65 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74  er = p->aiRowEst
17e20 5b 30 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [0];.    }else{.
17e30 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74        /* Note: t
17e40 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62  his call could b
17e50 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79  e optimized away
17e60 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d   - since the sam
17e70 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20  e values must . 
17e80 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65       ** have bee
17e90 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65 6e  n requested when
17ea0 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20   testing key $P 
17eb0 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  in whereEqualSca
17ec0 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20  nEst().  */.    
17ed0 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
17ee0 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
17ef0 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 69 4c   0, a);.      iL
17f00 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  ower = a[0];.   
17f10 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d     iUpper = a[0]
17f20 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 7d 0a 0a   + a[1];.    }..
17f30 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62      /* If possib
17f40 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74  le, improve on t
17f50 68 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61  he iLower estima
17f60 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29  te using ($P:$L)
17f70 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f  . */.    if( pLo
17f80 77 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  wer ){.      int
17f90 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20   bOk;           
17fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
17fb0 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78 74   if value is ext
17fc0 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70  racted from pExp
17fd0 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
17fe0 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d  *pExpr = pLower-
17ff0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
18000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
18010 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
18020 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
18030 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )!=0 );.      rc
18040 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50   = sqlite3Stat4P
18050 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61  robeSetValue(pPa
18060 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70  rse, p, &pRec, p
18070 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20  Expr, aff, nEq, 
18080 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  &bOk);.      if(
18090 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
180a0 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20  & bOk ){.       
180b0 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20   tRowcnt iNew;. 
180c0 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53         whereKeyS
180d0 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
180e0 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20  pRec, 0, a);.   
180f0 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d       iNew = a[0]
18100 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70   + ((pLower->eOp
18110 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 29 20  erator & WO_GT) 
18120 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20  ? a[1] : 0);.   
18130 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c       if( iNew>iL
18140 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20  ower ) iLower = 
18150 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 6e 4f  iNew;.        nO
18160 75 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ut--;.      }.  
18170 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70    }..    /* If p
18180 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
18190 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65   on the iUpper e
181a0 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
181b0 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 69 66  P:$U). */.    if
181c0 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
181d0 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20    int bOk;      
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
181f0 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20 69   True if value i
18200 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
18210 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20   pExpr */.      
18220 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55  Expr *pExpr = pU
18230 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  pper->pExpr->pRi
18240 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
18250 74 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  t( (pUpper->eOpe
18260 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57  rator & (WO_LT|W
18270 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_LE))!=0 );.   
18280 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
18290 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
182a0 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
182b0 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
182c0 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20  nEq, &bOk);.    
182d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
182e0 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
182f0 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e        tRowcnt iN
18300 65 77 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  ew;.        wher
18310 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
18320 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29  , p, pRec, 1, a)
18330 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d  ;.        iNew =
18340 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72   a[0] + ((pUpper
18350 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
18360 5f 4c 45 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29  _LE) ? a[1] : 0)
18370 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4e  ;.        if( iN
18380 65 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70  ew<iUpper ) iUpp
18390 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20  er = iNew;.     
183a0 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20     nOut--;.     
183b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 42   }.    }..    pB
183c0 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70  uilder->pRec = p
183d0 52 65 63 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  Rec;.    if( rc=
183e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
183f0 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69      if( iUpper>i
18400 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Lower ){.       
18410 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 43 6f 73   nNew = whereCos
18420 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  t(iUpper - iLowe
18430 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
18440 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20  .        nNew = 
18450 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65 72  10;        asser
18460 74 28 20 31 30 3d 3d 77 68 65 72 65 43 6f 73 74  t( 10==whereCost
18470 28 32 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (2) );.      }. 
18480 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f       if( nNew<nO
18490 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f  ut ){.        nO
184a0 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  ut = nNew;.     
184b0 20 7d 0a 20 20 20 20 20 20 2a 70 6e 4f 75 74 20   }.      *pnOut 
184c0 3d 20 28 57 68 65 72 65 43 6f 73 74 29 6e 4f 75  = (WhereCost)nOu
184d0 74 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  t;.      WHERETR
184e0 41 43 45 28 30 78 31 30 30 2c 20 28 22 72 61 6e  ACE(0x100, ("ran
184f0 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ge scan regions:
18500 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c   %u..%u  est=%d\
18510 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
18530 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69  2)iLower, (u32)i
18540 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20  Upper, nOut));. 
18550 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18560 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
18570 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
18580 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65  PARAMETER(pParse
18590 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
185a0 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b  METER(pBuilder);
185b0 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
185c0 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70  ( pLower || pUpp
185d0 65 72 20 29 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e  er );.  /* TUNIN
185e0 47 3a 20 20 45 61 63 68 20 69 6e 65 71 75 61 6c  G:  Each inequal
185f0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 72  ity constraint r
18600 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
18610 68 20 73 70 61 63 65 20 34 2d 66 6f 6c 64 2e 0a  h space 4-fold..
18620 20 20 2a 2a 20 41 20 42 45 54 57 45 45 4e 20 6f    ** A BETWEEN o
18630 70 65 72 61 74 6f 72 2c 20 74 68 65 72 65 66 6f  perator, therefo
18640 72 65 2c 20 72 65 64 75 63 65 73 20 74 68 65 20  re, reduces the 
18650 73 65 61 72 63 68 20 73 70 61 63 65 20 31 36 2d  search space 16-
18660 66 6f 6c 64 20 2a 2f 0a 20 20 6e 4e 65 77 20 3d  fold */.  nNew =
18670 20 6e 4f 75 74 3b 0a 20 20 69 66 28 20 70 4c 6f   nOut;.  if( pLo
18680 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e  wer && (pLower->
18690 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
186a0 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
186b0 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20 20 20 20  nNew -= 20;     
186c0 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 77     assert( 20==w
186d0 68 65 72 65 43 6f 73 74 28 34 29 20 29 3b 0a 20  hereCost(4) );. 
186e0 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 7d 0a 20     nOut--;.  }. 
186f0 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20   if( pUpper ){. 
18700 20 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20     nNew -= 20;  
18710 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32 30        assert( 20
18720 3d 3d 77 68 65 72 65 43 6f 73 74 28 34 29 20 29  ==whereCost(4) )
18730 3b 0a 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20  ;.    nOut--;.  
18740 7d 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20  }.  if( nNew<10 
18750 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69  ) nNew = 10;.  i
18760 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e  f( nNew<nOut ) n
18770 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 2a 70  Out = nNew;.  *p
18780 6e 4f 75 74 20 3d 20 28 57 68 65 72 65 43 6f 73  nOut = (WhereCos
18790 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e  t)nOut;.  return
187a0 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
187b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
187c0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
187d0 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
187e0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
187f0 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
18800 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
18810 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  an equality cons
18820 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61  traint x=VALUE a
18830 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41  nd where that VA
18840 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a  LUE occurs in.**
18850 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64   the histogram d
18860 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  ata.  This only 
18870 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20  works when x is 
18880 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
18890 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
188a0 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  dex and sqlite_s
188b0 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
188c0 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
188d0 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64  .** for that ind
188e0 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d  ex.  When pExpr=
188f0 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
18900 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
18910 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c  is.** "x IS NULL
18920 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d  " instead of "x=
18930 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72  VALUE"..**.** Wr
18940 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
18950 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
18960 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
18970 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
18980 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
18990 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
189a0 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
189b0 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
189c0 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
189d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
189e0 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
189f0 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
18a00 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
18a10 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
18a20 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
18a30 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
18a40 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
18a50 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
18a60 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
18a70 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
18a80 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
18a90 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
18aa0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
18ab0 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
18ac0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
18ad0 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20  eEqualScanEst(. 
18ae0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
18af0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
18b00 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
18b10 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
18b20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
18b30 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78   *pBuilder,.  Ex
18b40 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
18b50 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
18b60 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68   for VALUE in th
18b70 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72  e x=VALUE constr
18b80 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  aint */.  tRowcn
18b90 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
18ba0 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
18bb0 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
18bc0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
18bd0 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
18be0 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
18bf0 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
18c00 45 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  Eq = pBuilder->p
18c10 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
18c20 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ;.  UnpackedReco
18c30 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c  rd *pRec = pBuil
18c40 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20  der->pRec;.  u8 
18c50 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  aff;            
18c60 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
18c70 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69   affinity */.  i
18c80 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
18c90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66           /* Subf
18ca0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63  unction return c
18cb0 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  ode */.  tRowcnt
18cc0 20 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20   a[2];          
18cd0 20 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73     /* Statistics
18ce0 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a   */.  int bOk;..
18cf0 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31    assert( nEq>=1
18d00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45   );.  assert( nE
18d10 71 3c 3d 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  q<=(p->nColumn+1
18d20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
18d30 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
18d40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61    assert( p->nSa
18d50 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  mple>0 );.  asse
18d60 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  rt( pBuilder->nR
18d70 65 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a  ecValid<nEq );..
18d80 20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20 61    /* If values a
18d90 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
18da0 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20   for all fields 
18db0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
18dc0 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66  the left.  ** of
18dd0 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73   this one, no es
18de0 74 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d 61  timate can be ma
18df0 64 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  de. Return SQLIT
18e00 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20  E_NOTFOUND. */. 
18e10 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e   if( pBuilder->n
18e20 52 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29  RecValid<(nEq-1)
18e30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18e40 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
18e50 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69    }..  /* This i
18e60 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
18e70 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c  n only. The call
18e80 20 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74 34   to sqlite3Stat4
18e90 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29 0a  ProbeSetValue().
18ea0 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64    ** below would
18eb0 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
18ec0 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66   value.  */.  if
18ed0 28 20 6e 45 71 3e 70 2d 3e 6e 43 6f 6c 75 6d 6e  ( nEq>p->nColumn
18ee0 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d   ){.    *pnRow =
18ef0 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
18f00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
18f10 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
18f20 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
18f30 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66 66 69 6e  mn[nEq-1]].affin
18f40 69 74 79 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ity;.  rc = sqli
18f50 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
18f60 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
18f70 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61   &pRec, pExpr, a
18f80 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29  ff, nEq-1, &bOk)
18f90 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  ;.  pBuilder->pR
18fa0 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28  ec = pRec;.  if(
18fb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18fc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
18fd0 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72  ( bOk==0 ) retur
18fe0 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
18ff0 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  D;.  pBuilder->n
19000 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a  RecValid = nEq;.
19010 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  .  whereKeyStats
19020 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
19030 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45  , 0, a);.  WHERE
19040 54 52 41 43 45 28 30 78 31 30 30 2c 28 22 65 71  TRACE(0x100,("eq
19050 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69  uality scan regi
19060 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74  ons: %d\n", (int
19070 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f  )a[1]));.  *pnRo
19080 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72  w = a[1];.  .  r
19090 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
190a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
190b0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
190c0 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  T4 */..#ifdef SQ
190d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
190e0 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a  3_OR_STAT4./*.**
190f0 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   Estimate the nu
19100 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
19110 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
19120 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  ed based on.** a
19130 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20  n IN constraint 
19140 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d  where the right-
19150 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
19160 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
19170 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c  is a list of val
19180 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ues.  Example:.*
19190 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52  *.**        WHER
191a0 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29  E x IN (1,2,3,4)
191b0 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
191c0 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63   estimated row c
191d0 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77  ount into *pnRow
191e0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
191f0 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e  TE_OK. .** If un
19200 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20  able to make an 
19210 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20  estimate, leave 
19220 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64  *pnRow unchanged
19230 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
19240 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  on-zero..**.** T
19250 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
19260 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e  fail if it is un
19270 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63  able to load a c
19280 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
19290 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f  e.** required fo
192a0 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69  r string compari
192b0 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c  son, or if unabl
192c0 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
192d0 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54  mory.** for a UT
192e0 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71  F conversion req
192f0 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72  uired for compar
19300 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  ison.  The error
19310 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   is stored.** in
19320 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
19330 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
19340 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e   int whereInScan
19350 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
19360 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
19370 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
19380 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
19390 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
193a0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
193b0 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  ,.  ExprList *pL
193c0 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ist,     /* The 
193d0 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68  value list on th
193e0 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28  e RHS of "x IN (
193f0 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a  v1,v2,v3,...)" *
19400 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52  /.  tRowcnt *pnR
19410 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ow       /* Writ
19420 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
19430 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
19440 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
19450 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
19460 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
19470 78 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c  x;.  int nRecVal
19480 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e  id = pBuilder->n
19490 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20  RecValid;.  int 
194a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
194b0 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
194c0 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
194d0 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74  /.  tRowcnt nEst
194e0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
194f0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f  umber of rows fo
19500 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  r a single term 
19510 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f  */.  tRowcnt nRo
19520 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  wEst = 0;    /* 
19530 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20  New estimate of 
19540 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
19550 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ws */.  int i;  
19560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19570 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
19580 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
19590 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
195a0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
195b0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69  LITE_OK && i<pLi
195c0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
195d0 0a 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61  .    nEst = p->a
195e0 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20  iRowEst[0];.    
195f0 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
19600 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
19610 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e  Builder, pList->
19620 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73  a[i].pExpr, &nEs
19630 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  t);.    nRowEst 
19640 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75  += nEst;.    pBu
19650 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
19660 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20   = nRecValid;.  
19670 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
19680 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
19690 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61  ( nRowEst > p->a
196a0 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f  iRowEst[0] ) nRo
196b0 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45  wEst = p->aiRowE
196c0 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f  st[0];.    *pnRo
196d0 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
196e0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
196f0 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  0,("IN row estim
19700 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20  ate: est=%g\n", 
19710 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
19720 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
19730 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52  r->nRecValid==nR
19740 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74  ecValid );.  ret
19750 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
19760 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
19770 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
19780 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62   */../*.** Disab
19790 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  le a term in the
197a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
197b0 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64  Except, do not d
197c0 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a  isable the term.
197d0 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c  ** if it control
197e0 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  s a LEFT OUTER J
197f0 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e  OIN and it did n
19800 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
19810 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49  the ON.** or USI
19820 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  NG clause of tha
19830 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f  t join..**.** Co
19840 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20  nsider the term 
19850 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65  t2.z='ok' in the
19860 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69   following queri
19870 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  es:.**.**   (1) 
19880 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
19890 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
198a0 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52  N t1.a=t2.x WHER
198b0 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  E t2.z='ok'.**  
198c0 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (2)  SELECT * F
198d0 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
198e0 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
198f0 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
19900 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20  *   (3)  SELECT 
19910 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48  * FROM t1, t2 WH
19920 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e  ERE t1.a=t2.x AN
19930 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a  D t2.z='ok'.**.*
19940 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20  * The t2.z='ok' 
19950 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74  is disabled in t
19960 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73  he in (2) becaus
19970 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a  e it originates.
19980 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ** in the ON cla
19990 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69  use.  The term i
199a0 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33  s disabled in (3
199b0 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  ) because it is 
199c0 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61  not part.** of a
199d0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
199e0 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74  .  In (1), the t
199f0 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62  erm is not disab
19a00 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62  led..**.** Disab
19a10 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73  ling a term caus
19a20 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20  es that term to 
19a30 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e  not be tested in
19a40 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
19a50 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
19a60 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e   Disabling is an
19a70 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
19a80 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73  When terms are s
19a90 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69  atisfied.** by i
19aa0 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62  ndices, we disab
19ab0 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65  le them to preve
19ac0 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73  nt redundant tes
19ad0 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a  ts in the inner.
19ae0 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75  ** loop.  We wou
19af0 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65  ld get the corre
19b00 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f  ct results if no
19b10 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20  thing were ever 
19b20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74  disabled,.** but
19b30 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e   joins might run
19b40 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
19b50 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20  .  The trick is 
19b60 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75  to disable as mu
19b70 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20  ch.** as we can 
19b80 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e  without disablin
19b90 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20  g too much.  If 
19ba0 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  we disabled in (
19bb0 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20  1), we'd get.** 
19bc0 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72  the wrong answer
19bd0 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38  .  See ticket #8
19be0 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  13..*/.static vo
19bf0 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57  id disableTerm(W
19c00 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
19c10 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  l, WhereTerm *pT
19c20 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72  erm){.  if( pTer
19c30 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72  m.      && (pTer
19c40 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
19c50 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20  M_CODED)==0.    
19c60 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c    && (pLevel->iL
19c70 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78  eftJoin==0 || Ex
19c80 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
19c90 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
19ca0 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20  romJoin)).      
19cb0 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  && (pLevel->notR
19cc0 65 61 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72  eady & pTerm->pr
19cd0 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b  ereqAll)==0.  ){
19ce0 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  .    pTerm->wtFl
19cf0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
19d00 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  D;.    if( pTerm
19d10 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a  ->iParent>=0 ){.
19d20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
19d30 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d  *pOther = &pTerm
19d40 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e  ->pWC->a[pTerm->
19d50 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
19d60 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e  if( (--pOther->n
19d70 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20  Child)==0 ){.   
19d80 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
19d90 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29  (pLevel, pOther)
19da0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19db0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
19dc0 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79  e an OP_Affinity
19dd0 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79   opcode to apply
19de0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
19df0 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66  nity string zAff
19e00 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67  .** to the n reg
19e10 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
19e20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  at base. .**.** 
19e30 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  As an optimizati
19e40 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  on, SQLITE_AFF_N
19e50 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69  ONE entries (whi
19e60 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61  ch are no-ops) a
19e70 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69  t the.** beginni
19e80 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41  ng and end of zA
19e90 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20  ff are ignored. 
19ea0 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   If all entries 
19eb0 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53  in zAff are.** S
19ec0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20  QLITE_AFF_NONE, 
19ed0 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74  then no code get
19ee0 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a  s generated..**.
19ef0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19f00 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f  makes its own co
19f10 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68  py of zAff so th
19f20 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  at the caller is
19f30 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69   free.** to modi
19f40 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68  fy zAff after th
19f50 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
19f60 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
19f70 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69  id codeApplyAffi
19f80 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72  nity(Parse *pPar
19f90 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e  se, int base, in
19fa0 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29  t n, char *zAff)
19fb0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
19fc0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
19fd0 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20  f( zAff==0 ){.  
19fe0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
19ff0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1a000 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
1a010 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1a020 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  v!=0 );..  /* Ad
1a030 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20  just base and n 
1a040 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c  to skip over SQL
1a050 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74  ITE_AFF_NONE ent
1a060 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69  ries at the begi
1a070 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65  nning.  ** and e
1a080 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69  nd of the affini
1a090 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a  ty string..  */.
1a0a0 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
1a0b0 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f  zAff[0]==SQLITE_
1a0c0 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
1a0d0 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b  n--;.    base++;
1a0e0 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d  .    zAff++;.  }
1a0f0 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26  .  while( n>1 &&
1a100 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49   zAff[n-1]==SQLI
1a110 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
1a120 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f     n--;.  }..  /
1a130 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66  * Code the OP_Af
1a140 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66  finity opcode if
1a150 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69   there is anythi
1a160 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a  ng left to do. *
1a170 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  /.  if( n>0 ){. 
1a180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a190 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp2(v, OP_Affin
1a1a0 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  ity, base, n);. 
1a1b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1a1c0 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41  angeP4(v, -1, zA
1a1d0 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ff, n);.    sqli
1a1e0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1a1f0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1a200 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d  e, base, n);.  }
1a210 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
1a220 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73  ate code for a s
1a230 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74  ingle equality t
1a240 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
1a250 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75   clause.  An equ
1a260 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61  ality.** term ca
1a270 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78  n be either X=ex
1a280 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29  pr or X IN (...)
1a290 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65  .   pTerm is the
1a2a0 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20   term to be .** 
1a2b0 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  coded..**.** The
1a2c0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66   current value f
1a2d0 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  or the constrain
1a2e0 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  t is left in reg
1a2f0 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a  ister iReg..**.*
1a300 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  * For a constrai
1a310 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  nt of the form X
1a320 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65  =expr, the expre
1a330 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74  ssion is evaluat
1a340 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65  ed and its.** re
1a350 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  sult is left on 
1a360 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20  the stack.  For 
1a370 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74  constraints of t
1a380 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e  he form X IN (..
1a390 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  .).** this routi
1a3a0 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f  ne sets up a loo
1a3b0 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72  p that will iter
1a3c0 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  ate over all val
1a3d0 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61  ues of X..*/.sta
1a3e0 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61  tic int codeEqua
1a3f0 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73  lityTerm(.  Pars
1a400 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1a410 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
1a420 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
1a430 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
1a440 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74  /* The term of t
1a450 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1a460 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
1a470 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1a480 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65  vel, /* The leve
1a490 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
1a4a0 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
1a4b0 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ing on */.  int 
1a4c0 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  iEq,            
1a4d0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1a4e0 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69  equality term wi
1a4f0 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20  thin this level 
1a500 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
1a510 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1a520 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64   for reverse-ord
1a530 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73  er IN operations
1a540 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65   */.  int iTarge
1a550 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74  t         /* Att
1a560 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65  empt to leave re
1a570 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65  sults in this re
1a580 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
1a590 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
1a5a0 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a  >pExpr;.  Vdbe *
1a5b0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1a5c0 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20  e;.  int iReg;  
1a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5e0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
1a5f0 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ing results */..
1a600 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65    assert( iTarge
1a610 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d  t>0 );.  if( pX-
1a620 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
1a630 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
1a640 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1a650 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
1a660 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d  t, iTarget);.  }
1a670 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d  else if( pX->op=
1a680 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
1a690 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
1a6a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a6b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1a6c0 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69  ll, 0, iReg);.#i
1a6d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a6e0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
1a6f0 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70  se{.    int eTyp
1a700 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e;.    int iTab;
1a710 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f  .    struct InLo
1a720 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65  op *pIn;.    Whe
1a730 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
1a740 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1a750 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
1a760 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1a770 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
1a780 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70  0.      && pLoop
1a790 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1a7a0 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f  !=0.      && pLo
1a7b0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1a7c0 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
1a7d0 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq].    ){.     
1a7e0 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d   testcase( iEq==
1a7f0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1a800 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20  ase( bRev );.   
1a810 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b     bRev = !bRev;
1a820 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1a830 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
1a840 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   );.    iReg = i
1a850 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70  Target;.    eTyp
1a860 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
1a870 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
1a880 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65  X, 0);.    if( e
1a890 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type==IN_INDEX_I
1a8a0 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20  NDEX_DESC ){.   
1a8b0 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65     testcase( bRe
1a8c0 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20  v );.      bRev 
1a8d0 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20  = !bRev;.    }. 
1a8e0 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54     iTab = pX->iT
1a8f0 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  able;.    sqlite
1a900 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
1a910 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
1a920 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
1a930 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1a940 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1a950 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
1a960 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f  R)==0 );.    pLo
1a970 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
1a980 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20  HERE_IN_ABLE;.  
1a990 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e    if( pLevel->u.
1a9a0 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20  in.nIn==0 ){.   
1a9b0 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e     pLevel->addrN
1a9c0 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
1a9d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1a9e0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1a9f0 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20  u.in.nIn++;.    
1aa00 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
1aa10 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71  Loop =.       sq
1aa20 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
1aa30 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
1aa40 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
1aa50 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  nLoop,.         
1aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa70 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76       sizeof(pLev
1aa80 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
1aa90 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69  [0])*pLevel->u.i
1aaa0 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20  n.nIn);.    pIn 
1aab0 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  = pLevel->u.in.a
1aac0 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  InLoop;.    if( 
1aad0 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  pIn ){.      pIn
1aae0 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   += pLevel->u.in
1aaf0 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20  .nIn - 1;.      
1ab00 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62  pIn->iCur = iTab
1ab10 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
1ab20 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
1ab30 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  D ){.        pIn
1ab40 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
1ab50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ab60 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
1ab70 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20  b, iReg);.      
1ab80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1ab90 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
1aba0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1abb0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
1abc0 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a  iTab, 0, iReg);.
1abd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
1abe0 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20  n->eEndLoopOp = 
1abf0 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
1ac00 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
1ac10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ac20 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
1ac30 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iReg);.    }else
1ac40 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1ac50 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20  u.in.nIn = 0;.  
1ac60 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
1ac70 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1ac80 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72  vel, pTerm);.  r
1ac90 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f  eturn iReg;.}../
1aca0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1acb0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
1acc0 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64  luate all == and
1acd0 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
1ace0 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e  for an.** index.
1acf0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1ad00 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62  le, consider tab
1ad10 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c  le t1(a,b,c,d,e,
1ad20 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31  f) with index i1
1ad30 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70  (a,b,c)..** Supp
1ad40 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ose the WHERE cl
1ad50 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61  ause is this:  a
1ad60 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c  ==5 AND b IN (1,
1ad70 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44  2,3) AND c>5 AND
1ad80 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64   c<10.** The ind
1ad90 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61  ex has as many a
1ada0 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79  s three equality
1adb0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75   constraints, bu
1adc0 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61  t in this.** exa
1add0 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20  mple, the third 
1ade0 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20  "c" value is an 
1adf0 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20  inequality.  So 
1ae00 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e  only two .** con
1ae10 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64  straints are cod
1ae20 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
1ae30 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  e will generate 
1ae40 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
1ae50 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49  .** a==5 and b I
1ae60 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20  N (1,2,3).  The 
1ae70 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
1ae80 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20  or a and b will 
1ae90 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  be stored.** in 
1aea0 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
1aeb0 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e  sters and the in
1aec0 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
1aed0 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74   register is ret
1aee0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  urned..**.** In 
1aef0 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
1af00 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74  e nEq==2.  But t
1af10 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77  his subroutine w
1af20 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c  orks for any val
1af30 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63  ue.** of nEq inc
1af40 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45  luding 0.  If nE
1af50 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69  q==0, this routi
1af60 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e  ne is nearly a n
1af70 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  o-op..** The onl
1af80 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20  y thing it does 
1af90 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  is allocate the 
1afa0 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d  pLevel->iMem mem
1afb0 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20  ory cell and.** 
1afc0 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69  compute the affi
1afd0 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  nity string..**.
1afe0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1aff0 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73  always allocates
1b000 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65   at least one me
1b010 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65  mory cell and re
1b020 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64  turns.** the ind
1b030 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72  ex of that memor
1b040 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65  y cell. The code
1b050 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74   that.** calls t
1b060 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1b070 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79   use that memory
1b080 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74   cell to store t
1b090 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a  he termination.*
1b0a0 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
1b0b0 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
1b0c0 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
1b0d0 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
1b0e0 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
1b0f0 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
1b100 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
1b110 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
1b120 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
1b130 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
1b140 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20  turning, *pzAff 
1b150 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1b160 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
1b170 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79  aining a.** copy
1b180 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
1b190 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f  ffinity string o
1b1a0 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f  f the index allo
1b1b0 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  cated using.** s
1b1c0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
1b1d0 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65  . Except, entrie
1b1e0 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66  s in the copy of
1b1f0 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f   the string asso
1b200 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65  ciated.** with e
1b210 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1b220 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e  nts that use NON
1b230 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20 73  E affinity are s
1b240 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f  et to.** SQLITE_
1b250 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69  AFF_NONE. This i
1b260 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  s to deal with S
1b270 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20 66  QL such as the f
1b280 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
1b290 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1b2a0 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52 59  1(a TEXT PRIMARY
1b2b0 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53   KEY, b);.**   S
1b2c0 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
1b2d0 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45 52  1 AS t2, t1 WHER
1b2e0 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a  E t1.a = t2.b;.*
1b2f0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d  *.** In the exam
1b300 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69  ple above, the i
1b310 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61  ndex on t1(a) ha
1b320 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e  s TEXT affinity.
1b330 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68   But since.** th
1b340 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69 64  e right hand sid
1b350 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74  e of the equalit
1b360 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32  y constraint (t2
1b370 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66  .b) has NONE aff
1b380 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e  inity,.** no con
1b390 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62  version should b
1b3a0 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f  e attempted befo
1b3b0 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20  re using a t2.b 
1b3c0 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66  value as part of
1b3d0 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61  .** a key to sea
1b3e0 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48  rch the index. H
1b3f0 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 62  ence the first b
1b400 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75 72  yte in the retur
1b410 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20  ned affinity.** 
1b420 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65  string in this e
1b430 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20  xample would be 
1b440 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46  set to SQLITE_AF
1b450 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69  F_NONE..*/.stati
1b460 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75  c int codeAllEqu
1b470 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61  alityTerms(.  Pa
1b480 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1b490 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1b4a0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
1b4b0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
1b4c0 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65    /* Which neste
1b4d0 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52  d loop of the FR
1b4e0 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  OM we are coding
1b4f0 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
1b500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b510 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72  everse the order
1b520 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   of IN operators
1b530 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
1b540 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Reg,        /* N
1b550 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
1b560 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
1b570 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cate */.  char *
1b580 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20 20  *pzAff          
1b590 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70  /* OUT: Set to p
1b5a0 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79  oint to affinity
1b5b0 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
1b5c0 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20  int nEq;        
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b5e0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
1b5f0 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69  = or IN constrai
1b600 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20  nts to code */. 
1b610 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1b620 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
1b630 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63  * The vm under c
1b640 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1b650 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
1b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b670 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e  * The index bein
1b680 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  g used for this 
1b690 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54  loop */.  WhereT
1b6a0 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
1b6b0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
1b6c0 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  gle constraint t
1b6d0 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  erm */.  WhereLo
1b6e0 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
1b6f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
1b700 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
1b710 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b730 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1b740 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  r */.  int regBa
1b750 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1b760 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
1b770 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  ister */.  int n
1b780 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
1b790 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b7a0 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  er of registers 
1b7b0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
1b7c0 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20   char *zAff;    
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b7e0 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * Affinity strin
1b7f0 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  g to return */..
1b800 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65    /* This module
1b810 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
1b820 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74  on query plans t
1b830 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  hat use an index
1b840 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  . */.  pLoop = p
1b850 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
1b860 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
1b870 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1b880 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
1b890 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f  0 );.  nEq = pLo
1b8a0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
1b8b0 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d  .  pIdx = pLoop-
1b8c0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
1b8d0 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21  .  assert( pIdx!
1b8e0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  =0 );..  /* Figu
1b8f0 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
1b900 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20  memory cells we 
1b910 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61  will need then a
1b920 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20  llocate them..  
1b930 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70  */.  regBase = p
1b940 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
1b950 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d  .  nReg = pLoop-
1b960 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e  >u.btree.nEq + n
1b970 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72  ExtraReg;.  pPar
1b980 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
1b990 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69  ;..  zAff = sqli
1b9a0 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72  te3DbStrDup(pPar
1b9b0 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49  se->db, sqlite3I
1b9c0 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28  ndexAffinityStr(
1b9d0 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28  v, pIdx));.  if(
1b9e0 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50   !zAff ){.    pP
1b9f0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1ba00 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
1ba10 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74  .  /* Evaluate t
1ba20 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  he equality cons
1ba30 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  traints.  */.  a
1ba40 73 73 65 72 74 28 20 7a 41 66 66 3d 3d 30 20 7c  ssert( zAff==0 |
1ba50 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41  | (int)strlen(zA
1ba60 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f  ff)>=nEq );.  fo
1ba70 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b  r(j=0; j<nEq; j+
1ba80 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a  +){.    int r1;.
1ba90 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1baa0 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
1bab0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
1bac0 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 );.    /* The
1bad0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20   following true 
1bae0 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74 68  for indices with
1baf0 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d   redundant colum
1bb00 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20  ns. .    ** Ex: 
1bb10 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
1bb20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45  ON t1(a,b,a); SE
1bb30 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1bb40 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30  HERE a=0 AND b=0
1bb50 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73  ; */.    testcas
1bb60 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  e( (pTerm->wtFla
1bb70 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
1bb80 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
1bb90 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
1bba0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1bbb0 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63  AL );.    r1 = c
1bbc0 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1bbd0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
1bbe0 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20  Level, j, bRev, 
1bbf0 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
1bc00 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b  if( r1!=regBase+
1bc10 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  j ){.      if( n
1bc20 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Reg==1 ){.      
1bc30 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1bc40 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1bc50 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20  regBase);.      
1bc60 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a    regBase = r1;.
1bc70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1bc80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1bc90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
1bca0 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b  py, r1, regBase+
1bcb0 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
1bcc0 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
1bcd0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1bce0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
1bcf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1bd00 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1bd10 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66   WO_IN );.    if
1bd20 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1bd30 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
1bd40 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20  |WO_IN))==0 ){. 
1bd50 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
1bd60 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  t = pTerm->pExpr
1bd70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1bd80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1bd90 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69  sNullJump(v, pRi
1bda0 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20  ght, regBase+j, 
1bdb0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
1bdc0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66 66  ;.      if( zAff
1bdd0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1bde0 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1bdf0 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
1be00 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f  Aff[j])==SQLITE_
1be10 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
1be20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20        zAff[j] = 
1be30 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1be40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1be50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1be60 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
1be70 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
1be80 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  zAff[j]) ){.    
1be90 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20        zAff[j] = 
1bea0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1beb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bec0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a   }.    }.  }.  *
1bed0 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20  pzAff = zAff;.  
1bee0 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a  return regBase;.
1bef0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1bf00 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
1bf10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1bf20 65 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f  e is a helper fo
1bf30 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61  r explainIndexRa
1bf40 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a  nge() below.**.*
1bf50 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65  * pStr holds the
1bf60 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72   text of an expr
1bf70 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61  ession that we a
1bf80 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f  re building up o
1bf90 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20  ne term.** at a 
1bfa0 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74  time.  This rout
1bfb0 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20 74  ine adds a new t
1bfc0 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  erm to the end o
1bfd0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1bfe0 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73  ..** Terms are s
1bff0 65 70 61 72 61 74 65 64 20 62 79 20 41 4e 44 20  eparated by AND 
1c000 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44 22  so add the "AND"
1c010 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64   text for second
1c020 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a   and subsequent.
1c030 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a  ** terms only..*
1c040 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
1c050 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1c060 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74  .  StrAccum *pSt
1c070 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
1c080 2a 20 54 68 65 20 74 65 78 74 20 65 78 70 72 65  * The text expre
1c090 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c  ssion being buil
1c0a0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d  t */.  int iTerm
1c0b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c0c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1c0d0 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74  his term.  First
1c0e0 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f   is zero */.  co
1c0f0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
1c100 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  n,        /* Nam
1c110 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
1c120 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1c130 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20 20  *zOp            
1c140 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1c150 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20  operator */.){. 
1c160 20 69 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c   if( iTerm ) sql
1c170 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1c180 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22  nd(pStr, " AND "
1c190 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 5);.  sqlite3S
1c1a0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
1c1b0 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29  tr, zColumn, -1)
1c1c0 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
1c1d0 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
1c1e0 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  zOp, 1);.  sqlit
1c1f0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1c200 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a  (pStr, "?", 1);.
1c210 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
1c220 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62  t pLevel describ
1c230 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66 6f  es a strategy fo
1c240 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65  r scanning table
1c250 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20   pTab. This .** 
1c260 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1c270 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1c280 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f  string buffer co
1c290 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72  ntaining a descr
1c2a0 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  iption.** of the
1c2b0 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65   subset of table
1c2c0 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79   rows scanned by
1c2d0 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69 6e   the strategy in
1c2e0 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a   the form of an.
1c2f0 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f  ** SQL expressio
1c300 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f  n. Or, if all ro
1c310 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20  ws are scanned, 
1c320 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
1c330 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1c340 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72  ple, if the quer
1c350 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  y:.**.**   SELEC
1c360 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
1c370 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a  E a=1 AND b>2;.*
1c380 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20  *.** is run and 
1c390 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
1c3a0 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65  x on (a, b), the
1c3b0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1c3c0 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72  returns a.** str
1c3d0 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a  ing similar to:.
1c3e0 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44  **.**   "a=? AND
1c3f0 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20   b>?".**.** The 
1c400 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72  returned pointer
1c410 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72   points to memor
1c420 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
1c430 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
1c440 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  )..** It is the 
1c450 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
1c460 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
1c470 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72 20  free the buffer 
1c480 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f  when it is.** no
1c490 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
1c4a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1c4b0 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61   *explainIndexRa
1c4c0 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nge(sqlite3 *db,
1c4d0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
1c4e0 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  p, Table *pTab){
1c4f0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1c500 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1c510 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
1c520 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
1c530 74 72 65 65 2e 6e 45 71 3b 0a 20 20 69 6e 74 20  tree.nEq;.  int 
1c540 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  i, j;.  Column *
1c550 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  aCol = pTab->aCo
1c560 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75  l;.  int *aiColu
1c570 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
1c580 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75  olumn;.  StrAccu
1c590 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45  m txt;..  if( nE
1c5a0 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  q==0 && (pLoop->
1c5b0 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1c5c0 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
1c5d0 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20  _TOP_LIMIT))==0 
1c5e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1c5f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
1c600 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c  rAccumInit(&txt,
1c610 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41   0, 0, SQLITE_MA
1c620 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74  X_LENGTH);.  txt
1c630 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69  .db = db;.  sqli
1c640 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1c650 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29  d(&txt, " (", 2)
1c660 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1c670 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  Eq; i++){.    ch
1c680 61 72 20 2a 7a 20 3d 20 28 69 3d 3d 70 49 6e 64  ar *z = (i==pInd
1c690 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20  ex->nColumn ) ? 
1c6a0 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61  "rowid" : aCol[a
1c6b0 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d  iColumn[i]].zNam
1c6c0 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70  e;.    explainAp
1c6d0 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69  pendTerm(&txt, i
1c6e0 2c 20 7a 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a  , z, "=");.  }..
1c6f0 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70    j = i;.  if( p
1c700 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
1c710 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
1c720 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
1c730 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  j==pIndex->nColu
1c740 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a  mn ) ? "rowid" :
1c750 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a   aCol[aiColumn[j
1c760 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78  ]].zName;.    ex
1c770 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1c780 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e  &txt, i++, z, ">
1c790 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  ");.  }.  if( pL
1c7a0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
1c7b0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
1c7c0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a      char *z = (j
1c7d0 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  ==pIndex->nColum
1c7e0 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  n ) ? "rowid" : 
1c7f0 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  aCol[aiColumn[j]
1c800 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70  ].zName;.    exp
1c810 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
1c820 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b  txt, i, z, "<");
1c830 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
1c840 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78  rAccumAppend(&tx
1c850 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 72 65  t, ")", 1);.  re
1c860 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41  turn sqlite3StrA
1c870 63 63 75 6d 46 69 6e 69 73 68 28 26 74 78 74 29  ccumFinish(&txt)
1c880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1c890 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1c8a0 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65  -op unless curre
1c8b0 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
1c8c0 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  an EXPLAIN QUERY
1c8d0 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64   PLAN.** command
1c8e0 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 20 62  . If the query b
1c8f0 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69 73  eing compiled is
1c900 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52   an EXPLAIN QUER
1c910 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65  Y PLAN, a single
1c920 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 61 64  .** record is ad
1c930 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ded to the outpu
1c940 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  t to describe th
1c950 65 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72  e table scan str
1c960 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65  ategy in .** pLe
1c970 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  vel..*/.static v
1c980 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63  oid explainOneSc
1c990 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  an(.  Parse *pPa
1c9a0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
1c9b0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
1c9c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
1c9d0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c9f0 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73 20 6c  able list this l
1ca00 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20 2a 2f  oop refers to */
1ca10 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
1ca20 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
1ca30 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72     /* Scan to wr
1ca40 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f  ite OP_Explain o
1ca50 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69  pcode for */.  i
1ca60 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
1ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ca80 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76  * Value for "lev
1ca90 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  el" column of ou
1caa0 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  tput */.  int iF
1cab0 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  rom,            
1cac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1cad0 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f  ue for "from" co
1cae0 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a  lumn of output *
1caf0 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
1cb00 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
1cb10 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
1cb20 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
1cb30 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b  ereBegin() */.){
1cb40 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
1cb50 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
1cb60 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1cb70 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1cb80 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
1cb90 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56  l->iFrom];.    V
1cba0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1cbb0 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
1cbc0 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  VM being constru
1cbd0 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69  cted */.    sqli
1cbe0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1cbf0 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74  ->db;     /* Dat
1cc00 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
1cc10 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20      char *zMsg; 
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc30 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64    /* Text to add
1cc40 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a   to EQP output *
1cc50 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20  /.    int iId = 
1cc60 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
1cc70 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64  d;  /* Select id
1cc80 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70   (left-most outp
1cc90 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20  ut column) */.  
1cca0 20 20 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20    int isSearch; 
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccc0 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 53 45  /* True for a SE
1ccd0 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20  ARCH. False for 
1cce0 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68 65  SCAN. */.    Whe
1ccf0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
1cd00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1cd10 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57 68  e controlling Wh
1cd20 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
1cd30 2f 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73 3b  /.    u32 flags;
1cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd50 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 61      /* Flags tha
1cd60 74 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20  t describe this 
1cd70 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f  loop */..    pLo
1cd80 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
1cd90 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d  oop;.    flags =
1cda0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b   pLoop->wsFlags;
1cdb0 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 26  .    if( (flags&
1cdc0 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20  WHERE_MULTI_OR) 
1cdd0 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57  || (wctrlFlags&W
1cde0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
1cdf0 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  LY) ) return;.. 
1ce00 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28 66     isSearch = (f
1ce10 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f  lags&(WHERE_BTM_
1ce20 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
1ce30 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20  LIMIT))!=0.     
1ce40 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67         || ((flag
1ce50 73 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  s&WHERE_VIRTUALT
1ce60 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f  ABLE)==0 && (pLo
1ce70 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e  op->u.btree.nEq>
1ce80 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)).            
1ce90 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28  || (wctrlFlags&(
1cea0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
1ceb0 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  N|WHERE_ORDERBY_
1cec0 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67  MAX));..    zMsg
1ced0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1cee0 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65  f(db, "%s", isSe
1cef0 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53  arch?"SEARCH":"S
1cf00 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70  CAN");.    if( p
1cf10 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
1cf20 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
1cf30 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1cf40 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51  , zMsg, "%s SUBQ
1cf50 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70  UERY %d", zMsg,p
1cf60 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29  Item->iSelectId)
1cf70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cf80 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1cf90 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1cfa0 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73  sg, "%s TABLE %s
1cfb0 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
1cfc0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  zName);.    }.. 
1cfd0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
1cfe0 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d  lias ){.      zM
1cff0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1d000 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1d010 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c  %s AS %s", zMsg,
1d020 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
1d030 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1d040 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  flags & (WHERE_I
1d050 50 4b 7c 57 48 45 52 45 5f 56 49 52 54 55 41 4c  PK|WHERE_VIRTUAL
1d060 54 41 42 4c 45 29 29 3d 3d 30 0a 20 20 20 20 20  TABLE))==0.     
1d070 26 26 20 41 4c 57 41 59 53 28 70 4c 6f 6f 70 2d  && ALWAYS(pLoop-
1d080 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
1d090 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
1d0a0 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
1d0b0 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
1d0c0 65 28 64 62 2c 20 70 4c 6f 6f 70 2c 20 70 49 74  e(db, pLoop, pIt
1d0d0 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20  em->pTab);.     
1d0e0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1d0f0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1d100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d110 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45   ((flags & WHERE
1d120 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 3f 20 0a  _AUTO_INDEX) ? .
1d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d140 20 20 20 22 25 73 20 55 53 49 4e 47 20 41 55 54     "%s USING AUT
1d150 4f 4d 41 54 49 43 20 25 73 49 4e 44 45 58 25 2e  OMATIC %sINDEX%.
1d160 30 73 25 73 22 20 3a 0a 20 20 20 20 20 20 20 20  0s%s" :.        
1d170 20 20 20 20 20 20 20 20 20 20 20 22 25 73 20 55             "%s U
1d180 53 49 4e 47 20 25 73 49 4e 44 45 58 20 25 73 25  SING %sINDEX %s%
1d190 73 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  s"), .          
1d1a0 20 20 20 20 20 7a 4d 73 67 2c 20 28 28 66 6c 61       zMsg, ((fla
1d1b0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
1d1c0 4e 4c 59 29 20 3f 20 22 43 4f 56 45 52 49 4e 47  NLY) ? "COVERING
1d1d0 20 22 20 3a 20 22 22 29 2c 0a 20 20 20 20 20 20   " : ""),.      
1d1e0 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
1d1f0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
1d200 7a 4e 61 6d 65 2c 20 7a 57 68 65 72 65 29 3b 0a  zName, zWhere);.
1d210 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
1d220 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b  ree(db, zWhere);
1d230 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1d240 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  flags & WHERE_IP
1d250 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20  K)!=0 && (flags 
1d260 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49  & WHERE_CONSTRAI
1d270 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  NT)!=0 ){.      
1d280 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1d290 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1d2a0 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45 47   "%s USING INTEG
1d2b0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c  ER PRIMARY KEY",
1d2c0 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20 69   zMsg);..      i
1d2d0 66 28 20 66 6c 61 67 73 26 28 57 48 45 52 45 5f  f( flags&(WHERE_
1d2e0 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
1d2f0 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20  COLUMN_IN) ){.  
1d300 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1d310 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1d320 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
1d330 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d=?)", zMsg);.  
1d340 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
1d350 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f  lags&WHERE_BOTH_
1d360 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f  LIMIT)==WHERE_BO
1d370 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TH_LIMIT ){.    
1d380 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1d390 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1d3a0 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e  Msg, "%s (rowid>
1d3b0 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c  ? AND rowid<?)",
1d3c0 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
1d3d0 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57 48  lse if( flags&WH
1d3e0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
1d3f0 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
1d400 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1d410 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
1d420 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid>?)", zMsg);
1d430 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1d440 20 41 4c 57 41 59 53 28 66 6c 61 67 73 26 57 48   ALWAYS(flags&WH
1d450 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29  ERE_TOP_LIMIT) )
1d460 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
1d470 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1d480 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
1d490 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29  rowid<?)", zMsg)
1d4a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d4b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d4c0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1d4d0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 66  .    else if( (f
1d4e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
1d4f0 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
1d500 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
1d510 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1d520 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52 54  , zMsg, "%s VIRT
1d530 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20  UAL TABLE INDEX 
1d540 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20  %d:%s", zMsg,.  
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d560 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1d570 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76  xNum, pLoop->u.v
1d580 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
1d590 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7a 4d   }.#endif.    zM
1d5a0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1d5b0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1d5c0 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  %s", zMsg);.    
1d5d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d5e0 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
1d5f0 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46   iId, iLevel, iF
1d600 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  rom, zMsg, P4_DY
1d610 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  NAMIC);.  }.}.#e
1d620 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
1d630 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c  lainOneScan(u,v,
1d640 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20  w,x,y,z).#endif 
1d650 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
1d660 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  XPLAIN */.../*.*
1d670 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d680 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
1d690 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c   the iLevel-th l
1d6a0 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52 45  oop in the WHERE
1d6b0 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65   clause.** imple
1d6c0 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69  mentation descri
1d6d0 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a  bed by pWInfo..*
1d6e0 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
1d6f0 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72   codeOneLoopStar
1d700 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
1d710 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d  pWInfo,   /* Com
1d720 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  plete informatio
1d730 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52  n about the WHER
1d740 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
1d750 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
1d760 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65     /* Which leve
1d770 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  l of pWInfo->a[]
1d780 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64   should be coded
1d790 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
1d7a0 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57 68  tReady     /* Wh
1d7b0 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 63  ich tables are c
1d7c0 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
1d7d0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  le */.){.  int j
1d7e0 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
1d7f0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
1d800 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20   */.  int iCur; 
1d810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d820 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
1d830 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
1d840 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20 20   int addrNxt;   
1d850 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
1d860 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e  o jump to contin
1d870 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74  ue with the next
1d880 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e   IN case */.  in
1d890 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20  t omitTable;    
1d8a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
1d8b0 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f   use the index o
1d8c0 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  nly */.  int bRe
1d8d0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
1d8e0 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65 64   True if we need
1d8f0 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65   to scan in reve
1d900 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57  rse order */.  W
1d910 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1d920 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65  l;  /* The where
1d930 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f 64   level to be cod
1d940 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ed */.  WhereLoo
1d950 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20  p *pLoop;    /* 
1d960 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  The WhereLoop ob
1d970 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ject being coded
1d980 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
1d990 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65  e *pWC;    /* De
1d9a0 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  composition of t
1d9b0 68 65 20 65 6e 74 69 72 65 20 57 48 45 52 45 20  he entire WHERE 
1d9c0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
1d9d0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
1d9e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1d9f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
1da00 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  rm */.  Parse *p
1da10 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
1da20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1da30 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1da40 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da60 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1da70 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  ection */.  Vdbe
1da80 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
1da90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1daa0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74  he prepared stmt
1dab0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1dac0 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ions */.  struct
1dad0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1dae0 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f  TabItem;  /* FRO
1daf0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
1db00 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
1db10 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20  nt addrBrk;     
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1db30 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
1db40 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
1db50 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
1db60 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20  drCont;         
1db70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
1db80 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
1db90 75 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63  ue with next cyc
1dba0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77  le */.  int iRow
1dbb0 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  idReg = 0;      
1dbc0 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74    /* Rowid is st
1dbd0 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67  ored in this reg
1dbe0 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65  ister, if not ze
1dbf0 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c  ro */.  int iRel
1dc00 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20  easeReg = 0;    
1dc10 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74    /* Temp regist
1dc20 65 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72  er to free befor
1dc30 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a  e returning */..
1dc40 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
1dc50 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d  o->pParse;.  v =
1dc60 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1dc70 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d    pWC = &pWInfo-
1dc80 3e 73 57 43 3b 0a 20 20 64 62 20 3d 20 70 50 61  >sWC;.  db = pPa
1dc90 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4c 65 76 65  rse->db;.  pLeve
1dca0 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
1dcb0 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20  Level];.  pLoop 
1dcc0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
1dcd0 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26  ;.  pTabItem = &
1dce0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1dcf0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
1dd00 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61  m];.  iCur = pTa
1dd10 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
1dd20 20 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61    pLevel->notRea
1dd30 64 79 20 3d 20 6e 6f 74 52 65 61 64 79 20 26 20  dy = notReady & 
1dd40 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  ~getMask(&pWInfo
1dd50 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
1dd60 29 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 57 49  );.  bRev = (pWI
1dd70 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c  nfo->revMask>>iL
1dd80 65 76 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74 54  evel)&1;.  omitT
1dd90 61 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77  able = (pLoop->w
1dda0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1ddb0 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20  DX_ONLY)!=0 .   
1ddc0 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
1ddd0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
1dde0 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
1ddf0 4c 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4e 6f  LE)==0;.  VdbeNo
1de00 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  opComment((v, "B
1de10 65 67 69 6e 20 4a 6f 69 6e 20 4c 6f 6f 70 20 25  egin Join Loop %
1de20 64 22 2c 20 69 4c 65 76 65 6c 29 29 3b 0a 0a 20  d", iLevel));.. 
1de30 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c   /* Create label
1de40 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b  s for the "break
1de50 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22  " and "continue"
1de60 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
1de70 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ** for the curre
1de80 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74  nt loop.  Jump t
1de90 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65  o addrBrk to bre
1dea0 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ak out of a loop
1deb0 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63  ..  ** Jump to c
1dec0 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69  ont to go immedi
1ded0 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78  ately to the nex
1dee0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
1def0 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20  he.  ** loop..  
1df00 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65  **.  ** When the
1df10 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  re is an IN oper
1df20 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61  ator, we also ha
1df30 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c  ve a "addrNxt" l
1df40 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d  abel that.  ** m
1df50 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  eans to continue
1df60 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49   with the next I
1df70 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74  N value combinat
1df80 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20  ion.  When.  ** 
1df90 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20  there are no IN 
1dfa0 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65  operators in the
1dfb0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
1dfc0 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  e "addrNxt" labe
1dfd0 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61  l.  ** is the sa
1dfe0 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e  me as "addrBrk".
1dff0 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20  .  */.  addrBrk 
1e000 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
1e010 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
1e020 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
1e030 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1e040 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76   addrCont = pLev
1e050 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73  el->addrCont = s
1e060 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1e070 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66  bel(v);..  /* If
1e080 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67   this is the rig
1e090 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
1e0a0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61  FT OUTER JOIN, a
1e0b0 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a  llocate and.  **
1e0c0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65   initialize a me
1e0d0 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72  mory cell that r
1e0e0 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74  ecords if this t
1e0f0 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79  able matches any
1e100 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
1e110 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74   left table of t
1e120 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
1e130 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  if( pLevel->iFro
1e140 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  m>0 && (pTabItem
1e150 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  [0].jointype & J
1e160 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
1e170 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a    pLevel->iLeftJ
1e180 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oin = ++pParse->
1e190 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
1e1a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e1b0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c  P_Integer, 0, pL
1e1c0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
1e1d0 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
1e1e0 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54  t((v, "init LEFT
1e1f0 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66   JOIN no-match f
1e200 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lag"));.  }..  /
1e210 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f  * Special case o
1e220 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  f a FROM clause 
1e230 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65  subquery impleme
1e240 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
1e250 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54  tine */.  if( pT
1e260 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75  abItem->viaCorou
1e270 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tine ){.    int 
1e280 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49  regYield = pTabI
1e290 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
1e2a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e2b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1e2c0 67 65 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61  ger, pTabItem->a
1e2d0 64 64 72 46 69 6c 6c 53 75 62 2d 31 2c 20 72 65  ddrFillSub-1, re
1e2e0 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 4c 65  gYield);.    pLe
1e2f0 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74  vel->p2 =  sqlit
1e300 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
1e310 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65  OP_Yield, regYie
1e320 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ld);.    VdbeCom
1e330 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72  ment((v, "next r
1e340 6f 77 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65  ow of co-routine
1e350 20 25 73 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e   %s", pTabItem->
1e360 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
1e370 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e380 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
1e390 65 67 59 69 65 6c 64 2b 31 2c 20 61 64 64 72 42  egYield+1, addrB
1e3a0 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  rk);.    pLevel-
1e3b0 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20  >op = OP_Goto;. 
1e3c0 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
1e3d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1e3e0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20  UALTABLE.  if(  
1e3f0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1e400 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
1e410 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
1e420 2f 2a 20 43 61 73 65 20 31 3a 20 20 54 68 65 20  /* Case 1:  The 
1e430 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75  table is a virtu
1e440 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74  al-table.  Use t
1e450 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56  he VFilter and V
1e460 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  Next.    **     
1e470 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74       to access t
1e480 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  he data..    */.
1e490 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20      int iReg;   
1e4a0 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20  /* P3 Value for 
1e4b0 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20  OP_VFilter */.  
1e4c0 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75    int addrNotFou
1e4d0 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e  nd;.    int nCon
1e4e0 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d  straint = pLoop-
1e4f0 3e 6e 4c 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71  >nLTerm;..    sq
1e500 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1e510 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1e520 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  iReg = sqlite3Ge
1e530 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1e540 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  e, nConstraint+2
1e550 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f  );.    addrNotFo
1e560 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  und = pLevel->ad
1e570 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a  drBrk;.    for(j
1e580 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; j<nConstrain
1e590 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  t; j++){.      i
1e5a0 6e 74 20 69 54 61 72 67 65 74 20 3d 20 69 52 65  nt iTarget = iRe
1e5b0 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54 65  g+j+2;.      pTe
1e5c0 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rm = pLoop->aLTe
1e5d0 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  rm[j];.      if(
1e5e0 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74   pTerm==0 ) cont
1e5f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
1e600 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1e610 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
1e620 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79      codeEquality
1e630 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
1e640 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62  rm, pLevel, j, b
1e650 52 65 76 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  Rev, iTarget);. 
1e660 20 20 20 20 20 20 20 61 64 64 72 4e 6f 74 46 6f         addrNotFo
1e670 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  und = pLevel->ad
1e680 64 72 4e 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  drNxt;.      }el
1e690 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1e6a0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1e6b0 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
1e6c0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65  ->pRight, iTarge
1e6d0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1e6e0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1e6f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1e700 74 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e  teger, pLoop->u.
1e710 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65  vtab.idxNum, iRe
1e720 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  g);.    sqlite3V
1e730 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e740 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72  Integer, nConstr
1e750 61 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20  aint, iReg+1);. 
1e760 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e770 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74  dOp4(v, OP_VFilt
1e780 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f  er, iCur, addrNo
1e790 74 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20  tFound, iReg,.  
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7b0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
1e7c0 62 2e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20  b.idxStr,.      
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7e0 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65  pLoop->u.vtab.ne
1e7f0 65 64 46 72 65 65 20 3f 20 50 34 5f 4d 50 52 49  edFree ? P4_MPRI
1e800 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29  NTF : P4_STATIC)
1e810 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76  ;.    pLoop->u.v
1e820 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
1e830 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1e840 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20  <nConstraint && 
1e850 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  j<16; j++){.    
1e860 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e    if( (pLoop->u.
1e870 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a  vtab.omitMask>>j
1e880 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64  )&1 ){.        d
1e890 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1e8a0 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  l, pLoop->aLTerm
1e8b0 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [j]);.      }.  
1e8c0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1e8d0 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20  op = OP_VNext;. 
1e8e0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1e8f0 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
1e900 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
1e910 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1e920 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1e930 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
1e940 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e  arse, iReg, nCon
1e950 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
1e960 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1e970 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
1e980 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
1e990 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
1e9a0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20  RTUALTABLE */.. 
1e9b0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
1e9c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
1e9d0 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f  )!=0.   && (pLoo
1e9e0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
1e9f0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48  ERE_COLUMN_IN|WH
1ea00 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21  ERE_COLUMN_EQ))!
1ea10 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43  =0.  ){.    /* C
1ea20 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64  ase 2:  We can d
1ea30 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63  irectly referenc
1ea40 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75  e a single row u
1ea50 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20  sing an.    **  
1ea60 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79          equality
1ea70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
1ea80 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
1ea90 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20  eld.  Or.    ** 
1eaa0 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65           we refe
1eab0 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72  rence multiple r
1eac0 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77  ows using a "row
1ead0 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20  id IN (...)".   
1eae0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   **          con
1eaf0 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  struct..    */. 
1eb00 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
1eb10 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31  ->u.btree.nEq==1
1eb20 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65   );.    iRelease
1eb30 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
1eb40 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1eb50 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
1eb60 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20  op->aLTerm[0];. 
1eb70 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
1eb80 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1eb90 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21  t( pTerm->pExpr!
1eba0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1ebb0 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
1ebc0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1ebd0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1ebe0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1ebf0 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d  .    iRowidReg =
1ec00 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
1ec10 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
1ec20 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65 76   pLevel, 0, bRev
1ec30 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
1ec40 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
1ec50 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
1ec60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ec70 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
1ec80 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c  eInt, iRowidReg,
1ec90 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73   addrNxt);.    s
1eca0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1ecb0 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
1ecc0 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  , iCur, addrNxt,
1ecd0 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1ece0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1ecf0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1ed00 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64 52 65  pParse, iRowidRe
1ed10 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  g, 1);.    sqlit
1ed20 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
1ed30 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d  (pParse, iCur, -
1ed40 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  1, iRowidReg);. 
1ed50 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1ed60 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70  v, "pk"));.    p
1ed70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
1ed80 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  oop;.  }else if(
1ed90 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1eda0 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30   & WHERE_IPK)!=0
1edb0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4c  .         && (pL
1edc0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1edd0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
1ede0 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  E)!=0.  ){.    /
1edf0 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20 68 61  * Case 3:  We ha
1ee00 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  ve an inequality
1ee10 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
1ee20 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
1ee30 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eld..    */.    
1ee40 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f  int testOp = OP_
1ee50 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74  Noop;.    int st
1ee60 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d  art;.    int mem
1ee70 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20  EndValue = 0;.  
1ee80 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74    WhereTerm *pSt
1ee90 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20  art, *pEnd;..   
1eea0 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
1eeb0 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a 20 3d  le==0 );.    j =
1eec0 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d   0;.    pStart =
1eed0 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69   pEnd = 0;.    i
1eee0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1eef0 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
1ef00 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d 20 70  MIT ) pStart = p
1ef10 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b  Loop->aLTerm[j++
1ef20 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  ];.    if( pLoop
1ef30 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1ef40 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70 45  E_TOP_LIMIT ) pE
1ef50 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  nd = pLoop->aLTe
1ef60 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73 73  rm[j++];.    ass
1ef70 65 72 74 28 20 70 53 74 61 72 74 21 3d 30 20 7c  ert( pStart!=0 |
1ef80 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20  | pEnd!=0 );.   
1ef90 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
1efa0 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72     pTerm = pStar
1efb0 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74 20  t;.      pStart 
1efc0 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45  = pEnd;.      pE
1efd0 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  nd = pTerm;.    
1efe0 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  }.    if( pStart
1eff0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1f000 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
1f010 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
1f020 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  n that defines t
1f030 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a  he start bound *
1f040 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20  /.      int r1, 
1f050 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a  rTemp;        /*
1f060 20 52 65 67 69 73 74 65 72 73 20 66 6f 72 20 68   Registers for h
1f070 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72 74  olding the start
1f080 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20   boundary */..  
1f090 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
1f0a0 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61  wing constant ma
1f0b0 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69  ps TK_xx codes i
1f0c0 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  nto correspondin
1f0d0 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b  g .      ** seek
1f0e0 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65   opcodes.  It de
1f0f0 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69  pends on a parti
1f100 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f  cular ordering o
1f110 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f  f TK_xx.      */
1f120 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
1f130 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20  aMoveOp[] = {.  
1f140 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
1f150 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c  T */  OP_SeekGt,
1f160 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
1f170 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LE */  OP_Seek
1f180 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Le,.           /
1f190 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53  * TK_LT */  OP_S
1f1a0 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20 20  eekLt,.         
1f1b0 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f    /* TK_GE */  O
1f1c0 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20 20 7d  P_SeekGe.      }
1f1d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f1e0 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29  TK_LE==TK_GT+1 )
1f1f0 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  ;      /* Make s
1f200 75 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67  ure the ordering
1f210 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .. */.      asse
1f220 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
1f230 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e  +2 );      /*  .
1f240 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20  .. of the TK_xx 
1f250 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20  values... */.   
1f260 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
1f270 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20  ==TK_GT+3 );    
1f280 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72    /*  ... is cor
1f290 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20  recct. */..     
1f2a0 20 61 73 73 65 72 74 28 20 28 70 53 74 61 72 74   assert( (pStart
1f2b0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1f2c0 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20  _VNULL)==0 );.  
1f2d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
1f2e0 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
1f2f0 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
1f300 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61 72        pX = pStar
1f310 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
1f320 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
1f330 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f340 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72   pStart->leftCur
1f350 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20  sor!=iCur ); /* 
1f360 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74  transitive const
1f370 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
1f380 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f390 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f3a0 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 54   pX->pRight, &rT
1f3b0 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  emp);.      sqli
1f3c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1f3d0 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d   aMoveOp[pX->op-
1f3e0 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61 64  TK_GT], iCur, ad
1f3f0 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20  drBrk, r1);.    
1f400 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1f410 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20  , "pk"));.      
1f420 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f430 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1f440 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20  Parse, r1, 1);. 
1f450 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
1f460 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1f470 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20 20 20  e, rTemp);.     
1f480 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1f490 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20  vel, pStart);.  
1f4a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1f4b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f4c0 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61  (v, bRev ? OP_La
1f4d0 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20  st : OP_Rewind, 
1f4e0 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a  iCur, addrBrk);.
1f4f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45      }.    if( pE
1f500 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
1f510 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58 20 3d   *pX;.      pX =
1f520 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20   pEnd->pExpr;.  
1f530 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d      assert( pX!=
1f540 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1f550 74 28 20 28 70 45 6e 64 2d 3e 77 74 46 6c 61 67  t( (pEnd->wtFlag
1f560 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
1f570 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1f580 63 61 73 65 28 20 70 45 6e 64 2d 3e 6c 65 66 74  case( pEnd->left
1f590 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20  Cursor!=iCur ); 
1f5a0 2f 2a 20 54 72 61 6e 73 69 74 69 76 65 20 63 6f  /* Transitive co
1f5b0 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
1f5c0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 6e     testcase( pEn
1f5d0 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
1f5e0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
1f5f0 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d     memEndValue =
1f600 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1f610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f620 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1f630 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e  X->pRight, memEn
1f640 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69  dValue);.      i
1f650 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  f( pX->op==TK_LT
1f660 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47   || pX->op==TK_G
1f670 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  T ){.        tes
1f680 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
1f690 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20  Le : OP_Ge;.    
1f6a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f6b0 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f   testOp = bRev ?
1f6c0 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a   OP_Lt : OP_Gt;.
1f6d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69        }.      di
1f6e0 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1f6f0 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20  , pEnd);.    }. 
1f700 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
1f710 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1f720 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  r(v);.    pLevel
1f730 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  ->op = bRev ? OP
1f740 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
1f750 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
1f760 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
1f770 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a  el->p2 = start;.
1f780 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
1f790 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20  el->p5==0 );.   
1f7a0 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f   if( testOp!=OP_
1f7b0 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52  Noop ){.      iR
1f7c0 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61  owidReg = iRelea
1f7d0 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
1f7e0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1f7f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f800 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f810 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52  _Rowid, iCur, iR
1f820 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1f830 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f840 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
1f850 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
1f860 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1f870 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74  3VdbeAddOp3(v, t
1f880 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c  estOp, memEndVal
1f890 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f  ue, addrBrk, iRo
1f8a0 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
1f8b0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1f8c0 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46  P5(v, SQLITE_AFF
1f8d0 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54  _NUMERIC | SQLIT
1f8e0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1f8f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1f900 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1f910 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
1f920 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34  ){.    /* Case 4
1f930 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61  : A scan using a
1f940 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  n index..    **.
1f950 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1f960 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1f970 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f  may contain zero
1f980 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74   or more equalit
1f990 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
1f9a0 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72    terms ("==" or
1f9b0 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29   "IN" operators)
1f9c0 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
1f9d0 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20  he N.    **     
1f9e0 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f      left-most co
1f9f0 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
1fa00 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20  ex. It may also 
1fa10 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20  contain.    **  
1fa20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74         inequalit
1fa30 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e  y constraints (>
1fa40 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f  , <, >= or <=) o
1fa50 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20  n the indexed.  
1fa60 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c    **         col
1fa70 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61  umn that immedia
1fa80 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65  tely follows the
1fa90 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f   N equalities. O
1faa0 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  nly .    **     
1fab0 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f      the right-mo
1fac0 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65  st column can be
1fad0 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d   an inequality -
1fae0 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20   the rest must. 
1faf0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73     **         us
1fb00 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22  e the "==" and "
1fb10 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46  IN" operators. F
1fb20 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1fb30 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  he .    **      
1fb40 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28     index is on (
1fb50 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65  x,y,z), then the
1fb60 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73   following claus
1fb70 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20  es are all .    
1fb80 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d  **         optim
1fb90 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ized:.    **.   
1fba0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1fbb0 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  =5.    **       
1fbc0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31       x=5 AND y=1
1fbd0 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1fbe0 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30      x=5 AND y<10
1fbf0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1fc00 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41     x=5 AND y>5 A
1fc10 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
1fc20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1fc30 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a  D y=5 AND z<=10.
1fc40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1fc50 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74        The z<10 t
1fc60 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  erm of the follo
1fc70 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75  wing cannot be u
1fc80 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  sed, only.    **
1fc90 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d 35           the x=5
1fca0 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20   term:.    **.  
1fcb0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1fcc0 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20  x=5 AND z<10.   
1fcd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1fce0 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f     N may be zero
1fcf0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
1fd00 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1fd10 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20  ints..    **    
1fd20 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61 72       If there ar
1fd30 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20  e no inequality 
1fd40 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
1fd50 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a  n N is at.    **
1fd60 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f           least o
1fd70 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ne..    **.    *
1fd80 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63  *         This c
1fd90 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ase is also used
1fda0 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
1fdb0 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  no WHERE clause.
1fdc0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
1fdd0 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61  onstraints but a
1fde0 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63  n index is selec
1fdf0 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f  ted anyway, in o
1fe00 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20  rder.    **     
1fe10 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65      to force the
1fe20 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f   output order to
1fe30 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f   conform to an O
1fe40 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20  RDER BY..    */ 
1fe50 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e   .    static con
1fe60 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d  st u8 aStartOp[]
1fe70 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20   = {.      0,.  
1fe80 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f      0,.      OP_
1fe90 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20  Rewind,         
1fea0 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f    /* 2: (!start_
1feb0 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
1fec0 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65 76  tartEq &&  !bRev
1fed0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61  ) */.      OP_La
1fee0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1fef0 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 3: (!start_co
1ff00 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
1ff10 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20  rtEq &&   bRev) 
1ff20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1ff30 47 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Gt,           /*
1ff40 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   4: (start_const
1ff50 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
1ff60 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f  tEq && !bRev) */
1ff70 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74  .      OP_SeekLt
1ff80 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35  ,           /* 5
1ff90 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1ffa0 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
1ffb0 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20  q &&  bRev) */. 
1ffc0 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20       OP_SeekGe, 
1ffd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20            /* 6: 
1ffe0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1fff0 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
20000 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
20010 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20     OP_SeekLe    
20020 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73          /* 7: (s
20030 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
20040 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
20050 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d    bRev) */.    }
20060 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
20070 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d  st u8 aEndOp[] =
20080 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70   {.      OP_Noop
20090 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
200a0 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72   0: (!end_constr
200b0 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20  aints) */.      
200c0 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20  OP_IdxGE,       
200d0 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f       /* 1: (end_
200e0 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21  constraints && !
200f0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
20100 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20 20 20  P_IdxLT         
20110 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63      /* 2: (end_c
20120 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 62 52  onstraints && bR
20130 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  ev) */.    };.  
20140 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f    int nEq = pLoo
20150 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20  p->u.btree.nEq; 
20160 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
20170 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a   or IN terms */.
20180 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65      int isMinQue
20190 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
201a0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
201b0 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45   an optimized SE
201c0 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f  LECT min(x).. */
201d0 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65  .    int regBase
201e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
201f0 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
20200 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74  er holding const
20210 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a  raint values */.
20220 20 20 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20      int r1;     
20230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20240 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65   /* Temp registe
20250 72 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  r */.    WhereTe
20260 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20  rm *pRangeStart 
20270 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c  = 0;  /* Inequal
20280 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
20290 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f  t range start */
202a0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
202b0 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20  pRangeEnd = 0;  
202c0 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
202d0 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
202e0 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69  nge end */.    i
202f0 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20  nt startEq;     
20300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20310 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61  rue if range sta
20320 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  rt uses ==, >= o
20330 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
20340 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20  endEq;          
20350 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20360 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73   if range end us
20370 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
20380 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
20390 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20  _constraints;   
203a0 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
203b0 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61  range is constra
203c0 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ined */.    int 
203d0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20  nConstraint;    
203e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
203f0 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  er of constraint
20400 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e   terms */.    In
20410 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
20420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20430 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20  e index we will 
20440 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20  be using */.    
20450 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20  int iIdxCur;    
20460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20470 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
20480 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
20490 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52  .    int nExtraR
204a0 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
204b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
204c0 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e  xtra registers n
204d0 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  eeded */.    int
204e0 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
204f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
20500 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  truction opcode 
20510 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
20520 61 72 74 41 66 66 3b 20 20 20 20 20 20 20 20 20  artAff;         
20530 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
20540 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e  for start of ran
20550 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  ge constraint */
20560 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 41  .    char *zEndA
20570 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
20580 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
20590 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63  r end of range c
205a0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20  onstraint */..  
205b0 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
205c0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
205d0 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c      iIdxCur = pL
205e0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a  evel->iIdxCur;..
205f0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c      /* If this l
20600 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20  oop satisfies a 
20610 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64  sort order (pOrd
20620 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68  erBy) request th
20630 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70  at .    ** was p
20640 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
20650 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
20660 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
20670 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a  n(x) ..." .    *
20680 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68  * query, then th
20690 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e  e caller will on
206a0 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f  ly allow the loo
206b0 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20  p to run for.   
206c0 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65   ** a single ite
206d0 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  ration. This mea
206e0 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ns that the firs
206f0 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20  t row returned. 
20700 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74     ** should not
20710 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c   have a NULL val
20720 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27  ue stored in 'x'
20730 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20  . If column 'x' 
20740 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  is.    ** the fi
20750 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68  rst one after th
20760 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63  e nEq equality c
20770 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
20780 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20  e index,.    ** 
20790 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f  this requires so
207a0 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  me special handl
207b0 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
207c0 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
207d0 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
207e0 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20  DERBY_MIN)!=0.  
207f0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 62     && (pWInfo->b
20800 4f 42 53 61 74 21 3d 30 29 0a 20 20 20 20 20 26  OBSat!=0).     &
20810 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  & (pIdx->nColumn
20820 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  >nEq).    ){.   
20830 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f     /* assert( pO
20840 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31  rderBy->nExpr==1
20850 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20   ); */.      /* 
20860 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
20870 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[0].pExpr->iC
20880 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43  olumn==pIdx->aiC
20890 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f  olumn[nEq] ); */
208a0 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72  .      isMinQuer
208b0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78  y = 1;.      nEx
208c0 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
208d0 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61  }..    /* Find a
208e0 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ny inequality co
208f0 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66  nstraint terms f
20900 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  or the start and
20910 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20   end .    ** of 
20920 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20  the range. .    
20930 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a  */.    j = nEq;.
20940 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
20950 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
20960 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
20970 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20    pRangeStart = 
20980 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
20990 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  +];.      nExtra
209a0 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Reg = 1;.    }. 
209b0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
209c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
209d0 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  P_LIMIT ){.     
209e0 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f   pRangeEnd = pLo
209f0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
20a00 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
20a10 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
20a20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
20a30 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c  e to evaluate al
20a40 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  l constraint ter
20a50 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49  ms using == or I
20a60 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f  N.    ** and sto
20a70 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  re the values of
20a80 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20   those terms in 
20a90 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
20aa0 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
20ab0 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65  rting at regBase
20ac0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67  ..    */.    reg
20ad0 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71  Base = codeAllEq
20ae0 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72  ualityTerms(pPar
20af0 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e  se,pLevel,bRev,n
20b00 45 78 74 72 61 52 65 67 2c 26 7a 53 74 61 72 74  ExtraReg,&zStart
20b10 41 66 66 29 3b 0a 20 20 20 20 7a 45 6e 64 41 66  Aff);.    zEndAf
20b20 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  f = sqlite3DbStr
20b30 44 75 70 28 64 62 2c 20 7a 53 74 61 72 74 41 66  Dup(db, zStartAf
20b40 66 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20  f);.    addrNxt 
20b50 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
20b60 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  t;..    /* If we
20b70 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76   are doing a rev
20b80 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20  erse order scan 
20b90 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
20ba0 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a  index, or.    **
20bb0 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72   a forward order
20bc0 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65   scan on a desce
20bd0 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74  nding index, int
20be0 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20  erchange the .  
20bf0 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65    ** start and e
20c00 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65  nd terms (pRange
20c10 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65  Start and pRange
20c20 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  End)..    */.   
20c30 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e   if( (nEq<pIdx->
20c40 6e 43 6f 6c 75 6d 6e 20 26 26 20 62 52 65 76 3d  nColumn && bRev=
20c50 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  =(pIdx->aSortOrd
20c60 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f  er[nEq]==SQLITE_
20c70 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20 7c 7c  SO_ASC)).     ||
20c80 20 28 62 52 65 76 20 26 26 20 70 49 64 78 2d 3e   (bRev && pIdx->
20c90 6e 43 6f 6c 75 6d 6e 3d 3d 6e 45 71 29 0a 20 20  nColumn==nEq).  
20ca0 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28    ){.      SWAP(
20cb0 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61  WhereTerm *, pRa
20cc0 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74  ngeEnd, pRangeSt
20cd0 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  art);.    }..   
20ce0 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
20cf0 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e 67  eStart && (pRang
20d00 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
20d10 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b  r & WO_LE)!=0 );
20d20 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
20d30 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28 70  RangeStart && (p
20d40 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
20d50 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d  rator & WO_GE)!=
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 4c 45 29 21 3d  rator & WO_LE)!=
20da0 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
20db0 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
20dc0 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65  (pRangeEnd->eOpe
20dd0 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d  rator & WO_GE)!=
20de0 30 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71  0 );.    startEq
20df0 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74 20   = !pRangeStart 
20e00 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  || pRangeStart->
20e10 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
20e20 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65  LE|WO_GE);.    e
20e30 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65  ndEq =   !pRange
20e40 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64  End || pRangeEnd
20e50 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
20e60 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
20e70 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
20e80 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74  ts = pRangeStart
20e90 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20   || nEq>0;..    
20ea0 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65  /* Seek the inde
20eb0 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  x cursor to the 
20ec0 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e  start of the ran
20ed0 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73  ge. */.    nCons
20ee0 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
20ef0 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72    if( pRangeStar
20f00 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  t ){.      Expr 
20f10 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
20f20 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52  Start->pExpr->pR
20f30 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
20f40 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
20f50 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  se, pRight, regB
20f60 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
20f70 69 66 28 20 28 70 52 61 6e 67 65 53 74 61 72 74  if( (pRangeStart
20f80 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
20f90 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  _VNULL)==0 ){.  
20fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20fb0 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
20fc0 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  v, pRight, regBa
20fd0 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29  se+nEq, addrNxt)
20fe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20ff0 69 66 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b  if( zStartAff ){
21000 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
21010 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
21020 69 74 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61  ity(pRight, zSta
21030 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c  rtAff[nEq])==SQL
21040 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20  ITE_AFF_NONE){. 
21050 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63           /* Sinc
21060 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
21070 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72   is to be perfor
21080 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76  med with no conv
21090 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20  ersions.        
210a0 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20    ** applied to 
210b0 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65  the operands, se
210c0 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
210d0 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68  o apply to pRigh
210e0 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20  t to .          
210f0 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
21100 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  NE.  */.        
21110 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d    zStartAff[nEq]
21120 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
21130 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
21140 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
21150 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
21160 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
21170 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71  t, zStartAff[nEq
21180 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
21190 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d  zStartAff[nEq] =
211a0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
211b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
211c0 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e    }  .      nCon
211d0 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
211e0 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
211f0 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
21200 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
21210 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
21220 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20  isMinQuery ){.  
21230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21240 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
21250 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
21260 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
21270 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  aint++;.      st
21280 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  artEq = 0;.     
21290 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
212a0 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
212b0 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
212c0 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
212d0 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
212e0 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
212f0 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b    op = aStartOp[
21300 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
21310 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45  ts<<2) + (startE
21320 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20  q<<1) + bRev];. 
21330 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30     assert( op!=0
21340 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
21350 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ( op==OP_Rewind 
21360 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
21370 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a   op==OP_Last );.
21380 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
21390 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20  ==OP_SeekGt );. 
213a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
213b0 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20  =OP_SeekGe );.  
213c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
213d0 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20  OP_SeekLe );.   
213e0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
213f0 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20  P_SeekLt );.    
21400 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21410 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
21420 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
21430 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
21440 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  nt);..    /* Loa
21450 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  d the value for 
21460 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
21470 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65  onstraint at the
21480 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
21490 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79  ** range (if any
214a0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43  )..    */.    nC
214b0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
214c0 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45  .    if( pRangeE
214d0 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
214e0 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
214f0 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69  eEnd->pExpr->pRi
21500 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
21510 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
21520 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
21530 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20  e+nEq, 1);.     
21540 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21550 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
21560 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
21570 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
21580 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
21590 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b  ERM_VNULL)==0 ){
215a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
215b0 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
215c0 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
215d0 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
215e0 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
215f0 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29     if( zEndAff )
21600 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
21610 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
21620 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e  nity(pRight, zEn
21630 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49  dAff[nEq])==SQLI
21640 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20  TE_AFF_NONE){.  
21650 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65          /* Since
21660 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
21670 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d  is to be perform
21680 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65  ed with no conve
21690 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20  rsions.         
216a0 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74   ** applied to t
216b0 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74  he operands, set
216c0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
216d0 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74   apply to pRight
216e0 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a   to .          *
216f0 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
21700 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  E.  */.         
21710 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20   zEndAff[nEq] = 
21720 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
21730 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21740 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
21750 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
21760 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
21770 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b  zEndAff[nEq]) ){
21780 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41  .          zEndA
21790 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
217a0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
217b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20     }.      }  . 
217c0 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66       codeApplyAf
217d0 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
217e0 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a  egBase, nEq+1, z
217f0 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e  EndAff);.      n
21800 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
21810 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
21820 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
21830 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
21840 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
21850 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
21860 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73  StartAff);.    s
21870 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
21880 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20   zEndAff);..    
21890 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f  /* Top of the lo
218a0 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70  op body */.    p
218b0 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69  Level->p2 = sqli
218c0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
218d0 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  dr(v);..    /* C
218e0 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65  heck if the inde
218f0 78 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74  x cursor is past
21900 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
21910 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70  range. */.    op
21920 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67   = aEndOp[(pRang
21930 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28  eEnd || nEq) * (
21940 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20  1 + bRev)];.    
21950 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
21960 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65 73  _Noop );.    tes
21970 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
21980 78 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  xGE );.    testc
21990 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c  ase( op==OP_IdxL
219a0 54 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 21  T );.    if( op!
219b0 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
219c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
219d0 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49  Op4Int(v, op, iI
219e0 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20  dxCur, addrNxt, 
219f0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
21a00 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  aint);.      sql
21a10 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
21a20 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 20  (v, endEq!=bRev 
21a30 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ?1:0);.    }..  
21a40 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
21a50 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
21a60 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20  straints, check 
21a70 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20  that the value. 
21a80 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62     ** of the tab
21a90 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  le column that t
21aa0 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  he inequality co
21ab0 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e  ntrains is not N
21ac0 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69  ULL..    ** If i
21ad0 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68  t is, jump to th
21ae0 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
21af0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20   of the loop..  
21b00 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71    */.    r1 = sq
21b10 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
21b20 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74 65 73  pParse);.    tes
21b30 74 63 61 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73  tcase( pLoop->ws
21b40 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
21b50 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74  M_LIMIT );.    t
21b60 65 73 74 63 61 73 65 28 20 70 4c 6f 6f 70 2d 3e  estcase( pLoop->
21b70 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21b80 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20  TOP_LIMIT );.   
21b90 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
21ba0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54  lags & (WHERE_BT
21bb0 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f  M_LIMIT|WHERE_TO
21bc0 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b 0a  P_LIMIT))!=0 ){.
21bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21be0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
21bf0 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e  lumn, iIdxCur, n
21c00 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  Eq, r1);.      s
21c10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21c20 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
21c30 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  1, addrCont);.  
21c40 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52    }.    sqlite3R
21c50 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
21c60 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20  arse, r1);..    
21c70 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c  /* Seek the tabl
21c80 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71  e cursor, if req
21c90 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73  uired */.    dis
21ca0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
21cb0 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
21cc0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
21cd0 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64  Level, pRangeEnd
21ce0 29 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69 74  );.    if( !omit
21cf0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  Table ){.      i
21d00 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65  RowidReg = iRele
21d10 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33  aseReg = sqlite3
21d20 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
21d30 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
21d40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21d50 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
21d60 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
21d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
21d80 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
21d90 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69  rse, iCur, -1, i
21da0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
21db0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21dc0 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69  p2(v, OP_Seek, i
21dd0 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
21de0 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65    /* Deferred se
21df0 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  ek */.    }..   
21e00 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69   /* Record the i
21e10 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20  nstruction used 
21e20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
21e30 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a   loop. Disable .
21e40 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61      ** WHERE cla
21e50 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72  use terms made r
21e60 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20  edundant by the 
21e70 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e  index range scan
21e80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
21e90 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
21ea0 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29  & WHERE_ONEROW )
21eb0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
21ec0 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
21ed0 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76    }else if( bRev
21ee0 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
21ef0 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a  ->op = OP_Prev;.
21f00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21f10 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
21f20 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _Next;.    }.   
21f30 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49   pLevel->p1 = iI
21f40 64 78 43 75 72 3b 0a 20 20 20 20 69 66 28 20 28  dxCur;.    if( (
21f50 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
21f60 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e   WHERE_CONSTRAIN
21f70 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  T)==0 ){.      p
21f80 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
21f90 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
21fa0 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20  LLSCAN_STEP;.   
21fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
21fc0 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
21fd0 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ==0 );.    }.  }
21fe0 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
21ff0 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
22000 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
22010 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
22020 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20   WHERE_MULTI_OR 
22030 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35  ){.    /* Case 5
22040 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73  :  Two or more s
22050 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78 65  eparately indexe
22060 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  d terms connecte
22070 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20  d by OR.    **. 
22080 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
22090 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43     **.    **   C
220a0 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
220b0 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20  ,b,c,d);.    ** 
220c0 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
220d0 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20  1 ON t1(a);.    
220e0 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
220f0 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20  X i2 ON t1(b);. 
22100 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
22110 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63 29  NDEX i3 ON t1(c)
22120 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
22130 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
22140 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52 20  t1 WHERE a=5 OR 
22150 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e 44  b=7 OR (c=11 AND
22160 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20   d=13).    **.  
22170 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d    ** In the exam
22180 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20 74  ple, there are t
22190 68 72 65 65 20 69 6e 64 65 78 65 64 20 74 65 72  hree indexed ter
221a0 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ms connected by 
221b0 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 74  OR..    ** The t
221c0 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c  op of the loop l
221d0 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
221e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
221f0 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
22200 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
22210 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
22220 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
22230 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e    **.    ** Then
22240 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  , for each index
22250 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c  ed term, the fol
22260 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67 75  lowing. The argu
22270 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20  ments to.    ** 
22280 52 6f 77 53 65 74 54 65 73 74 20 61 72 65 20 73  RowSetTest are s
22290 75 63 68 20 74 68 61 74 20 74 68 65 20 72 6f 77  uch that the row
222a0 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  id of the curren
222b0 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65  t row is inserte
222c0 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  d.    ** into th
222d0 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74 20  e RowSet. If it 
222e0 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  is already prese
222f0 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70  nt, control skip
22300 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73  s the.    ** Gos
22310 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75  ub opcode and ju
22320 6d 70 73 20 73 74 72 61 69 67 68 74 20 74 6f 20  mps straight to 
22330 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
22340 65 64 20 62 79 20 57 68 65 72 65 45 6e 64 28 29  ed by WhereEnd()
22350 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
22360 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
22370 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29  ereBegin(<term>)
22380 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
22390 20 52 6f 77 53 65 74 54 65 73 74 20 20 20 20 20   RowSetTest     
223a0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 49               # I
223b0 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74 6f  nsert rowid into
223c0 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20 20   rowset.    **  
223d0 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 20 20          Gosub   
223e0 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20 20     2 A.    **   
223f0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
22400 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20  eEnd().    **.  
22410 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74    ** Following t
22420 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20 74  he above, code t
22430 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
22440 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74  loop. Label A, t
22450 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a  he target.    **
22460 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61 62   of the Gosub ab
22470 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68  ove, jumps to th
22480 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 69  e instruction ri
22490 67 68 74 20 61 66 74 65 72 20 74 68 65 20 47 6f  ght after the Go
224a0 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  to..    **.    *
224b0 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20  *          Null 
224c0 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
224d0 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68         # Zero th
224e0 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20  e rowset in reg 
224f0 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  1.    **        
22500 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20 20    Goto       B  
22510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
22520 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69  The loop is fini
22530 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  shed..    **.   
22540 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f   **       A: <lo
22550 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20 20  op body>        
22560 20 20 20 20 20 20 20 20 20 23 20 52 65 74 75 72           # Retur
22570 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76 65 72  n data, whatever
22580 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
22590 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20           Return 
225a0 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
225b0 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63 6b       # Jump back
225c0 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20 20   to the Gosub.  
225d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
225e0 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65 20    B: <after the 
225f0 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20  loop>.    **.   
22600 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61   */.    WhereCla
22610 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f  use *pOrWc;    /
22620 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20  * The OR-clause 
22630 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20  broken out into 
22640 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  subterms */.    
22650 53 72 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b  SrcList *pOrTab;
22660 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65         /* Shorte
22670 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f  ned table list o
22680 72 20 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65  r OR-clause gene
22690 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e  ration */.    In
226a0 64 65 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20  dex *pCov = 0;  
226b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
226c0 74 65 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e 67  tential covering
226d0 20 69 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29   index (or NULL)
226e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 76   */.    int iCov
226f0 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
22700 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72  ab++;  /* Cursor
22710 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 20   used for index 
22720 73 63 61 6e 73 20 28 69 66 20 61 6e 79 29 20 2a  scans (if any) *
22730 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65  /..    int regRe
22740 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
22750 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  >nMem;          
22760 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75 73 65   /* Register use
22770 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20  d with OP_Gosub 
22780 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f  */.    int regRo
22790 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20  wset = 0;       
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72   /* Register for
227c0 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a   RowSet object *
227d0 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  /.    int regRow
227e0 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  id = 0;         
227f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22800 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
22810 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20  ing rowid */.   
22820 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d   int iLoopBody =
22830 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
22840 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74  Label(v);  /* St
22850 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79  art of loop body
22860 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74   */.    int iRet
22870 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
22880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22890 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
228a0 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a  regReturn init *
228b0 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74  /.    int untest
228c0 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20  edTerms = 0;    
228d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65           /* Some
228e0 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c   terms not compl
228f0 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a  etely tested */.
22900 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
22910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22920 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
22930 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 45 78  ounter */.    Ex
22940 70 72 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30  pr *pAndExpr = 0
22950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22960 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28   /* An ".. AND (
22970 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e  ...)" expression
22980 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70 54 65 72   */.   .    pTer
22990 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  m = pLoop->aLTer
229a0 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  m[0];.    assert
229b0 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
229c0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
229d0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
229e0 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OR );.    assert
229f0 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
22a00 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  s & TERM_ORINFO)
22a10 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63  !=0 );.    pOrWc
22a20 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
22a30 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c  Info->wc;.    pL
22a40 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65  evel->op = OP_Re
22a50 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  turn;.    pLevel
22a60 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e  ->p1 = regReturn
22a70 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70  ;..    /* Set up
22a80 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
22a90 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e  n pOrTab contain
22aa0 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65  ing the table be
22ab0 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20  ing scanned.    
22ac0 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20  ** by this loop 
22ad0 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74  in the a[0] slot
22ae0 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64   and all notRead
22af0 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e  y tables in a[1.
22b00 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a  .] slots..    **
22b10 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68   This becomes th
22b20 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65  e SrcList in the
22b30 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20   recursive call 
22b40 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
22b50 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  egin()..    */. 
22b60 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
22b70 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20  Level>1 ){.     
22b80 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20   int nNotReady; 
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ba0 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
22bb0 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
22bc0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
22bd0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f   SrcList_item *o
22be0 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f  rigSrc;     /* O
22bf0 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20  riginal list of 
22c00 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
22c10 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e  nNotReady = pWIn
22c20 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65  fo->nLevel - iLe
22c30 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  vel - 1;.      p
22c40 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53  OrTab = sqlite3S
22c50 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c  tackAllocRaw(db,
22c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22c70 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
22c80 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e  eof(*pOrTab)+ nN
22c90 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70  otReady*sizeof(p
22ca0 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20  OrTab->a[0]));. 
22cb0 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d       if( pOrTab=
22cc0 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52  =0 ) return notR
22cd0 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54  eady;.      pOrT
22ce0 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38  ab->nAlloc = (u8
22cf0 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29  )(nNotReady + 1)
22d00 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
22d10 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e  nSrc = pOrTab->n
22d20 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d  Alloc;.      mem
22d30 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70  cpy(pOrTab->a, p
22d40 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28  TabItem, sizeof(
22d50 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20  *pTabItem));.   
22d60 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49     origSrc = pWI
22d70 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
22d80 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b  ;.      for(k=1;
22d90 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b   k<=nNotReady; k
22da0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ++){.        mem
22db0 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b  cpy(&pOrTab->a[k
22dc0 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76  ], &origSrc[pLev
22dd0 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69  el[k].iFrom], si
22de0 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b  zeof(pOrTab->a[k
22df0 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
22e00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f   }else{.      pO
22e10 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  rTab = pWInfo->p
22e20 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a  TabList;.    }..
22e30 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
22e40 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67  e the rowset reg
22e50 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ister to contain
22e60 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55   NULL. An SQL NU
22e70 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71  LL is .    ** eq
22e80 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65  uivalent to an e
22e90 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20  mpty rowset..   
22ea0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20   **.    ** Also 
22eb0 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65  initialize regRe
22ec0 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20  turn to contain 
22ed0 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
22ee0 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a  he instruction .
22ef0 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
22f00 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
22f10 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68   OP_Return at th
22f20 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
22f30 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a  loop. This.    *
22f40 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  * is required in
22f50 20 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c   a few obscure L
22f60 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77  EFT JOIN cases w
22f70 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d  here control jum
22f80 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  ps.    ** over t
22f90 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
22fa0 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  op into the body
22fb0 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20   of it. In this 
22fc0 63 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  case the .    **
22fd0 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73   correct respons
22fe0 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66  e for the end-of
22ff0 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20  -loop code (the 
23000 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f  OP_Return) is to
23010 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68   .    ** fall th
23020 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
23030 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a  t instruction, j
23040 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78  ust as an OP_Nex
23050 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a  t does if.    **
23060 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e   called on an un
23070 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73  initialized curs
23080 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
23090 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
230a0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
230b0 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30  UPLICATES_OK)==0
230c0 20 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f 77   ){.      regRow
230d0 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
230e0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52  nMem;.      regR
230f0 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
23100 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
23110 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23120 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
23130 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a  gRowset);.    }.
23140 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20 73      iRetInit = s
23150 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23160 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
23170 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a  0, regReturn);..
23180 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 72      /* If the or
23190 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61  iginal WHERE cla
231a0 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68 65 20  use is z of the 
231b0 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20 78 32  form:  (x1 OR x2
231c0 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20   OR ...) AND y. 
231d0 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65     ** Then for e
231e0 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20 65 76  very term xN, ev
231f0 61 6c 75 61 74 65 20 61 73 20 74 68 65 20 73 75  aluate as the su
23200 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20  bexpression: xN 
23210 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61  AND z.    ** Tha
23220 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69 6e 20  t way, terms in 
23230 79 20 74 68 61 74 20 61 72 65 20 66 61 63 74 6f  y that are facto
23240 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64 69 73  red into the dis
23250 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20  junction will.  
23260 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64 20 75    ** be picked u
23270 70 20 62 79 20 74 68 65 20 72 65 63 75 72 73 69  p by the recursi
23280 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ve calls to sqli
23290 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
232a0 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20  below..    **.  
232b0 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65    ** Actually, e
232c0 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f  ach subexpressio
232d0 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74  n is converted t
232e0 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77 68 65  o "xN AND w" whe
232f0 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a 20 74  re w is.    ** t
23300 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e 67 22  he "interesting"
23310 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65   terms of z - te
23320 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e 6f 74  rms that did not
23330 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68   originate in th
23340 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55  e.    ** ON or U
23350 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  SING clause of a
23360 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20   LEFT JOIN, and 
23370 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 75  terms that are u
23380 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a  sable as .    **
23390 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a   indices..    **
233a0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 70 74  .    ** This opt
233b0 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f 20 6f  imization also o
233c0 6e 6c 79 20 61 70 70 6c 69 65 73 20 69 66 20 74  nly applies if t
233d0 68 65 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20  he (x1 OR x2 OR 
233e0 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20 2a 2a  ...) term.    **
233f0 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
23400 64 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  d in the ON clau
23410 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
23420 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 69  N..    ** See ti
23430 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e  cket http://www.
23440 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69  sqlite.org/src/i
23450 6e 66 6f 2f 66 32 33 36 39 33 30 34 65 34 0a 20  nfo/f2369304e4. 
23460 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57     */.    if( pW
23470 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20  C->nTerm>1 ){.  
23480 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20      int iTerm;. 
23490 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d 3d 30       for(iTerm=0
234a0 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54 65  ; iTerm<pWC->nTe
234b0 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20  rm; iTerm++){.  
234c0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
234d0 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d  r = pWC->a[iTerm
234e0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
234f0 20 69 66 28 20 26 70 57 43 2d 3e 61 5b 69 54 65   if( &pWC->a[iTe
23500 72 6d 5d 20 3d 3d 20 70 54 65 72 6d 20 29 20 63  rm] == pTerm ) c
23510 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
23520 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
23530 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
23540 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74 69  romJoin) ) conti
23550 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
23560 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77   pWC->a[iTerm].w
23570 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 4f  tFlags & (TERM_O
23580 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74 69 6e 75  RINFO) ) continu
23590 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
235a0 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f  pWC->a[iTerm].eO
235b0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
235c0 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
235d0 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d  .        pExpr =
235e0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
235f0 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
23600 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20         pAndExpr 
23610 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
23620 28 64 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70  (db, pAndExpr, p
23630 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
23640 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70       if( pAndExp
23650 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e  r ){.        pAn
23660 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  dExpr = sqlite3P
23670 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
23680 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45 78 70 72  AND, 0, pAndExpr
23690 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
236a0 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d    }..    for(ii=
236b0 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65  0; ii<pOrWc->nTe
236c0 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  rm; ii++){.     
236d0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
236e0 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  erm = &pOrWc->a[
236f0 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ii];.      if( p
23700 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
23710 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72  or==iCur || (pOr
23720 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
23730 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a  & WO_AND)!=0 ){.
23740 20 20 20 20 20 20 20 20 57 68 65 72 65 49 6e 66          WhereInf
23750 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20  o *pSubWInfo;   
23760 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66         /* Info f
23770 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72  or single OR-ter
23780 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  m scan */.      
23790 20 20 45 78 70 72 20 2a 70 4f 72 45 78 70 72 20    Expr *pOrExpr 
237a0 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  = pOrTerm->pExpr
237b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
237c0 6e 64 45 78 70 72 20 26 26 20 21 45 78 70 72 48  ndExpr && !ExprH
237d0 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72 45 78  asProperty(pOrEx
237e0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
237f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41   ){.          pA
23800 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ndExpr->pLeft = 
23810 70 4f 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20  pOrExpr;.       
23820 20 20 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e     pOrExpr = pAn
23830 64 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  dExpr;.        }
23840 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
23850 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65   through table e
23860 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63  ntries that matc
23870 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20  h term pOrTerm. 
23880 2a 2f 0a 20 20 20 20 20 20 20 20 70 53 75 62 57  */.        pSubW
23890 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
238a0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
238b0 20 70 4f 72 54 61 62 2c 20 70 4f 72 45 78 70 72   pOrTab, pOrExpr
238c0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238e0 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
238f0 43 4c 4f 53 45 20 7c 20 57 48 45 52 45 5f 41 4e  CLOSE | WHERE_AN
23900 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20  D_ONLY |.       
23910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23920 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
23930 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41  LE | WHERE_ONETA
23940 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43 75  BLE_ONLY, iCovCu
23950 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
23960 72 74 28 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c  rt( pSubWInfo ||
23970 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
23980 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
23990 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  d );.        if(
239a0 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20   pSubWInfo ){.  
239b0 20 20 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f          WhereLoo
239c0 70 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a 20 20 20  p *pSubLoop;.   
239d0 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e         explainOn
239e0 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 20  eScan(.         
239f0 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4f 72       pParse, pOr
23a00 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d  Tab, &pSubWInfo-
23a10 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70  >a[0], iLevel, p
23a20 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a  Level->iFrom, 0.
23a30 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
23a40 20 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e         if( (pWIn
23a50 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
23a60 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45   WHERE_DUPLICATE
23a70 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  S_OK)==0 ){.    
23a80 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 74          int iSet
23a90 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e   = ((ii==pOrWc->
23aa0 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b  nTerm-1)?-1:ii);
23ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
23ac0 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   r;.            
23ad0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  r = sqlite3ExprC
23ae0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
23af0 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70  rse, pTabItem->p
23b00 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a  Tab, -1, iCur, .
23b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 20 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 69           regRowi
23b40 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  d, 0);.         
23b50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23b60 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f  dOp4Int(v, OP_Ro
23b70 77 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77  wSetTest, regRow
23b80 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  set,.           
23b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23bb0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
23bc0 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a 20 20 20  2, r, iSet);.   
23bd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23be0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23bf0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
23c00 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f  , regReturn, iLo
23c10 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20  opBody);..      
23c20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57      /* The pSubW
23c30 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
23c40 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  rms flag means t
23c50 68 61 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d  hat this OR term
23c60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
23c70 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d  ntained one or m
23c80 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f  ore AND term fro
23c90 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62  m a notReady tab
23ca0 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  le.  The.       
23cb0 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d     ** terms from
23cc0 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61   the notReady ta
23cd0 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ble could not be
23ce0 20 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c   tested and will
23cf0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  .          ** ne
23d00 65 64 20 74 6f 20 62 65 20 74 65 73 74 65 64 20  ed to be tested 
23d10 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20  later..         
23d20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
23d30 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74  ( pSubWInfo->unt
23d40 65 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74  estedTerms ) unt
23d50 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
23d60 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
23d70 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63   all of the OR-c
23d80 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61  onnected terms a
23d90 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  re optimized usi
23da0 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  ng the same.    
23db0 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20        ** index, 
23dc0 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 73  and the index is
23dd0 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68   opened using th
23de0 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75  e same cursor nu
23df0 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  mber.          *
23e00 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74  * by each call t
23e10 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
23e20 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68  gin() made by th
23e30 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a  is loop, it may.
23e40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
23e50 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
23e60 74 68 61 74 20 69 6e 64 65 78 20 61 73 20 61 20  that index as a 
23e70 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a  covering index..
23e80 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
23e90 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
23ea0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
23eb0 57 68 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f  WhereBegin() abo
23ec0 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61  ve resulted in a
23ed0 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20   scan that.     
23ee0 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20       ** uses an 
23ef0 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20  index, and this 
23f00 69 73 20 65 69 74 68 65 72 20 74 68 65 20 66 69  is either the fi
23f10 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  rst OR-connected
23f20 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
23f30 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20  ** processed or 
23f40 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 68 65  the index is the
23f50 20 73 61 6d 65 20 61 73 20 74 68 61 74 20 75 73   same as that us
23f60 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f  ed by all previo
23f70 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
23f80 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20  terms, set pCov 
23f90 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  to the candidate
23fa0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
23fb0 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
23fc0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43  .          ** pC
23fd0 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e  ov to NULL to in
23fe0 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63  dicate that no c
23ff0 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e  andidate coverin
24000 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20  g index will .  
24010 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76          ** be av
24020 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20  ailable..       
24030 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
24040 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57  pSubLoop = pSubW
24050 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
24060 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
24070 65 72 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e  ert( (pSubLoop->
24080 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
24090 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29  AUTO_INDEX)==0 )
240a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
240b0 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61  (pSubLoop->wsFla
240c0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
240d0 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)!=0.         
240e0 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70    && (ii==0 || p
240f0 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  SubLoop->u.btree
24100 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20  .pIndex==pCov). 
24110 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
24120 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24130 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  pSubWInfo->a[0].
24140 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72  iIdxCur==iCovCur
24150 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
24160 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d  pCov = pSubLoop-
24170 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
24180 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
24190 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
241a0 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ov = 0;.        
241b0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
241c0 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f  * Finish the loo
241d0 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  p through table 
241e0 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74  entries that mat
241f0 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e  ch term pOrTerm.
24200 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
24210 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53  lite3WhereEnd(pS
24220 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  ubWInfo);.      
24230 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24240 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
24250 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a  pCovidx = pCov;.
24260 20 20 20 20 69 66 28 20 70 43 6f 76 20 29 20 70      if( pCov ) p
24270 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
24280 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66   iCovCur;.    if
24290 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
242a0 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c      pAndExpr->pL
242b0 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  eft = 0;.      s
242c0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
242d0 28 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a  (db, pAndExpr);.
242e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
242f0 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
24300 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74   iRetInit, sqlit
24310 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
24320 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  r(v));.    sqlit
24330 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
24340 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
24350 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
24360 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
24370 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f  olveLabel(v, iLo
24380 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66  opBody);..    if
24390 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
243a0 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74 61 63  >1 ) sqlite3Stac
243b0 6b 46 72 65 65 28 64 62 2c 20 70 4f 72 54 61 62  kFree(db, pOrTab
243c0 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65  );.    if( !unte
243d0 73 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61  stedTerms ) disa
243e0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
243f0 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a  pTerm);.  }else.
24400 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
24410 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
24420 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20  ATION */..  {.  
24430 20 20 2f 2a 20 43 61 73 65 20 36 3a 20 20 54 68    /* Case 6:  Th
24440 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65  ere is no usable
24450 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74   index.  We must
24460 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20   do a complete. 
24470 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73     **          s
24480 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  can of the entir
24490 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
244a0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
244b0 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20   u8 aStep[] = { 
244c0 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76  OP_Next, OP_Prev
244d0 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
244e0 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d  onst u8 aStart[]
244f0 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20   = { OP_Rewind, 
24500 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61  OP_Last };.    a
24510 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c  ssert( bRev==0 |
24520 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20  | bRev==1 );.   
24530 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53   pLevel->op = aS
24540 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70  tep[bRev];.    p
24550 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
24560 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
24570 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
24580 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61  beAddOp2(v, aSta
24590 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20  rt[bRev], iCur, 
245a0 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c  addrBrk);.    pL
245b0 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54  evel->p5 = SQLIT
245c0 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
245d0 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a  LSCAN_STEP;.  }.
245e0 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64  .  /* Insert cod
245f0 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20  e to test every 
24600 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68  subexpression th
24610 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  at can be comple
24620 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74  tely.  ** comput
24630 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 75 72  ed using the cur
24640 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c  rent set of tabl
24650 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  es..  */.  for(p
24660 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70  Term=pWC->a, j=p
24670 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20  WC->nTerm; j>0; 
24680 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j--, pTerm++){. 
24690 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
246a0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
246b0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
246c0 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
246d0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
246e0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
246f0 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28  CODED );.    if(
24700 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
24710 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
24720 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
24730 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
24740 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
24750 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  l & pLevel->notR
24760 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20  eady)!=0 ){.    
24770 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e    testcase( pWIn
24780 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
24790 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  s==0.           
247a0 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
247b0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
247c0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
247d0 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57  )!=0 );.      pW
247e0 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
247f0 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63  rms = 1;.      c
24800 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
24810 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70     pE = pTerm->p
24820 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
24830 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pE!=0 );.    i
24840 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
24850 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73  Join && !ExprHas
24860 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
24870 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
24880 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
24890 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
248a0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
248b0 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20  , pE, addrCont, 
248c0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
248d0 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77  L);.    pTerm->w
248e0 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
248f0 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ODED;.  }..  /* 
24900 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74  Insert code to t
24910 65 73 74 20 66 6f 72 20 69 6d 70 6c 69 65 64 20  est for implied 
24920 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 61 73 65  constraints base
24930 64 20 6f 6e 20 74 72 61 6e 73 69 74 69 76 69 74  d on transitivit
24940 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d  y.  ** of the "=
24950 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  =" operator..  *
24960 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20  *.  ** Example: 
24970 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
24980 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 22 74 31  use contains "t1
24990 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20 22 74 32  .a=t2.b" and "t2
249a0 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64  .b=123".  ** and
249b0 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 74   we are coding t
249c0 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74  he t1 loop and t
249d0 68 65 20 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e  he t2 loop has n
249e0 6f 74 20 79 65 74 20 63 6f 64 65 64 2c 0a 20 20  ot yet coded,.  
249f0 2a 2a 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f  ** then we canno
24a00 74 20 75 73 65 20 74 68 65 20 22 74 31 2e 61 3d  t use the "t1.a=
24a10 74 32 2e 62 22 20 63 6f 6e 73 74 72 61 69 6e 74  t2.b" constraint
24a20 2c 20 62 75 74 20 77 65 20 63 61 6e 20 63 6f 64  , but we can cod
24a30 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69  e.  ** the impli
24a40 65 64 20 22 74 31 2e 61 3d 31 32 33 22 20 63 6f  ed "t1.a=123" co
24a50 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20  nstraint..  */. 
24a60 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
24a70 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, j=pWC->nTerm;
24a80 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d   j>0; j--, pTerm
24a90 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
24aa0 45 2c 20 2a 70 45 41 6c 74 3b 0a 20 20 20 20 57  E, *pEAlt;.    W
24ab0 68 65 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a  hereTerm *pAlt;.
24ac0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
24ad0 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
24ae0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
24af0 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
24b00 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
24b10 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55  perator!=(WO_EQU
24b20 49 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74  IV|WO_EQ) ) cont
24b30 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
24b40 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
24b50 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
24b60 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
24b70 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63 6f  ->iLeftJoin ) co
24b80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d  ntinue;.    pE =
24b90 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
24ba0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
24bb0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
24bc0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a  EP_FromJoin) );.
24bd0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
24be0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
24bf0 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61  & pLevel->notRea
24c00 64 79 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 41  dy)!=0 );.    pA
24c10 6c 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  lt = findTerm(pW
24c20 43 2c 20 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e  C, iCur, pTerm->
24c30 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f  u.leftColumn, no
24c40 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  tReady, WO_EQ|WO
24c50 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  _IN, 0);.    if(
24c60 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69   pAlt==0 ) conti
24c70 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 41 6c  nue;.    if( pAl
24c80 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  t->wtFlags & (TE
24c90 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
24ca0 69 6e 75 65 3b 0a 20 20 20 20 74 65 73 74 63 61  inue;.    testca
24cb0 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61  se( pAlt->eOpera
24cc0 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
24cd0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 6c     testcase( pAl
24ce0 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
24cf0 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 56 64 62 65  O_IN );.    Vdbe
24d00 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
24d10 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76  "begin transitiv
24d20 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b  e constraint"));
24d30 0a 20 20 20 20 70 45 41 6c 74 20 3d 20 73 71 6c  .    pEAlt = sql
24d40 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61  ite3StackAllocRa
24d50 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45  w(db, sizeof(*pE
24d60 41 6c 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70  Alt));.    if( p
24d70 45 41 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  EAlt ){.      *p
24d80 45 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45  EAlt = *pAlt->pE
24d90 78 70 72 3b 0a 20 20 20 20 20 20 70 45 41 6c 74  xpr;.      pEAlt
24da0 2d 3e 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c  ->pLeft = pE->pL
24db0 65 66 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eft;.      sqlit
24dc0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
24dd0 61 72 73 65 2c 20 70 45 41 6c 74 2c 20 61 64 64  arse, pEAlt, add
24de0 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
24df0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
24e00 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65   sqlite3StackFre
24e10 65 28 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20  e(db, pEAlt);.  
24e20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f    }.  }..  /* Fo
24e30 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  r a LEFT OUTER J
24e40 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  OIN, generate co
24e50 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63  de that will rec
24e60 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
24e70 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20  t.  ** at least 
24e80 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
24e90 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d  ight table has m
24ea0 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20  atched the left 
24eb0 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20  table.  .  */.  
24ec0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
24ed0 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65  tJoin ){.    pLe
24ee0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d  vel->addrFirst =
24ef0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
24f00 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
24f10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24f20 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
24f30 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   1, pLevel->iLef
24f40 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
24f50 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63  Comment((v, "rec
24f60 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69  ord LEFT JOIN hi
24f70 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t"));.    sqlite
24f80 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
24f90 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72  pParse);.    for
24fa0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
24fb0 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d  =0; j<pWC->nTerm
24fc0 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
24fd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24fe0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
24ff0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
25000 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
25010 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
25020 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
25030 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
25040 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
25050 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
25060 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
25070 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
25080 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
25090 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
250a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
250b0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
250c0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b  untestedTerms );
250d0 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
250e0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
250f0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
25100 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73  pExpr );.      s
25110 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
25120 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  e(pParse, pTerm-
25130 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74  >pExpr, addrCont
25140 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
25150 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72  ULL);.      pTer
25160 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
25170 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
25180 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
25190 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
251a0 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  se, iReleaseReg)
251b0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 65 76  ;..  return pLev
251c0 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a  el->notReady;.}.
251d0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
251e0 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
251f0 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c 6f   Print a WhereLo
25200 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64 65  op object for de
25210 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73  bugging purposes
25220 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25230 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57  whereLoopPrint(W
25240 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 53 72 63  hereLoop *p, Src
25250 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 29 7b  List *pTabList){
25260 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70  .  int nb = 1+(p
25270 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29  TabList->nSrc+7)
25280 2f 38 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  /8;.  struct Src
25290 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
252a0 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b   = pTabList->a +
252b0 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c   p->iTab;.  Tabl
252c0 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  e *pTab = pItem-
252d0 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  >pTab;.  sqlite3
252e0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 63 25  DebugPrintf("%c%
252f0 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78  2d.%0*llx.%0*llx
25300 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20  ", p->cId,.     
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25320 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e  p->iTab, nb, p->
25330 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d  maskSelf, nb, p-
25340 3e 70 72 65 72 65 71 29 3b 0a 20 20 73 71 6c 69  >prereq);.  sqli
25350 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25360 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20 20   %12s",.        
25370 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
25380 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74  em->zAlias ? pIt
25390 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61  em->zAlias : pTa
253a0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
253b0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
253c0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
253d0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  E)==0 ){.    if(
253e0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
253f0 65 78 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ex ){.      cons
25400 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
25410 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
25420 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  x->zName;.      
25430 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 7a  if( zName==0 ) z
25440 4e 61 6d 65 20 3d 20 22 69 70 6b 22 3b 0a 20 20  Name = "ipk";.  
25450 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
25460 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
25470 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d  utoindex_", 17)=
25480 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
25490 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t i = sqlite3Str
254a0 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31  len30(zName) - 1
254b0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
254c0 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29   zName[i]!='_' )
254d0 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e   i--;.        zN
254e0 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20  ame += i;.      
254f0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
25500 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31  ebugPrintf(".%-1
25510 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20  6s %2d", zName, 
25520 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b  p->u.btree.nEq);
25530 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25540 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25550 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b  intf("%20s","");
25560 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
25570 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
25580 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69   if( p->u.vtab.i
25590 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a  dxStr ){.      z
255a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
255b0 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25  tf("(%d,\"%s\",%
255c0 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x)",.           
255d0 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
255e0 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
255f0 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74  .idxStr, p->u.vt
25600 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
25610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
25620 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
25630 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d  tf("(%d,%x)", p-
25640 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
25650 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
25660 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sk);.    }.    s
25670 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25680 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a  f(" %-19s", z);.
25690 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
256a0 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (z);.  }.  sqlit
256b0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
256c0 66 20 25 30 34 78 20 4e 20 25 64 22 2c 20 70 2d  f %04x N %d", p-
256d0 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54  >wsFlags, p->nLT
256e0 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  erm);.  sqlite3D
256f0 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73  ebugPrintf(" cos
25700 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70  t %d,%d,%d\n", p
25710 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
25720 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 7d 0a 23  n, p->nOut);.}.#
25730 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
25740 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79  vert bulk memory
25750 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57 68   into a valid Wh
25760 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e  ereLoop that can
25770 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f   be passed.** to
25780 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20   whereLoopClear 
25790 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73  harmlessly..*/.s
257a0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
257b0 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c 6f  LoopInit(WhereLo
257c0 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54  op *p){.  p->aLT
257d0 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53  erm = p->aLTermS
257e0 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72  pace;.  p->nLTer
257f0 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  m = 0;.  p->nLSl
25800 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70  ot = ArraySize(p
25810 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a  ->aLTermSpace);.
25820 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30    p->wsFlags = 0
25830 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
25840 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75   the WhereLoop.u
25850 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57   union.  Leave W
25860 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20  hereLoop.pLTerm 
25870 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  intact..*/.stati
25880 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
25890 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74  ClearUnion(sqlit
258a0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
258b0 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
258c0 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
258d0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57 48  _VIRTUALTABLE|WH
258e0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20  ERE_AUTO_INDEX) 
258f0 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77  ){.    if( (p->w
25900 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
25910 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
25920 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  && p->u.vtab.nee
25930 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73  dFree ){.      s
25940 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 75  qlite3_free(p->u
25950 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
25960 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e       p->u.vtab.n
25970 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  eedFree = 0;.   
25980 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
25990 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Str = 0;.    }el
259a0 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  se if( (p->wsFla
259b0 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
259c0 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d 3e  INDEX)!=0 && p->
259d0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d  u.btree.pIndex!=
259e0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
259f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
25a00 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
25a10 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20  zColAff);.      
25a20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
25a30 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
25a40 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75  dex);.      p->u
25a50 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
25a60 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
25a70 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
25a80 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79   internal memory
25a90 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72 65   used by a Where
25aa0 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
25ab0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
25ac0 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65  LoopClear(sqlite
25ad0 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
25ae0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61   *p){.  if( p->a
25af0 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d  LTerm!=p->aLTerm
25b00 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44  Space ) sqlite3D
25b10 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54  bFree(db, p->aLT
25b20 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  erm);.  whereLoo
25b30 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20  pClearUnion(db, 
25b40 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49  p);.  whereLoopI
25b50 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nit(p);.}../*.**
25b60 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65   Increase the me
25b70 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
25b80 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  for pLoop->aLTer
25b90 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61  m[] to be at lea
25ba0 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  st n..*/.static 
25bb0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  int whereLoopRes
25bc0 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ize(sqlite3 *db,
25bd0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69   WhereLoop *p, i
25be0 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65  nt n){.  WhereTe
25bf0 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66  rm **paNew;.  if
25c00 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29  ( p->nLSlot>=n )
25c10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25c20 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e  K;.  n = (n+7)&~
25c30 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c  7;.  paNew = sql
25c40 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
25c50 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  db, sizeof(p->aL
25c60 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69  Term[0])*n);.  i
25c70 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65  f( paNew==0 ) re
25c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
25c90 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65  M;.  memcpy(paNe
25ca0 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69  w, p->aLTerm, si
25cb0 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
25cc0 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20  ])*p->nLSlot);. 
25cd0 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
25ce0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
25cf0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
25d00 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
25d10 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e   p->aLTerm = paN
25d20 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20  ew;.  p->nLSlot 
25d30 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = n;.  return SQ
25d40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25d50 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65  * Transfer conte
25d60 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  nt from the seco
25d70 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68  nd pLoop into th
25d80 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  e first..*/.stat
25d90 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
25da0 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Xfer(sqlite3 *db
25db0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f  , WhereLoop *pTo
25dc0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72  , WhereLoop *pFr
25dd0 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  om){.  whereLoop
25de0 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70  ClearUnion(db, p
25df0 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65  To);.  if( where
25e00 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
25e10 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72  To, pFrom->nLTer
25e20 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  m) ){.    memset
25e30 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a  (&pTo->u, 0, siz
25e40 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20  eof(pTo->u));.  
25e50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25e60 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
25e70 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20  cpy(pTo, pFrom, 
25e80 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f  WHERE_LOOP_XFER_
25e90 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  SZ);.  memcpy(pT
25ea0 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d  o->aLTerm, pFrom
25eb0 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e  ->aLTerm, pTo->n
25ec0 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f  LTerm*sizeof(pTo
25ed0 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20  ->aLTerm[0]));. 
25ee0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c   if( pFrom->wsFl
25ef0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
25f00 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
25f10 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65  pFrom->u.vtab.ne
25f20 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  edFree = 0;.  }e
25f30 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e  lse if( (pFrom->
25f40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25f50 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
25f60 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62  {.    pFrom->u.b
25f70 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
25f80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
25f90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25fa0 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72 65  * Delete a Where
25fb0 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
25fc0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
25fd0 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74  LoopDelete(sqlit
25fe0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
25ff0 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f  p *p){.  whereLo
26000 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a  opClear(db, p);.
26010 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
26020 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
26030 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66   Free a WhereInf
26040 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73  o structure.*/.s
26050 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
26060 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33  InfoFree(sqlite3
26070 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20   *db, WhereInfo 
26080 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20  *pWInfo){.  if( 
26090 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29  ALWAYS(pWInfo) )
260a0 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
260b0 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e  eClear(&pWInfo->
260c0 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  sWC);.    while(
260d0 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
260e0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f  ){.      WhereLo
260f0 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  op *p = pWInfo->
26100 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57  pLoops;.      pW
26110 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70  Info->pLoops = p
26120 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
26130 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65     whereLoopDele
26140 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d  te(db, p);.    }
26150 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
26160 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
26170 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73    }.}../*.** Ins
26180 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61  ert or replace a
26190 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
261a0 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c   using the templ
261b0 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a  ate supplied..**
261c0 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20  .** An existing 
261d0 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20  WhereLoop entry 
261e0 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72 69  might be overwri
261f0 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20  tten if the new 
26200 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62  template.** is b
26210 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66 65  etter and has fe
26220 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
26230 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61  .  Or the templa
26240 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  te will be ignor
26250 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73  ed.** and no ins
26260 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69  ert will occur i
26270 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  f an existing Wh
26280 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65  ereLoop is faste
26290 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77  r and has.** few
262a0 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
262b0 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  than the templat
262c0 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 20  e.  Otherwise a 
262d0 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  new WhereLoop is
262e0 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64 20  .** added based 
262f0 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  on the template.
26300 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64  .**.** If pBuild
26310 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f  er->pOrSet is no
26320 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 6f  t NULL then we o
26330 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 6f  nly care about o
26340 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65  nly the.** prere
26350 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75  quisites and rRu
26360 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73  n and nOut costs
26370 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c   of the N best l
26380 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69  oops.  That.** i
26390 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61  nformation is ga
263a0 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42  thered in the pB
263b0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f  uilder->pOrSet o
263c0 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65  bject.  This spe
263d0 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69  cial.** processi
263e0 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
263f0 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75  only for OR clau
26400 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
26410 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75  *.** When accumu
26420 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  lating multiple 
26430 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69  loops (when pBui
26440 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
26450 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c  NULL) we.** stil
26460 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  l might overwrit
26470 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20  e similar loops 
26480 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d  with the new tem
26490 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  plate if the.** 
264a0 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74  template is bett
264b0 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62  er.  Loops may b
264c0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
264d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   the following .
264e0 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72  ** conditions ar
264f0 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  e met:.**.**    
26500 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (1)  They have t
26510 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a  he same iTab..**
26520 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61      (2)  They ha
26530 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72  ve the same iSor
26540 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20  tIdx..**    (3) 
26550 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
26560 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20  s same or fewer 
26570 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
26580 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
26590 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68  op.**    (4)  Th
265a0 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74  e template has t
265b0 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
265c0 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63   cost than the c
265d0 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20  urrent loop.**  
265e0 20 20 28 35 29 20 20 54 68 65 20 74 65 6d 70 6c    (5)  The templ
265f0 61 74 65 20 75 73 65 73 20 6d 6f 72 65 20 74 65  ate uses more te
26600 72 6d 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  rms of the same 
26610 69 6e 64 65 78 20 62 75 74 20 68 61 73 20 6e 6f  index but has no
26620 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 20   additional.**  
26630 20 20 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63         dependenc
26640 69 65 73 20 20 20 20 20 20 20 20 20 20 0a 2a 2f  ies          .*/
26650 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
26660 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72  eLoopInsert(Wher
26670 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
26680 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f  uilder, WhereLoo
26690 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20  p *pTemplate){. 
266a0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
266b0 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65 78 74 20  rev, *p, *pNext 
266c0 3d 20 30 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f  = 0;.  WhereInfo
266d0 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
266e0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73  der->pWInfo;.  s
266f0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
26700 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
26710 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64  ..  /* If pBuild
26720 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65  er->pOrSet is de
26730 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79  fined, then only
26740 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   keep track of t
26750 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e  he costs.  ** an
26760 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a  d prereqs..  */.
26770 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
26780 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23 69 66  pOrSet!=0 ){.#if
26790 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
267a0 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20 3d 20  LED.    u16 n = 
267b0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
267c0 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ->n;.    int x =
267d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65 72  .#endif.    wher
267e0 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64  eOrInsert(pBuild
267f0 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d  er->pOrSet, pTem
26800 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70  plate->prereq, p
26810 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a  Template->rRun,.
26820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26840 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e      pTemplate->n
26850 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54  Out);.#if WHERET
26860 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
26870 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
26880 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
26890 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
268a0 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f  ugPrintf(x?"   o
268b0 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d  r-%d:  ":"   or-
268c0 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20  X:  ", n);.     
268d0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
268e0 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66  pTemplate, pWInf
268f0 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  o->pTabList);.  
26900 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
26910 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26920 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
26930 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
26940 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 6f  g WhereLoop to o
26950 76 65 72 77 72 69 74 65 2c 20 6f 72 20 77 68 69  verwrite, or whi
26960 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a 20 70 72  ch takes.  ** pr
26970 69 6f 72 69 74 79 20 6f 76 65 72 20 70 54 65 6d  iority over pTem
26980 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f  plate..  */.  fo
26990 72 28 70 70 50 72 65 76 3d 26 70 57 49 6e 66 6f  r(ppPrev=&pWInfo
269a0 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70 50  ->pLoops, p=*ppP
269b0 72 65 76 3b 20 70 3b 20 70 70 50 72 65 76 3d 26  rev; p; ppPrev=&
269c0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d  p->pNextLoop, p=
269d0 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66  *ppPrev){.    if
269e0 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70  ( p->iTab!=pTemp
269f0 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d  late->iTab || p-
26a00 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70  >iSortIdx!=pTemp
26a10 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29  late->iSortIdx )
26a20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69  {.      /* If ei
26a30 74 68 65 72 20 74 68 65 20 69 54 61 62 20 6f 72  ther the iTab or
26a40 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73   iSortIdx values
26a50 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f   for two WhereLo
26a60 6f 70 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  op are different
26a70 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
26a80 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20  hose WhereLoops 
26a90 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69  need to be consi
26aa0 64 65 72 65 64 20 73 65 70 61 72 61 74 65 6c 79  dered separately
26ab0 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20  .  Neither is.  
26ac0 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61      ** a candida
26ad0 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68  te to replace th
26ae0 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  e other. */.    
26af0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
26b00 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20  }.    /* In the 
26b10 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
26b20 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74  tation, the rSet
26b30 75 70 20 76 61 6c 75 65 20 69 73 20 65 69 74 68  up value is eith
26b40 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f  er zero.    ** o
26b50 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75  r the cost of bu
26b60 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61  ilding an automa
26b70 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e  tic index (NlogN
26b80 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a  ) and the NlogN.
26b90 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61      ** is the sa
26ba0 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c  me for compatibl
26bb0 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f  e WhereLoops. */
26bc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
26bd0 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65  rSetup==0 || pTe
26be0 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d  mplate->rSetup==
26bf0 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0 .             
26c00 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70      || p->rSetup
26c10 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  ==pTemplate->rSe
26c20 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77  tup );..    /* w
26c30 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
26c40 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61  () always genera
26c50 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20  tes and inserts 
26c60 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
26c70 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  dex.    ** case 
26c80 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f  first.  Hence co
26c90 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61  mpatible candida
26ca0 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65  te WhereLoops ne
26cb0 76 65 72 20 68 61 76 65 20 61 20 6c 61 72 67 65  ver have a large
26cc0 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e  r.    ** rSetup.
26cd0 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50   Call this SETUP
26ce0 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20  -INVARIANT */.  
26cf0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65    assert( p->rSe
26d00 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup>=pTemplate->
26d10 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 69  rSetup );..    i
26d20 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
26d30 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
26d40 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20 20  q)==p->prereq.  
26d50 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c     && p->rSetup<
26d60 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
26d70 75 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52  up.     && p->rR
26d80 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un<=pTemplate->r
26d90 52 75 6e 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e  Run.     && p->n
26da0 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Out<=pTemplate->
26db0 6e 4f 75 74 0a 20 20 20 20 29 7b 0a 20 20 20 20  nOut.    ){.    
26dc0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
26dd0 20 74 61 6b 65 6e 20 77 68 65 6e 20 70 20 69 73   taken when p is
26de0 20 65 71 75 61 6c 20 6f 72 20 62 65 74 74 65 72   equal or better
26df0 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 20   than pTemplate 
26e00 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  in .      ** all
26e10 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64 65 6e   of (1) dependen
26e20 63 69 65 73 20 28 32 29 20 73 65 74 75 70 2d 63  cies (2) setup-c
26e30 6f 73 74 2c 20 28 33 29 20 72 75 6e 2d 63 6f 73  ost, (3) run-cos
26e40 74 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  t, and.      ** 
26e50 28 34 29 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  (4) number of ou
26e60 74 70 75 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20  tput rows. */.  
26e70 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
26e80 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65  Setup==pTemplate
26e90 2d 3e 72 53 65 74 75 70 20 29 3b 0a 20 20 20 20  ->rSetup );.    
26ea0 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 3d    if( p->prereq=
26eb0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72  =pTemplate->prer
26ec0 65 71 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e  eq.       && p->
26ed0 6e 4c 54 65 72 6d 3c 70 54 65 6d 70 6c 61 74 65  nLTerm<pTemplate
26ee0 2d 3e 6e 4c 54 65 72 6d 0a 20 20 20 20 20 20 20  ->nLTerm.       
26ef0 26 26 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  && (p->wsFlags &
26f00 20 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c   pTemplate->wsFl
26f10 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
26f20 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26  XED)!=0.       &
26f30 26 20 28 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  & (p->u.btree.pI
26f40 6e 64 65 78 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  ndex==pTemplate-
26f50 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 0a  >u.btree.pIndex.
26f60 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 65            || pTe
26f70 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2b 70 2d 3e  mplate->rRun+p->
26f80 6e 4c 54 65 72 6d 3c 3d 70 2d 3e 72 52 75 6e 2b  nLTerm<=p->rRun+
26f90 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72  pTemplate->nLTer
26fa0 6d 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  m).      ){.    
26fb0 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65      /* Overwrite
26fc0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
26fd0 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 73  reLoop with an s
26fe0 69 6d 69 6c 61 72 20 6f 6e 65 20 74 68 61 74 20  imilar one that 
26ff0 75 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  uses.        ** 
27000 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68  more terms of th
27010 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  e index */.     
27020 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
27030 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  extLoop;.       
27040 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
27050 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
27060 70 54 65 6d 70 6c 61 74 65 20 69 73 20 6e 6f 74  pTemplate is not
27070 20 68 65 6c 70 66 75 6c 2e 0a 20 20 20 20 20 20   helpful..      
27080 20 20 2a 2a 20 52 65 74 75 72 6e 20 77 69 74 68    ** Return with
27090 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 6f 72 20  out changing or 
270a0 61 64 64 69 6e 67 20 61 6e 79 74 68 69 6e 67 20  adding anything 
270b0 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  */.        goto 
270c0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f  whereLoopInsert_
270d0 6e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  noop;.      }.  
270e0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e    }.    if( (p->
270f0 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
27100 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65  te->prereq)==pTe
27110 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20  mplate->prereq. 
27120 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d      && p->rRun>=
27130 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a  pTemplate->rRun.
27140 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e       && p->nOut>
27150 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74  =pTemplate->nOut
27160 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
27170 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78   Overwrite an ex
27180 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
27190 20 77 69 74 68 20 61 20 62 65 74 74 65 72 20 6f   with a better o
271a0 6e 65 3a 20 6f 6e 65 20 74 68 61 74 20 69 73 0a  ne: one that is.
271b0 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20        ** better 
271c0 61 74 20 6f 6e 65 20 6f 66 20 28 31 29 20 64 65  at one of (1) de
271d0 70 65 6e 64 65 6e 63 69 65 73 2c 20 28 32 29 20  pendencies, (2) 
271e0 73 65 74 75 70 2d 63 6f 73 74 2c 20 28 33 29 20  setup-cost, (3) 
271f0 72 75 6e 2d 63 6f 73 74 0a 20 20 20 20 20 20 2a  run-cost.      *
27200 2a 20 6f 72 20 28 34 29 20 6e 75 6d 62 65 72 20  * or (4) number 
27210 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2c 20  of output rows, 
27220 61 6e 64 20 69 73 20 6e 6f 20 77 6f 72 73 65 20  and is no worse 
27230 69 6e 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 0a  in any of those.
27240 20 20 20 20 20 20 2a 2a 20 63 61 74 65 67 6f 72        ** categor
27250 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ies. */.      as
27260 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e  sert( p->rSetup>
27270 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
27280 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49  up ); /* SETUP-I
27290 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a  NVARIANT above *
272a0 2f 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  /.      pNext = 
272b0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
272c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
272d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
272e0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
272f0 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  t it means that 
27300 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c  either p[] shoul
27310 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  d be overwritten
27320 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70  .  ** with pTemp
27330 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78  late[] if p[] ex
27340 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e  ists, or if p==N
27350 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ULL then allocat
27360 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65  e a new.  ** Whe
27370 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72  reLoop and inser
27380 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57  t it..  */.#if W
27390 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
273a0 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  D.  if( sqlite3W
273b0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
273c0 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20  ){.    if( p!=0 
273d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
273e0 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73  DebugPrintf("ins
273f0 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20  -del:  ");.     
27400 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
27410 70 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  p, pWInfo->pTabL
27420 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
27430 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
27440 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22 29  tf("ins-new:  ")
27450 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50  ;.    whereLoopP
27460 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
27470 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
27480 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
27490 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
274a0 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
274b0 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
274c0 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20  f(WhereLoop));. 
274d0 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
274e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
274f0 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  M;.    whereLoop
27500 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 77  Init(p);.  }.  w
27510 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c  hereLoopXfer(db,
27520 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a   p, pTemplate);.
27530 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d    p->pNextLoop =
27540 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70 50 72 65   pNext;.  *ppPre
27550 76 20 3d 20 70 3b 0a 20 20 69 66 28 20 28 70 2d  v = p;.  if( (p-
27560 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27570 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
27580 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  0 ){.    Index *
27590 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74  pIndex = p->u.bt
275a0 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
275b0 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49  if( pIndex && pI
275c0 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b  ndex->tnum==0 ){
275d0 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
275e0 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
275f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
27600 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
27610 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
27620 68 65 20 69 6e 73 65 72 74 20 69 73 20 61 20 6e  he insert is a n
27630 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65 4c 6f 6f  o-op */.whereLoo
27640 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a 0a 23 69  pInsert_noop:.#i
27650 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
27660 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
27670 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
27680 78 38 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  x8 ){.    sqlite
27690 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
276a0 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20 20  s-noop: ");.    
276b0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
276c0 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f  Template, pWInfo
276d0 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 7d  ->pTabList);.  }
276e0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
276f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 7d 0a   SQLITE_OK;  .}.
27700 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
27710 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74  e WhereLoop.nOut
27720 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72 64 20   value downward 
27730 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
27740 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57  erms of the.** W
27750 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
27760 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 6c   reference the l
27770 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20 61 72  oop but which ar
27780 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20 61 6e  e not used by an
27790 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  .** index..**.**
277a0 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
277b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
277c0 74 68 65 20 66 69 72 73 74 20 65 78 74 72 61 20  the first extra 
277d0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
277e0 6d 20 72 65 64 75 63 65 73 0a 2a 2a 20 74 68 65  m reduces.** the
277f0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
27800 74 20 72 6f 77 73 20 62 79 20 61 20 66 61 63 74  t rows by a fact
27810 6f 72 20 6f 66 20 31 30 20 61 6e 64 20 65 61 63  or of 10 and eac
27820 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 74 65 72  h additional ter
27830 6d 0a 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65  m.** reduces the
27840 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
27850 74 20 72 6f 77 73 20 62 79 20 73 71 72 74 28 32  t rows by sqrt(2
27860 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
27870 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75  d whereLoopOutpu
27880 74 41 64 6a 75 73 74 28 57 68 65 72 65 43 6c 61  tAdjust(WhereCla
27890 75 73 65 20 2a 70 57 43 2c 20 57 68 65 72 65 4c  use *pWC, WhereL
278a0 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 69 6e 74 20  oop *pLoop, int 
278b0 69 43 75 72 29 7b 0a 20 20 57 68 65 72 65 54 65  iCur){.  WhereTe
278c0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 42 69 74  rm *pTerm;.  Bit
278d0 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20  mask notAllowed 
278e0 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65  = ~(pLoop->prere
278f0 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  q|pLoop->maskSel
27900 66 29 3b 0a 20 20 69 6e 74 20 78 20 3d 20 30 3b  f);.  int x = 0;
27910 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
27920 20 21 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e   !OptimizationEn
27930 61 62 6c 65 64 28 70 57 43 2d 3e 70 57 49 6e 66  abled(pWC->pWInf
27940 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  o->pParse->db, S
27950 51 4c 49 54 45 5f 41 64 6a 75 73 74 4f 75 74 45  QLITE_AdjustOutE
27960 73 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  st) ){.    retur
27970 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70  n;.  }.  for(i=p
27980 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d  WC->nTerm, pTerm
27990 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  =pWC->a; i>0; i-
279a0 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
279b0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46   if( (pTerm->wtF
279c0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
279d0 55 41 4c 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  UAL)!=0 ) contin
279e0 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
279f0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
27a00 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
27a10 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
27a20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
27a30 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41  prereqAll & notA
27a40 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63 6f 6e  llowed)!=0 ) con
27a50 74 69 6e 75 65 3b 0a 20 20 20 20 78 20 2b 3d 20  tinue;.    x += 
27a60 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
27a70 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 4c  ;.  }.  for(i=pL
27a80 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69  oop->nLTerm-1; i
27a90 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 78  >=0; i--){.    x
27aa0 20 2d 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72   -= pLoop->aLTer
27ab0 6d 5b 69 5d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  m[i]->truthProb;
27ac0 0a 20 20 7d 0a 20 20 69 66 28 20 78 3c 30 20 29  .  }.  if( x<0 )
27ad0 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20   pLoop->nOut += 
27ae0 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68  x;.}../*.** We h
27af0 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68  ave so far match
27b00 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  ed pBuilder->pNe
27b10 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74  w->u.btree.nEq t
27b20 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65  erms of the inde
27b30 78 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72 79  x pIndex..** Try
27b40 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f   to match one mo
27b50 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72  re..**.** If pPr
27b60 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68  obe->tnum==0, th
27b70 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20  at means pIndex 
27b80 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20  is a fake index 
27b90 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  used for the.** 
27ba0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
27bb0 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  KEY..*/.static i
27bc0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
27bd0 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65  treeIndex(.  Whe
27be0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
27bf0 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20  Builder,     /* 
27c00 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61  The WhereLoop fa
27c10 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63  ctory */.  struc
27c20 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
27c30 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52  pSrc,      /* FR
27c40 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62  OM clause term b
27c50 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
27c60 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
27c70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27c80 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f     /* An index o
27c90 6e 20 70 53 72 63 20 2a 2f 0a 20 20 57 68 65 72  n pSrc */.  Wher
27ca0 65 43 6f 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20  eCost nInMul    
27cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
27cc0 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65  og(Number of ite
27cd0 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49  rations due to I
27ce0 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  N) */.){.  Where
27cf0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
27d00 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
27d10 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
27d20 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
27d30 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
27d40 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20  pWInfo->pParse; 
27d50 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
27d60 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
27d70 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
27d80 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f  rse->db;       /
27d90 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
27da0 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e  ction malloc con
27db0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
27dc0 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
27dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
27de0 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
27df0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
27e00 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  on */.  WhereTer
27e10 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
27e20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65          /* A Whe
27e30 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e  reTerm under con
27e40 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  sideration */.  
27e50 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20  int opMask;     
27e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e70 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f  /* Valid operato
27e80 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  rs for constrain
27e90 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61  ts */.  WhereSca
27ea0 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20  n scan;         
27eb0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
27ec0 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65  tor for WHERE te
27ed0 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rms */.  Bitmask
27ee0 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20   saved_prereq;  
27ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
27f00 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
27f10 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20  ew->prereq */.  
27f20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  u16 saved_nLTerm
27f30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27f40 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
27f50 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  e of pNew->nLTer
27f60 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  m */.  int saved
27f70 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  _nEq;           
27f80 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
27f90 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
27fa0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f  ->u.btree.nEq */
27fb0 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46  .  u32 saved_wsF
27fc0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
27fd0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
27fe0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73  alue of pNew->ws
27ff0 46 6c 61 67 73 20 2a 2f 0a 20 20 57 68 65 72 65  Flags */.  Where
28000 43 6f 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b  Cost saved_nOut;
28010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
28020 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
28030 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20  pNew->nOut */.  
28040 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
28050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28060 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
28070 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
28080 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ble */.  int rc 
28090 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
280a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
280b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65  rn code */.  Whe
280c0 72 65 43 6f 73 74 20 6e 52 6f 77 45 73 74 3b 20  reCost nRowEst; 
280d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
280e0 45 73 74 69 6d 61 74 65 64 20 69 6e 64 65 78 20  Estimated index 
280f0 73 65 6c 65 63 74 69 76 69 74 79 20 2a 2f 0a 20  selectivity */. 
28100 20 57 68 65 72 65 43 6f 73 74 20 72 4c 6f 67 53   WhereCost rLogS
28110 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
28120 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
28130 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20   table size */. 
28140 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70   WhereTerm *pTop
28150 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b   = 0, *pBtm = 0;
28160 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74   /* Top and bott
28170 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  om range constra
28180 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20  ints */..  pNew 
28190 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
281a0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
281b0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
281c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
281d0 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
281e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
281f0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
28200 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
28210 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
28220 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
28230 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e  )==0 );.  if( pN
28240 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
28250 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
28260 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
28270 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c  _LT|WO_LE;.  }el
28280 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74  se if( pProbe->t
28290 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d  num<=0 || (pSrc-
282a0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  >jointype & JT_L
282b0 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f  EFT)!=0 ){.    o
282c0 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  pMask = WO_EQ|WO
282d0 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _IN|WO_GT|WO_GE|
282e0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
282f0 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  else{.    opMask
28300 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
28310 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57  O_ISNULL|WO_GT|W
28320 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
28330 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f  ;.  }.  if( pPro
28340 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  be->bUnordered )
28350 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f   opMask &= ~(WO_
28360 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
28370 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74  O_LE);..  assert
28380 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
28390 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f  nEq<=pProbe->nCo
283a0 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 70 4e  lumn );.  if( pN
283b0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
283c0 3c 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  < pProbe->nColum
283d0 6e 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  n ){.    iCol = 
283e0 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
283f0 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  [pNew->u.btree.n
28400 45 71 5d 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74  Eq];.    nRowEst
28410 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70 50 72   = whereCost(pPr
28420 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4e  obe->aiRowEst[pN
28430 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
28440 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f  1]);.    if( nRo
28450 77 45 73 74 3d 3d 30 20 26 26 20 70 50 72 6f 62  wEst==0 && pProb
28460 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e  e->onError==OE_N
28470 6f 6e 65 20 29 20 6e 52 6f 77 45 73 74 20 3d 20  one ) nRowEst = 
28480 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
28490 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 6e  iCol = -1;.    n
284a0 52 6f 77 45 73 74 20 3d 20 30 3b 0a 20 20 7d 0a  RowEst = 0;.  }.
284b0 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53    pTerm = whereS
284c0 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
284d0 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53  Builder->pWC, pS
284e0 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f  rc->iCursor, iCo
284f0 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
28500 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73             opMas
28510 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 73 61  k, pProbe);.  sa
28520 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e  ved_nEq = pNew->
28530 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
28540 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e  aved_nLTerm = pN
28550 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61  ew->nLTerm;.  sa
28560 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e  ved_wsFlags = pN
28570 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73  ew->wsFlags;.  s
28580 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e  aved_prereq = pN
28590 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61  ew->prereq;.  sa
285a0 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d  ved_nOut = pNew-
285b0 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72  >nOut;.  pNew->r
285c0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f  Setup = 0;.  rLo
285d0 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 77  gSize = estLog(w
285e0 68 65 72 65 43 6f 73 74 28 70 50 72 6f 62 65 2d  hereCost(pProbe-
285f0 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29 29 3b 0a  >aiRowEst[0]));.
28600 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
28610 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d  TE_OK && pTerm!=
28620 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  0; pTerm = where
28630 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29  ScanNext(&scan))
28640 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20  {.    int nIn = 
28650 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
28660 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
28670 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20 6e  _STAT4.    int n
28680 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c  RecValid = pBuil
28690 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a  der->nRecValid;.
286a0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
286b0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
286c0 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28  ==WO_ISNULL || (
286d0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54  pTerm->wtFlags&T
286e0 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20  ERM_VNULL)!=0). 
286f0 20 20 20 20 26 26 20 28 69 43 6f 6c 3c 30 20 7c      && (iCol<0 |
28700 7c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43  | pSrc->pTab->aC
28710 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c  ol[iCol].notNull
28720 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63  ).    ){.      c
28730 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f  ontinue; /* igno
28740 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c  re IS [NOT] NULL
28750 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
28760 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
28770 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
28780 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
28790 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73  ight & pNew->mas
287a0 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65  kSelf ) continue
287b0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
287c0 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64  New->nOut==saved
287d0 5f 6e 4f 75 74 20 29 3b 0a 0a 20 20 20 20 70 4e  _nOut );..    pN
287e0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
287f0 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20  ved_wsFlags;.   
28800 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
28810 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
28820 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
28830 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b   = saved_nLTerm;
28840 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f  .    if( whereLo
28850 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65  opResize(db, pNe
28860 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  w, pNew->nLTerm+
28870 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f  1) ) break; /* O
28880 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  OM */.    pNew->
28890 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
288a0 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm++] = pTerm;.
288b0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
288c0 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72 65 71   = (saved_prereq
288d0 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
288e0 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e  Right) & ~pNew->
288f0 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4e  maskSelf;.    pN
28900 65 77 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53  ew->rRun = rLogS
28910 69 7a 65 3b 20 2f 2a 20 42 61 73 65 6c 69 6e 65  ize; /* Baseline
28920 20 63 6f 73 74 20 69 73 20 6c 6f 67 32 28 4e 29   cost is log2(N)
28930 2e 20 20 41 64 6a 75 73 74 6d 65 6e 74 73 20 62  .  Adjustments b
28940 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69 66 28 20  elow */.    if( 
28950 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
28960 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
28970 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
28980 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
28990 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
289a0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
289b0 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  N_IN;.      if( 
289c0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
289d0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
289e0 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
289f0 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
28a00 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a   ...)":  TUNING:
28a10 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
28a20 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
28a30 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b         nIn = 46;
28a40 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 77 68    assert( 46==wh
28a50 65 72 65 43 6f 73 74 28 32 35 29 20 29 3b 0a 20  ereCost(25) );. 
28a60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
28a70 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
28a80 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
28a90 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
28aa0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
28ab0 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
28ac0 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20  , ...)" */.     
28ad0 20 20 20 6e 49 6e 20 3d 20 77 68 65 72 65 43 6f     nIn = whereCo
28ae0 73 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  st(pExpr->x.pLis
28af0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
28b00 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72   }.      pNew->r
28b10 52 75 6e 20 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20  Run += nIn;.    
28b20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
28b30 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65  nEq++;.      pNe
28b40 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73  w->nOut = nRowEs
28b50 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e  t + nInMul + nIn
28b60 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
28b70 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
28b80 20 26 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20   & (WO_EQ) ){.  
28b90 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4e 65      assert( (pNe
28ba0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  w->wsFlags & (WH
28bb0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c  ERE_COLUMN_NULL|
28bc0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
28bd0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
28be0 20 20 20 20 20 20 20 7c 7c 20 6e 49 6e 4d 75 6c         || nInMul
28bf0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
28c00 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
28c10 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20  ERE_COLUMN_EQ;. 
28c20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
28c30 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 72   .       || (pPr
28c40 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  obe->onError!=OE
28c50 5f 4e 6f 6e 65 20 26 26 20 6e 49 6e 4d 75 6c 3d  _None && nInMul=
28c60 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
28c70 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
28c80 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq==pProbe->nCol
28c90 75 6d 6e 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a  umn-1).      ){.
28ca0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28cb0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
28cc0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
28cd0 29 3d 3d 30 20 7c 7c 20 69 43 6f 6c 3c 30 20 29  )==0 || iCol<0 )
28ce0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
28cf0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
28d00 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d  _ONEROW;.      }
28d10 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
28d20 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20  tree.nEq++;.    
28d30 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
28d40 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 3b  RowEst + nInMul;
28d50 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
28d60 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
28d70 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b  & (WO_ISNULL) ){
28d80 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
28d90 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
28da0 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  LUMN_NULL;.     
28db0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
28dc0 45 71 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a 20 54  Eq++;.      /* T
28dd0 55 4e 49 4e 47 3a 20 49 53 20 4e 55 4c 4c 20 73  UNING: IS NULL s
28de0 65 6c 65 63 74 73 20 32 20 72 6f 77 73 20 2a 2f  elects 2 rows */
28df0 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 31 30 3b  .      nIn = 10;
28e00 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 77 68    assert( 10==wh
28e10 65 72 65 43 6f 73 74 28 32 29 20 29 3b 0a 20 20  ereCost(2) );.  
28e20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
28e30 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75   nRowEst + nInMu
28e40 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c  l + nIn;.    }el
28e50 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f  se if( pTerm->eO
28e60 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54  perator & (WO_GT
28e70 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20  |WO_GE) ){.     
28e80 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
28e90 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
28ea0 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
28eb0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
28ec0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20  perator & WO_GE 
28ed0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
28ee0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
28ef0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
28f00 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
28f10 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d      pBtm = pTerm
28f20 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30  ;.      pTop = 0
28f30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28f40 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
28f50 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
28f60 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20  O_LT|WO_LE) );. 
28f70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
28f80 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
28f90 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20  & WO_LT );.     
28fa0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
28fb0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
28fc0 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  _LE );.      pNe
28fd0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
28fe0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
28ff0 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
29000 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70  ;.      pTop = p
29010 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d  Term;.      pBtm
29020 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67   = (pNew->wsFlag
29030 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
29040 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20  MIT)!=0 ?.      
29050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
29060 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
29070 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b  ->nLTerm-2] : 0;
29080 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
29090 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
290a0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
290b0 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  E ){.      /* Ad
290c0 6a 75 73 74 20 6e 4f 75 74 20 61 6e 64 20 72 52  just nOut and rR
290d0 75 6e 20 66 6f 72 20 53 54 41 54 33 20 72 61 6e  un for STAT3 ran
290e0 67 65 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20  ge values */.   
290f0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
29100 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
29110 74 20 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65  t );.      where
29120 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61  RangeScanEst(pPa
29130 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
29140 42 74 6d 2c 20 70 54 6f 70 2c 20 26 70 4e 65 77  Btm, pTop, &pNew
29150 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 23  ->nOut);.    }.#
29160 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
29170 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
29180 54 34 0a 20 20 20 20 69 66 28 20 6e 49 6e 4d 75  T4.    if( nInMu
29190 6c 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  l==0 .     && pP
291a0 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20  robe->nSample . 
291b0 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62      && pNew->u.b
291c0 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65  tree.nEq<=pProbe
291d0 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20  ->nSampleCol.   
291e0 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
291f0 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
29200 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 20 20  ITE_Stat3) .    
29210 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
29220 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
29230 78 70 72 3b 0a 20 20 20 20 20 20 74 52 6f 77 63  xpr;.      tRowc
29240 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20  nt nOut = 0;.   
29250 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
29260 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
29270 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30  Q|WO_ISNULL))!=0
29280 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
29290 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
292a0 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
292b0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
292c0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
292d0 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
292e0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
292f0 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
29300 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
29310 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  der, pExpr->pRig
29320 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20  ht, &nOut);.    
29330 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
29340 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
29350 57 4f 5f 49 4e 29 0a 20 20 20 20 20 20 20 20 20  WO_IN).         
29360 20 20 20 20 26 26 20 20 21 45 78 70 72 48 61 73      &&  !ExprHas
29370 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
29380 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 20 29  EP_xIsSelect)  )
29390 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
293a0 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50  hereInScanEst(pP
293b0 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
293c0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
293d0 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a  &nOut);.      }.
293e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f        assert( nO
293f0 75 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  ut==0 || rc==SQL
29400 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
29410 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20  if( nOut ){.    
29420 20 20 20 20 6e 4f 75 74 20 3d 20 77 68 65 72 65      nOut = where
29430 43 6f 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20  Cost(nOut);.    
29440 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
29450 20 4d 49 4e 28 6e 4f 75 74 2c 20 73 61 76 65 64   MIN(nOut, saved
29460 5f 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a  _nOut);.      }.
29470 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
29480 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c   if( (pNew->wsFl
29490 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58  ags & (WHERE_IDX
294a0 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29  _ONLY|WHERE_IPK)
294b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
294c0 20 45 61 63 68 20 72 6f 77 20 69 6e 76 6f 6c 76   Each row involv
294d0 65 73 20 61 20 73 74 65 70 20 6f 66 20 74 68 65  es a step of the
294e0 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 61 20 62   index, then a b
294f0 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66 0a  inary search of.
29500 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 69        ** the mai
29510 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  n table */.     
29520 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 20 77   pNew->rRun =  w
29530 68 65 72 65 43 6f 73 74 41 64 64 28 70 4e 65 77  hereCostAdd(pNew
29540 2d 3e 72 52 75 6e 2c 20 72 4c 6f 67 53 69 7a 65  ->rRun, rLogSize
29550 3e 32 37 20 3f 20 72 4c 6f 67 53 69 7a 65 2d 31  >27 ? rLogSize-1
29560 37 20 3a 20 31 30 29 3b 0a 20 20 20 20 7d 0a 20  7 : 10);.    }. 
29570 20 20 20 2f 2a 20 53 74 65 70 20 63 6f 73 74 20     /* Step cost 
29580 66 6f 72 20 65 61 63 68 20 6f 75 74 70 75 74 20  for each output 
29590 72 6f 77 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  row */.    pNew-
295a0 3e 72 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73  >rRun = whereCos
295b0 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
295c0 20 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20   pNew->nOut);.  
295d0 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
295e0 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72  tAdjust(pBuilder
295f0 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20 70 53 72  ->pWC, pNew, pSr
29600 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  c->iCursor);.   
29610 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
29620 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
29630 70 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 28  pNew);.    if( (
29640 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
29650 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
29660 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77  ==0.     && pNew
29670 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 28 70  ->u.btree.nEq<(p
29680 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b  Probe->nColumn +
29690 20 28 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 21   (pProbe->zName!
296a0 3d 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  =0)).    ){.    
296b0 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
296c0 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
296d0 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
296e0 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20   nInMul+nIn);.  
296f0 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f    }.    pNew->nO
29700 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
29710 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
29720 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
29730 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65  TAT4.    pBuilde
29740 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
29750 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66  RecValid;.#endif
29760 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65  .  }.  pNew->pre
29770 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72  req = saved_prer
29780 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  eq;.  pNew->u.bt
29790 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
297a0 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46  nEq;.  pNew->wsF
297b0 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
297c0 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f  lags;.  pNew->nO
297d0 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
297e0 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
297f0 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a  = saved_nLTerm;.
29800 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29810 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75  /*.** Return Tru
29820 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
29830 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20  ble that pIndex 
29840 6d 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20  might be useful 
29850 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69  in.** implementi
29860 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ng the ORDER BY 
29870 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64  clause in pBuild
29880 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
29890 20 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64   False if pBuild
298a0 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  er does not cont
298b0 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ain an ORDER BY 
298c0 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20  clause or.** if 
298d0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
298e0 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65  for pIndex to be
298f0 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65   useful in imple
29900 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20  menting that.** 
29910 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
29920 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
29930 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
29940 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72  hOrderBy(.  Wher
29950 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
29960 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20  uilder,.  Index 
29970 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69  *pIndex,.  int i
29980 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72  Cursor.){.  Expr
29990 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74  List *pOB;.  int
299a0 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20   ii, jj;..  if( 
299b0 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
299c0 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
299d0 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69   if( (pOB = pBui
299e0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f  lder->pWInfo->pO
299f0 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74  rderBy)==0 ) ret
29a00 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d  urn 0;.  for(ii=
29a10 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72  0; ii<pOB->nExpr
29a20 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  ; ii++){.    Exp
29a30 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74  r *pExpr = sqlit
29a40 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
29a50 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78  e(pOB->a[ii].pEx
29a60 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  pr);.    if( pEx
29a70 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
29a80 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
29a90 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
29aa0 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  ble==iCursor ){.
29ab0 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
29ac0 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  jj<pIndex->nColu
29ad0 6d 6e 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  mn; jj++){.     
29ae0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
29af0 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61  olumn==pIndex->a
29b00 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65  iColumn[jj] ) re
29b10 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
29b20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
29b30 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
29b40 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b 20  eturn a bitmask 
29b50 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61 74  where 1s indicat
29b60 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  e that the corre
29b70 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
29b80 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
29b90 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e  is used by an in
29ba0 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66  dex.  Only the f
29bb0 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20  irst 63 columns 
29bc0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  are considered..
29bd0 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
29be0 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78  k columnsInIndex
29bf0 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
29c00 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a   Bitmask m = 0;.
29c10 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
29c20 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31  =pIdx->nColumn-1
29c30 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
29c40 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e    int x = pIdx->
29c50 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
29c60 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b   assert( x>=0 );
29c70 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78  .    testcase( x
29c80 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 74  ==BMS-1 );.    t
29c90 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
29ca0 32 20 29 3b 0a 20 20 20 20 69 66 28 20 78 3c 42  2 );.    if( x<B
29cb0 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b  MS-1 ) m |= MASK
29cc0 42 49 54 28 78 29 3b 0a 20 20 7d 0a 20 20 72 65  BIT(x);.  }.  re
29cd0 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68  turn m;.}../* Ch
29ce0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20  eck to see if a 
29cf0 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69  partial index wi
29d00 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68 65  th pPartIndexWhe
29d10 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  re can be used.*
29d20 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * in the current
29d30 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20   query.  Return 
29d40 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20 62  true if it can b
29d50 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e  e and false if n
29d60 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
29d70 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61 72  t whereUsablePar
29d80 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54  tialIndex(int iT
29d90 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20  ab, WhereClause 
29da0 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65  *pWC, Expr *pWhe
29db0 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  re){.  int i;.  
29dc0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
29dd0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65  ;.  for(i=0, pTe
29de0 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
29df0 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
29e00 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
29e10 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
29e20 65 73 45 78 70 72 28 70 54 65 72 6d 2d 3e 70 45  esExpr(pTerm->pE
29e30 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61  xpr, pWhere, iTa
29e40 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
29e50 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
29e60 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
29e70 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
29e80 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
29e90 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
29ea0 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65   where the table
29eb0 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20  .** is idenfied 
29ec0 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  by pBuilder->pNe
29ed0 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
29ee0 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
29ef0 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d  ed to be.** a b-
29f00 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  tree table, not 
29f10 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
29f20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
29f30 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
29f40 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
29f50 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
29f60 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
29f70 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
29f80 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20   Bitmask mExtra 
29f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29fa0 45 78 74 72 61 20 70 72 65 72 65 71 75 65 73 69  Extra prerequesi
29fb0 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68  tes for using th
29fc0 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  is table */.){. 
29fd0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
29fe0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fo;          /* 
29ff0 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63  WHERE analysis c
2a000 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
2a010 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20  x *pProbe;      
2a020 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
2a030 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75  dex we are evalu
2a040 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78  ating */.  Index
2a050 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20   sPk;           
2a060 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65         /* A fake
2a070 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   index object fo
2a080 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  r the primary ke
2a090 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  y */.  tRowcnt a
2a0a0 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20  iRowEstPk[2];   
2a0b0 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 45     /* The aiRowE
2a0c0 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  st[] value for t
2a0d0 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
2a0e0 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50 6b    int aiColumnPk
2a0f0 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a   = -1;        /*
2a100 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76   The aColumn[] v
2a110 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
2a120 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c   index */.  SrcL
2a130 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
2a140 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
2a150 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
2a160 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2a170 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54  tem *pSrc;  /* T
2a180 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62  he FROM clause b
2a190 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64  tree term to add
2a1a0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
2a1b0 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
2a1c0 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68    /* Template Wh
2a1d0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
2a1e0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2a1f0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2a200 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2a210 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78  /.  int iSortIdx
2a220 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2a230 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20  /* Index number 
2a240 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20  */.  int b;     
2a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a260 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61   /* A boolean va
2a270 6c 75 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  lue */.  WhereCo
2a280 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20  st rSize;       
2a290 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f       /* number o
2a2a0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
2a2b0 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ble */.  WhereCo
2a2c0 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20  st rLogSize;    
2a2d0 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
2a2e0 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
2a2f0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
2a300 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  able */.  WhereC
2a310 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
2a320 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
2a330 73 65 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  sed WHERE clause
2a340 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
2a350 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
2a360 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
2a370 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
2a380 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
2a390 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53  ->pTabList;.  pS
2a3a0 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  rc = pTabList->a
2a3b0 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
2a3c0 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
2a3d0 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28 20  >pWC;.  assert( 
2a3e0 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d  !IsVirtual(pSrc-
2a3f0 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28  >pTab) );..  if(
2a400 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b   pSrc->pIndex ){
2a410 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58  .    /* An INDEX
2a420 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70 65  ED BY clause spe
2a430 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63 75  cifies a particu
2a440 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65  lar index to use
2a450 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20 3d   */.    pProbe =
2a460 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20   pSrc->pIndex;. 
2a470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
2a480 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58  here is no INDEX
2a490 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43  ED BY clause.  C
2a4a0 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64  reate a fake Ind
2a4b0 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63  ex object in loc
2a4c0 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
2a4d0 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73  le sPk to repres
2a4e0 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72  ent the rowid pr
2a4f0 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e  imary key index.
2a500 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20    Make this.    
2a510 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68  ** fake index th
2a520 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61  e first in a cha
2a530 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65  in of Index obje
2a540 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20  cts with all of 
2a550 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20  the real.    ** 
2a560 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f  indices to follo
2a570 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  w */.    Index *
2a580 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
2a590 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2a5a0 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65  t of real indice
2a5b0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s on the table *
2a5c0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50  /.    memset(&sP
2a5d0 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64  k, 0, sizeof(Ind
2a5e0 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43  ex));.    sPk.nC
2a5f0 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73  olumn = 1;.    s
2a600 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61  Pk.aiColumn = &a
2a610 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73  iColumnPk;.    s
2a620 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69  Pk.aiRowEst = ai
2a630 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50  RowEstPk;.    sP
2a640 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52  k.onError = OE_R
2a650 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e  eplace;.    sPk.
2a660 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
2a670 54 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Tab;.    aiRowEs
2a680 74 50 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70  tPk[0] = pSrc->p
2a690 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20  Tab->nRowEst;.  
2a6a0 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20    aiRowEstPk[1] 
2a6b0 3d 20 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20  = 1;.    pFirst 
2a6c0 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
2a6d0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53  ndex;.    if( pS
2a6e0 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  rc->notIndexed==
2a6f0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
2a700 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f  e real indices o
2a710 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  f the table are 
2a720 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20  only considered 
2a730 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  if the.      ** 
2a740 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c  NOT INDEXED qual
2a750 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64  ifier is omitted
2a760 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63   from the FROM c
2a770 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73  lause */.      s
2a780 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73  Pk.pNext = pFirs
2a790 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72  t;.    }.    pPr
2a7a0 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a  obe = &sPk;.  }.
2a7b0 20 20 72 53 69 7a 65 20 3d 20 77 68 65 72 65 43    rSize = whereC
2a7c0 6f 73 74 28 70 53 72 63 2d 3e 70 54 61 62 2d 3e  ost(pSrc->pTab->
2a7d0 6e 52 6f 77 45 73 74 29 3b 0a 20 20 72 4c 6f 67  nRowEst);.  rLog
2a7e0 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53  Size = estLog(rS
2a7f0 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ize);..#ifndef S
2a800 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
2a810 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20  ATIC_INDEX.  /* 
2a820 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  Automatic indexe
2a830 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69  s */.  if( !pBui
2a840 6c 64 65 72 2d 3e 70 4f 72 53 65 74 0a 20 20 20  lder->pOrSet.   
2a850 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  && (pWInfo->pPar
2a860 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
2a870 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
2a880 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d  )!=0.   && pSrc-
2a890 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26  >pIndex==0.   &&
2a8a0 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75   !pSrc->viaCorou
2a8b0 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53 72 63  tine.   && !pSrc
2a8c0 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20 20  ->notIndexed.   
2a8d0 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72  && !pSrc->isCorr
2a8e0 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20 20 20 20  elated.  ){.    
2a8f0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f  /* Generate auto
2a900 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70  -index WhereLoop
2a910 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  s */.    WhereTe
2a920 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57  rm *pTerm;.    W
2a930 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
2a940 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
2a950 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28  >nTerm;.    for(
2a960 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63  pTerm=pWC->a; rc
2a970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2a980 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
2a990 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
2a9a0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
2a9b0 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
2a9c0 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
2a9d0 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43  .      if( termC
2a9e0 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
2a9f0 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a  rm, pSrc, 0) ){.
2aa00 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
2aa10 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
2aa20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
2aa30 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
2aa40 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
2aa50 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
2aa60 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
2aa70 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
2aa80 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f      /* TUNING: O
2aa90 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72  ne-time cost for
2aaa0 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61   computing the a
2aab0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
2aac0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70  s.        ** app
2aad0 72 6f 78 69 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c  roximately 7*N*l
2aae0 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
2aaf0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2ab00 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20  rows in.        
2ab10 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
2ab20 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a 20  ng indexed. */. 
2ab30 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65         pNew->rSe
2ab40 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b  tup = rLogSize +
2ab50 20 72 53 69 7a 65 20 2b 20 32 38 3b 20 20 61 73   rSize + 28;  as
2ab60 73 65 72 74 28 20 32 38 3d 3d 77 68 65 72 65 43  sert( 28==whereC
2ab70 6f 73 74 28 37 29 20 29 3b 0a 20 20 20 20 20 20  ost(7) );.      
2ab80 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63    /* TUNING: Eac
2ab90 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79  h index lookup y
2aba0 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e  ields 20 rows in
2abb0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
2abc0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  s.        ** is 
2abd0 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73  more than the us
2abe0 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20  ual guess of 10 
2abf0 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68  rows, since we h
2ac00 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20  ave no way.     
2ac10 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e     ** of knownin
2ac20 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
2ac30 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
2ac40 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
2ac50 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
2ac60 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
2ac70 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
2ac80 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
2ac90 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
2aca0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
2acb0 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
2acc0 77 68 65 72 65 43 6f 73 74 28 32 30 29 20 29 3b  whereCost(20) );
2acd0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
2ace0 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 41  Run = whereCostA
2acf0 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77  dd(rLogSize,pNew
2ad00 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  ->nOut);.       
2ad10 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2ad20 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
2ad30 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  X;.        pNew-
2ad40 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
2ad50 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
2ad60 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
2ad70 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2ad80 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2ad90 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
2ada0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
2adb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2adc0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
2add0 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
2ade0 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f  all indices.  */
2adf0 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
2ae00 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65  ITE_OK && pProbe
2ae10 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d  ; pProbe=pProbe-
2ae20 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78  >pNext, iSortIdx
2ae30 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72  ++){.    if( pPr
2ae40 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
2ae50 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77  re!=0.     && !w
2ae60 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
2ae70 6c 49 6e 64 65 78 28 70 4e 65 77 2d 3e 69 54 61  lIndex(pNew->iTa
2ae80 62 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e  b, pWC, pProbe->
2ae90 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29  pPartIdxWhere) )
2aea0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
2aeb0 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e  ;  /* Partial in
2aec0 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74  dex inappropriat
2aed0 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  e for this query
2aee0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e   */.    }.    pN
2aef0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
2af00 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 0;.    pNew->n
2af10 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70  LTerm = 0;.    p
2af20 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
2af30 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65  0;.    pNew->rSe
2af40 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  tup = 0;.    pNe
2af50 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74  w->prereq = mExt
2af60 72 61 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ra;.    pNew->nO
2af70 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
2af80 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
2af90 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20  ndex = pProbe;. 
2afa0 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68     b = indexMigh
2afb0 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79  tHelpWithOrderBy
2afc0 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62  (pBuilder, pProb
2afd0 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e, pSrc->iCursor
2afe0 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e  );.    /* The ON
2aff0 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c  EPASS_DESIRED fl
2b000 61 67 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73  ags never occurs
2b010 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f   together with O
2b020 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61  RDER BY */.    a
2b030 73 73 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e  ssert( (pWInfo->
2b040 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2b050 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2b060 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29  ED)==0 || b==0 )
2b070 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65  ;.    if( pProbe
2b080 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20  ->tnum<=0 ){.   
2b090 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72     /* Integer pr
2b0a0 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20  imary key index 
2b0b0 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  */.      pNew->w
2b0c0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49  sFlags = WHERE_I
2b0d0 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75  PK;..      /* Fu
2b0e0 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f  ll table scan */
2b0f0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  .      pNew->iSo
2b100 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72  rtIdx = b ? iSor
2b110 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20  tIdx : 0;.      
2b120 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
2b130 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63  of full table sc
2b140 61 6e 20 69 73 20 33 2a 28 4e 20 2b 20 6c 6f 67  an is 3*(N + log
2b150 32 28 4e 29 29 2e 0a 20 20 20 20 20 20 2a 2a 20  2(N))..      ** 
2b160 20 2b 20 20 54 68 65 20 65 78 74 72 61 20 33 20   +  The extra 3 
2b170 66 61 63 74 6f 72 20 69 73 20 74 6f 20 65 6e 63  factor is to enc
2b180 6f 75 72 61 67 65 20 74 68 65 20 75 73 65 20 6f  ourage the use o
2b190 66 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75 70  f indexed lookup
2b1a0 73 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f  s.      **     o
2b1b0 76 65 72 20 66 75 6c 6c 20 73 63 61 6e 73 2e 20  ver full scans. 
2b1c0 20 41 20 73 6d 61 6c 6c 65 72 20 63 6f 6e 73 74   A smaller const
2b1d0 61 6e 74 20 32 20 69 73 20 75 73 65 64 20 66 6f  ant 2 is used fo
2b1e0 72 20 63 6f 76 65 72 69 6e 67 0a 20 20 20 20 20  r covering.     
2b1f0 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 73 63   **     index sc
2b200 61 6e 73 20 73 6f 20 74 68 61 74 20 61 20 63 6f  ans so that a co
2b210 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61  vering index sca
2b220 6e 20 77 69 6c 6c 20 62 65 20 66 61 76 6f 72 65  n will be favore
2b230 64 20 6f 76 65 72 0a 20 20 20 20 20 20 2a 2a 20  d over.      ** 
2b240 20 20 20 20 61 20 74 61 62 6c 65 20 73 63 61 6e      a table scan
2b250 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  . */.      pNew-
2b260 3e 72 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73  >rRun = whereCos
2b270 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53  tAdd(rSize,rLogS
2b280 69 7a 65 29 20 2b 20 31 36 3b 0a 20 20 20 20 20  ize) + 16;.     
2b290 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
2b2a0 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77  Adjust(pWC, pNew
2b2b0 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29  , pSrc->iCursor)
2b2c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
2b2d0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2b2e0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2b2f0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2b300 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66   rSize;.      if
2b310 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
2b320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
2b330 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d  itmask m = pSrc-
2b340 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75  >colUsed & ~colu
2b350 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62  mnsInIndex(pProb
2b360 65 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  e);.      pNew->
2b370 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29  wsFlags = (m==0)
2b380 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   ? (WHERE_IDX_ON
2b390 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  LY|WHERE_INDEXED
2b3a0 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45  ) : WHERE_INDEXE
2b3b0 44 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c  D;..      /* Ful
2b3c0 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78  l scan via index
2b3d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a   */.      if( b.
2b3e0 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30         || ( m==0
2b3f0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
2b400 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  obe->bUnordered=
2b410 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
2b420 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2b430 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2b440 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20  SS_DESIRED)==0. 
2b450 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
2b460 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2b470 55 73 65 43 69 73 0a 20 20 20 20 20 20 20 20 20  UseCis.         
2b480 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
2b490 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70  nabled(pWInfo->p
2b4a0 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
2b4b0 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a  E_CoverIdxScan).
2b4c0 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20            ).    
2b4d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65    ){.        pNe
2b4e0 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
2b4f0 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
2b500 20 20 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30          if( m==0
2b510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2b520 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
2b530 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
2b540 78 20 73 63 61 6e 20 69 73 20 32 2a 28 4e 20 2b  x scan is 2*(N +
2b550 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20 20   log2(N))..     
2b560 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20       **  +  The 
2b570 65 78 74 72 61 20 32 20 66 61 63 74 6f 72 20 69  extra 2 factor i
2b580 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20 74  s to encourage t
2b590 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78 65  he use of indexe
2b5a0 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20  d lookups.      
2b5b0 20 20 20 20 2a 2a 20 20 20 20 20 6f 76 65 72 20      **     over 
2b5c0 69 6e 64 65 78 20 73 63 61 6e 73 2e 20 20 41 20  index scans.  A 
2b5d0 74 61 62 6c 65 20 73 63 61 6e 20 75 73 65 73 20  table scan uses 
2b5e0 61 20 66 61 63 74 6f 72 20 6f 66 20 33 20 73 6f  a factor of 3 so
2b5f0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
2b600 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 73 63 61  **     index sca
2b610 6e 73 20 61 72 65 20 66 61 76 6f 72 65 64 20 6f  ns are favored o
2b620 76 65 72 20 74 61 62 6c 65 20 73 63 61 6e 73 2e  ver table scans.
2b630 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 2b  .          **  +
2b640 20 20 49 66 20 74 68 69 73 20 63 6f 76 65 72 69    If this coveri
2b650 6e 67 20 69 6e 64 65 78 20 6d 69 67 68 74 20 61  ng index might a
2b660 6c 73 6f 20 68 65 6c 70 20 73 61 74 69 73 66 79  lso help satisfy
2b670 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
2b680 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 63          **     c
2b690 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 65 20  lause, then the 
2b6a0 63 6f 73 74 20 69 73 20 66 75 64 67 65 64 20 64  cost is fudged d
2b6b0 6f 77 6e 20 73 6c 69 67 68 74 6c 79 20 73 6f 20  own slightly so 
2b6c0 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20 20  that this.      
2b6d0 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78      **     index
2b6e0 20 69 73 20 66 61 76 6f 72 65 64 20 61 62 6f 76   is favored abov
2b6f0 65 20 6f 74 68 65 72 20 69 6e 64 69 63 65 73 20  e other indices 
2b700 74 68 61 74 20 68 61 76 65 20 6e 6f 20 68 6f 70  that have no hop
2b710 65 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a  e of.          *
2b720 2a 20 20 20 20 20 68 65 6c 70 69 6e 67 20 77 69  *     helping wi
2b730 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e  th the ORDER BY.
2b740 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 4e   */.          pN
2b750 65 77 2d 3e 72 52 75 6e 20 3d 20 31 30 20 2b 20  ew->rRun = 10 + 
2b760 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 53 69  whereCostAdd(rSi
2b770 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2d 20 62  ze,rLogSize) - b
2b780 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2b790 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2b7a0 74 28 20 62 21 3d 30 20 29 3b 20 0a 20 20 20 20  t( b!=0 ); .    
2b7b0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
2b7c0 20 43 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e   Cost of scannin
2b7d0 67 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  g a non-covering
2b7e0 20 69 6e 64 65 78 20 69 73 20 28 4e 2b 31 29 2a   index is (N+1)*
2b7f0 6c 6f 67 32 28 4e 29 0a 20 20 20 20 20 20 20 20  log2(N).        
2b800 20 20 2a 2a 20 77 68 69 63 68 20 77 65 20 77 69    ** which we wi
2b810 6c 6c 20 73 69 6d 70 6c 69 66 79 20 74 6f 20 6a  ll simplify to j
2b820 75 73 74 20 4e 2a 6c 6f 67 32 28 4e 29 20 2a 2f  ust N*log2(N) */
2b830 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
2b840 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20  >rRun = rSize + 
2b850 72 4c 6f 67 53 69 7a 65 3b 0a 20 20 20 20 20 20  rLogSize;.      
2b860 20 20 7d 0a 20 20 20 20 20 20 20 20 77 68 65 72    }.        wher
2b870 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
2b880 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 70 53 72  t(pWC, pNew, pSr
2b890 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  c->iCursor);.   
2b8a0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2b8b0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
2b8c0 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
2b8d0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
2b8e0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
2b8f0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
2b900 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2b910 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2b920 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
2b930 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
2b940 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66  robe, 0);.#ifdef
2b950 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
2b960 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
2b970 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72    sqlite3Stat4Pr
2b980 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72  obeFree(pBuilder
2b990 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75  ->pRec);.    pBu
2b9a0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
2b9b0 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64   = 0;.    pBuild
2b9c0 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65  er->pRec = 0;.#e
2b9d0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
2b9e0 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44  there was an IND
2b9f0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
2ba00 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f  then only that o
2ba10 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ne index is.    
2ba20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a  ** considered. *
2ba30 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  /.    if( pSrc->
2ba40 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a  pIndex ) break;.
2ba50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2ba60 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
2ba70 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2ba80 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ABLE./*.** Add a
2ba90 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
2baa0 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ects for a table
2bab0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65   of the join ide
2bac0 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42  ntified by.** pB
2bad0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
2bae0 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  ab.  That table 
2baf0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2bb00 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61   be a virtual ta
2bb10 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
2bb20 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  nt whereLoopAddV
2bb30 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c  irtual(.  WhereL
2bb40 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
2bb50 6c 64 65 72 20 20 20 2f 2a 20 57 48 45 52 45 20  lder   /* WHERE 
2bb60 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
2bb70 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  on */.){.  Where
2bb80 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
2bb90 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
2bba0 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78   analysis contex
2bbb0 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
2bbc0 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
2bbd0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
2bbe0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
2bbf0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2bc00 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2bc10 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2bc20 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
2bc30 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b  List_item *pSrc;
2bc40 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
2bc50 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
2bc60 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20  arch */.  Table 
2bc70 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
2bc80 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *db;.  sqlite3_
2bc90 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
2bca0 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73  Info;.  struct s
2bcb0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
2bcc0 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
2bcd0 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
2bce0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
2bcf0 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
2bd00 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
2bd10 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pTerm;.  int i,
2bd20 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c   j;.  int iTerm,
2bd30 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   mxTerm;.  int n
2bd40 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e  Constraint;.  in
2bd50 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20  t seenIn = 0;   
2bd60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2bd70 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72  ue if an IN oper
2bd80 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a  ator is seen */.
2bd90 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20    int seenVar = 
2bda0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2bdb0 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d  * True if a non-
2bdc0 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61  constant constra
2bdd0 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  int is seen */. 
2bde0 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20   int iPhase;    
2bdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2be00 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e   0: const w/o IN
2be10 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e  , 1: const, 2: n
2be20 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a  o IN,  2: IN */.
2be30 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
2be40 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
2be50 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e  LITE_OK;..  pWIn
2be60 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
2be70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20  WInfo;.  pParse 
2be80 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
2be90 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
2bea0 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75  >db;.  pWC = pBu
2beb0 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e  ilder->pWC;.  pN
2bec0 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
2bed0 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70  New;.  pSrc = &p
2bee0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
2bef0 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a  >a[pNew->iTab];.
2bf00 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70    pTab = pSrc->p
2bf10 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49  Tab;.  assert( I
2bf20 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
2bf30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61  ;.  pIdxInfo = a
2bf40 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
2bf50 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
2bf60 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  rc, pBuilder->pO
2bf70 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70  rderBy);.  if( p
2bf80 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  IdxInfo==0 ) ret
2bf90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2bfa0 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  ;.  pNew->prereq
2bfb0 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53   = 0;.  pNew->rS
2bfc0 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etup = 0;.  pNew
2bfd0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
2bfe0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a  E_VIRTUALTABLE;.
2bff0 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2c000 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   0;.  pNew->u.vt
2c010 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
2c020 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78  .  pUsage = pIdx
2c030 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
2c040 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74  tUsage;.  nConst
2c050 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f  raint = pIdxInfo
2c060 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
2c070 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
2c080 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e  size(db, pNew, n
2c090 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20  Constraint) ){. 
2c0a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2c0b0 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  (db, pIdxInfo);.
2c0c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c0d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
2c0e0 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50  for(iPhase=0; iP
2c0f0 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b  hase<=3; iPhase+
2c100 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65  +){.    if( !see
2c110 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26 31  nIn && (iPhase&1
2c120 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50  )!=0 ){.      iP
2c130 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  hase++;.      if
2c140 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72 65  ( iPhase>3 ) bre
2c150 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
2c160 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69 50  ( !seenVar && iP
2c170 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a  hase>1 ) break;.
2c180 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
2c190 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
2c1a0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
2c1b0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
2c1c0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66  onstraint;.    f
2c1d0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
2c1e0 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
2c1f0 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
2c200 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64  ){.      j = pId
2c210 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
2c220 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  et;.      pTerm 
2c230 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
2c240 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68 61      switch( iPha
2c250 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  se ){.        ca
2c260 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73  se 0:    /* Cons
2c270 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e  tants without IN
2c280 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
2c290 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2c2a0 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  >usable = 0;.   
2c2b0 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
2c2c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2c2d0 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
2c2e0 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d          seenIn =
2c2f0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
2c300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
2c310 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
2c320 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2c330 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a     seenVar = 1;.
2c340 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
2c350 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2c360 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d  rator & WO_IN)==
2c370 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c380 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
2c390 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
2c3a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
2c3b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
2c3c0 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   1:    /* Consta
2c3d0 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72  nts with IN oper
2c3e0 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20  ators */.       
2c3f0 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 49     assert( seenI
2c400 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n );.          p
2c410 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
2c420 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
2c430 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20  Right==0);.     
2c440 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2c450 20 20 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f      case 2:    /
2c460 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68  * Variables with
2c470 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  out IN */.      
2c480 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
2c490 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Var );.         
2c4a0 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
2c4b0 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  e = (pTerm->eOpe
2c4c0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d  rator & WO_IN)==
2c4d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
2c4e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61  ak;.        defa
2c4f0 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62  ult:   /* Variab
2c500 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20  les with IN */. 
2c510 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2c520 20 73 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e   seenVar && seen
2c530 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  In );.          
2c540 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
2c550 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2c560 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2c570 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
2c580 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
2c590 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64  f(pUsage[0])*pId
2c5a0 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
2c5b0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  nt);.    if( pId
2c5c0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2c5d0 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
2c5e0 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
2c5f0 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49  >idxStr);.    pI
2c600 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d  dxInfo->idxStr =
2c610 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
2c620 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
2c630 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
2c640 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
2c650 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
2c660 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
2c670 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
2c680 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
2c690 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
2c6a0 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20  L / (double)2;. 
2c6b0 20 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74     rc = vtabBest
2c6c0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 54  Index(pParse, pT
2c6d0 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  ab, pIdxInfo);. 
2c6e0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2c6f0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61   whereLoopAddVta
2c700 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78  b_exit;.    pIdx
2c710 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
2c720 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
2c730 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
2c740 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
2c750 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  t;.    pNew->pre
2c760 72 65 71 20 3d 20 30 3b 0a 20 20 20 20 6d 78 54  req = 0;.    mxT
2c770 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  erm = -1;.    as
2c780 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c  sert( pNew->nLSl
2c790 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ot>=nConstraint 
2c7a0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
2c7b0 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
2c7c0 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d  ++) pNew->aLTerm
2c7d0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  [i] = 0;.    pNe
2c7e0 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
2c7f0 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  sk = 0;.    for(
2c800 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
2c810 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
2c820 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  s++){.      if( 
2c830 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b  (iTerm = pUsage[
2c840 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31  i].argvIndex - 1
2c850 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
2c860 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
2c870 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
2c880 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43     if( iTerm>=nC
2c890 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20  onstraint.      
2c8a0 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20     || j<0.      
2c8b0 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54     || j>=pWC->nT
2c8c0 65 72 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  erm.         || 
2c8d0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65  pNew->aLTerm[iTe
2c8e0 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 29  rm]!=0.        )
2c8f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2c900 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2c910 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c920 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2c930 20 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78 28   "%s.xBestIndex(
2c940 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20  ) malfunction", 
2c950 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
2c960 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65          goto whe
2c970 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78  reLoopAddVtab_ex
2c980 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  it;.        }.  
2c990 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c9a0 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69  iTerm==nConstrai
2c9b0 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  nt-1 );.        
2c9c0 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29  testcase( j==0 )
2c9d0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2c9e0 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72  se( j==pWC->nTer
2c9f0 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  m-1 );.        p
2ca00 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
2ca10 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ];.        pNew-
2ca20 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72 6d  >prereq |= pTerm
2ca30 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
2ca40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
2ca50 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f  Term<pNew->nLSlo
2ca60 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  t );.        pNe
2ca70 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
2ca80 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
2ca90 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65    if( iTerm>mxTe
2caa0 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54  rm ) mxTerm = iT
2cab0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 74 65 73  erm;.        tes
2cac0 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35  tcase( iTerm==15
2cad0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
2cae0 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20  case( iTerm==16 
2caf0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
2cb00 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67  Term<16 && pUsag
2cb10 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77  e[i].omit ) pNew
2cb20 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
2cb30 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20  k |= 1<<iTerm;. 
2cb40 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
2cb50 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2cb60 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
2cb70 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67 65        if( pUsage
2cb80 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20  [i].omit==0 ){. 
2cb90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2cba0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
2cbb0 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  use an IN constr
2cbc0 61 69 6e 74 20 69 66 20 74 68 65 20 76 69 72 74  aint if the virt
2cbd0 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ual table.      
2cbe0 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68        ** says th
2cbf0 61 74 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  at the equivalen
2cc00 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20  t EQ constraint 
2cc10 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79  cannot be safely
2cc20 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20   omitted..      
2cc30 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64        ** If we d
2cc40 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  o attempt to use
2cc50 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69   such a constrai
2cc60 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69  nt, some rows mi
2cc70 67 68 74 20 62 65 0a 20 20 20 20 20 20 20 20 20  ght be.         
2cc80 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69     ** repeated i
2cc90 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f  n the output. */
2cca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
2ccb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
2ccc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76            /* A v
2ccd0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61  irtual table tha
2cce0 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  t is constrained
2ccf0 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65   by an IN clause
2cd00 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20   may not.       
2cd10 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68     ** consume th
2cd20 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2cd30 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74 68  e because (1) th
2cd40 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65  e order of IN te
2cd50 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rms.          **
2cd60 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
2cd70 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74  ily related to t
2cd80 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70  he order of outp
2cd90 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20  ut terms and.   
2cda0 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75         ** (2) Mu
2cdb0 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66  ltiple outputs f
2cdc0 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20  rom a single IN 
2cdd0 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d  value will not m
2cde0 65 72 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a  erge.          *
2cdf0 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a  * together.  */.
2ce00 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49 6e            pIdxIn
2ce10 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
2ce20 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  med = 0;.       
2ce30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2ce40 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6e  .    if( i>=nCon
2ce50 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20  straint ){.     
2ce60 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
2ce70 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20  mxTerm+1;.      
2ce80 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c  assert( pNew->nL
2ce90 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c  Term<=pNew->nLSl
2cea0 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ot );.      pNew
2ceb0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20  ->u.vtab.idxNum 
2cec0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e  = pIdxInfo->idxN
2ced0 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  um;.      pNew->
2cee0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
2cef0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  = pIdxInfo->need
2cf00 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20  ToFreeIdxStr;.  
2cf10 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65      pIdxInfo->ne
2cf20 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
2cf30 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
2cf40 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20  u.vtab.idxStr = 
2cf50 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
2cf60 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
2cf70 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d  vtab.isOrdered =
2cf80 20 28 75 38 29 28 28 70 49 64 78 49 6e 66 6f 2d   (u8)((pIdxInfo-
2cf90 3e 6e 4f 72 64 65 72 42 79 21 3d 30 29 0a 20 20  >nOrderBy!=0).  
2cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfc0 20 20 20 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e     && pIdxInfo->
2cfd0 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29  orderByConsumed)
2cfe0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53  ;.      pNew->rS
2cff0 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  etup = 0;.      
2d000 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77 68 65  pNew->rRun = whe
2d010 72 65 43 6f 73 74 46 72 6f 6d 44 6f 75 62 6c 65  reCostFromDouble
2d020 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
2d030 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 20 20 20  atedCost);.     
2d040 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 76 65 72   /* TUNING: Ever
2d050 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  y virtual table 
2d060 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 32 35  query returns 25
2d070 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 70   rows */.      p
2d080 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 36 3b 20  New->nOut = 46; 
2d090 20 61 73 73 65 72 74 28 20 34 36 3d 3d 77 68 65   assert( 46==whe
2d0a0 72 65 43 6f 73 74 28 32 35 29 20 29 3b 0a 20 20  reCost(25) );.  
2d0b0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73      whereLoopIns
2d0c0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2d0d0 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ew);.      if( p
2d0e0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2d0f0 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
2d100 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
2d110 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
2d120 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
2d130 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
2d140 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2d150 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65    }.  }  ..where
2d160 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74  LoopAddVtab_exit
2d170 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  :.  if( pIdxInfo
2d180 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2d190 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
2d1a0 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  e(pIdxInfo->idxS
2d1b0 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  tr);.  sqlite3Db
2d1c0 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66  Free(db, pIdxInf
2d1d0 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  o);.  return rc;
2d1e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2d1f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2d200 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
2d210 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  Add WhereLoop en
2d220 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20  tries to handle 
2d230 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20  OR terms.  This 
2d240 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72  works for either
2d250 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69  .** btrees or vi
2d260 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f  rtual tables..*/
2d270 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2d280 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65 72 65  eLoopAddOr(Where
2d290 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
2d2a0 69 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d  ilder, Bitmask m
2d2b0 45 78 74 72 61 29 7b 0a 20 20 57 68 65 72 65 49  Extra){.  WhereI
2d2c0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
2d2d0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
2d2e0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2d2f0 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  WC;.  WhereLoop 
2d300 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65  *pNew;.  WhereTe
2d310 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45  rm *pTerm, *pWCE
2d320 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  nd;.  int rc = S
2d330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2d340 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61  iCur;.  WhereCla
2d350 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68  use tempWC;.  Wh
2d360 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73  ereLoopBuilder s
2d370 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72  SubBuild;.  Wher
2d380 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75  eOrSet sSum, sCu
2d390 72 2c 20 73 50 72 65 76 3b 0a 20 20 73 74 72 75  r, sPrev;.  stru
2d3a0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2d3b0 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43  *pItem;.  .  pWC
2d3c0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
2d3d0 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
2d3e0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2d3f0 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20 72 65  RE_AND_ONLY ) re
2d400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d410 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e    pWCEnd = pWC->
2d420 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
2d430 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
2d440 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65  r->pNew;.  memse
2d450 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65  t(&sSum, 0, size
2d460 6f 66 28 73 53 75 6d 29 29 3b 0a 0a 20 20 66 6f  of(sSum));..  fo
2d470 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
2d480 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20  pTerm<pWCEnd && 
2d490 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70  rc==SQLITE_OK; p
2d4a0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
2d4b0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2d4c0 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20  or & WO_OR)!=0. 
2d4d0 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75      && (pTerm->u
2d4e0 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61  .pOrInfo->indexa
2d4f0 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ble & pNew->mask
2d500 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b  Self)!=0 .    ){
2d510 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75  .      WhereClau
2d520 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  se * const pOrWC
2d530 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
2d540 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
2d550 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73  WhereTerm * cons
2d560 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f  t pOrWCEnd = &pO
2d570 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54  rWC->a[pOrWC->nT
2d580 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72  erm];.      Wher
2d590 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a  eTerm *pOrTerm;.
2d5a0 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d        int once =
2d5b0 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   1;.      int i,
2d5c0 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 70   j;.    .      p
2d5d0 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
2d5e0 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
2d5f0 77 2d 3e 69 54 61 62 3b 0a 20 20 20 20 20 20 69  w->iTab;.      i
2d600 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  Cur = pItem->iCu
2d610 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 53 75 62  rsor;.      sSub
2d620 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65  Build = *pBuilde
2d630 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69  r;.      sSubBui
2d640 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  ld.pOrderBy = 0;
2d650 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
2d660 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b  .pOrSet = &sCur;
2d670 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54  ..      for(pOrT
2d680 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f  erm=pOrWC->a; pO
2d690 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20  rTerm<pOrWCEnd; 
2d6a0 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
2d6b0 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
2d6c0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2d6d0 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
2d6e0 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
2d6f0 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e  pWC = &pOrTerm->
2d700 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a  u.pAndInfo->wc;.
2d710 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2d720 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
2d730 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20  ursor==iCur ){. 
2d740 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2d750 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
2d760 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
2d770 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20  tempWC.pOuter = 
2d780 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pWC;.          t
2d790 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e  empWC.op = TK_AN
2d7a0 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  D;.          tem
2d7b0 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20  pWC.nTerm = 1;. 
2d7c0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2d7d0 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20  a = pOrTerm;.   
2d7e0 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
2d7f0 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a  .pWC = &tempWC;.
2d800 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2d810 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2d820 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2d830 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b       sCur.n = 0;
2d840 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d850 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2d860 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  E.        if( Is
2d870 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
2d880 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
2d890 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2d8a0 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62  AddVirtual(&sSub
2d8b0 42 75 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Build);.        
2d8c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 43 75    for(i=0; i<sCu
2d8d0 72 2e 6e 3b 20 69 2b 2b 29 20 73 43 75 72 2e 61  r.n; i++) sCur.a
2d8e0 5b 69 5d 2e 70 72 65 72 65 71 20 7c 3d 20 6d 45  [i].prereq |= mE
2d8f0 78 74 72 61 3b 0a 20 20 20 20 20 20 20 20 7d 65  xtra;.        }e
2d900 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
2d910 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
2d920 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2d930 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64  Btree(&sSubBuild
2d940 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20  , mExtra);.     
2d950 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2d960 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2d970 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20  OK || sCur.n==0 
2d980 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
2d990 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  Cur.n==0 ){.    
2d9a0 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
2d9b0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2d9c0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
2d9d0 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
2d9e0 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
2d9f0 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29  ve(&sSum, &sCur)
2da00 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65  ;.          once
2da10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
2da20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
2da30 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65  hereOrMove(&sPre
2da40 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20  v, &sSum);.     
2da50 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b       sSum.n = 0;
2da60 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
2da70 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69  =0; i<sPrev.n; i
2da80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2da90 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72   for(j=0; j<sCur
2daa0 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; j++){.      
2dab0 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 49          whereOrI
2dac0 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72  nsert(&sSum, sPr
2dad0 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c  ev.a[i].prereq |
2dae0 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65   sCur.a[j].prere
2daf0 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q,.             
2db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
2db10 68 65 72 65 43 6f 73 74 41 64 64 28 73 50 72 65  hereCostAdd(sPre
2db20 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75  v.a[i].rRun, sCu
2db30 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20  r.a[j].rRun),.  
2db40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db50 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 43            whereC
2db60 6f 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  ostAdd(sPrev.a[i
2db70 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a  ].nOut, sCur.a[j
2db80 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20  ].nOut));.      
2db90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dba0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2dbb0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
2dbc0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
2dbd0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
2dbe0 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
2dbf0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2dc00 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   = WHERE_MULTI_O
2dc10 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  R;.      pNew->r
2dc20 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
2dc30 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
2dc40 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  = 0;.      memse
2dc50 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73  t(&pNew->u, 0, s
2dc60 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b  izeof(pNew->u));
2dc70 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2dc80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2dc90 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b   i<sSum.n; i++){
2dca0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
2dcb0 4e 47 3a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20  NG: Multiple by 
2dcc0 33 2e 35 20 66 6f 72 20 74 68 65 20 73 65 63 6f  3.5 for the seco
2dcd0 6e 64 61 72 79 20 74 61 62 6c 65 20 6c 6f 6f 6b  ndary table look
2dce0 75 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  up */.        pN
2dcf0 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e  ew->rRun = sSum.
2dd00 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 38 3b 0a  a[i].rRun + 18;.
2dd10 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
2dd20 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e  ut = sSum.a[i].n
2dd30 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  Out;.        pNe
2dd40 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d  w->prereq = sSum
2dd50 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20  .a[i].prereq;.  
2dd60 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2dd70 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
2dd80 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
2dd90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2dda0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2ddb0 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
2ddc0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
2ddd0 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f  r all tables .*/
2dde0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2ddf0 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72  eLoopAddAll(Wher
2de00 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2de10 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
2de20 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
2de30 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
2de40 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
2de50 61 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b  a = 0;.  Bitmask
2de60 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69   mPrior = 0;.  i
2de70 6e 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69  nt iTab;.  SrcLi
2de80 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
2de90 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
2dea0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2deb0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2dec0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2ded0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
2dee0 62 3b 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73  b;.  int nTabLis
2def0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  t = pWInfo->nLev
2df00 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  el;.  int rc = S
2df10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70  QLITE_OK;.  u8 p
2df20 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30  riorJoinType = 0
2df30 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
2df40 4e 65 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  New;..  /* Loop 
2df50 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20  over the tables 
2df60 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f  in the join, fro
2df70 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20  m left to right 
2df80 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  */.  pNew = pBui
2df90 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68  lder->pNew;.  wh
2dfa0 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77  ereLoopInit(pNew
2dfb0 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c  );.  for(iTab=0,
2dfc0 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d   pItem=pTabList-
2dfd0 3e 61 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69 73  >a; iTab<nTabLis
2dfe0 74 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d  t; iTab++, pItem
2dff0 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  ++){.    pNew->i
2e000 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
2e010 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  pNew->maskSelf =
2e020 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
2e030 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65  ->sMaskSet, pIte
2e040 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2e050 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f   if( ((pItem->jo
2e060 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e  intype|priorJoin
2e070 54 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54  Type) & (JT_LEFT
2e080 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29  |JT_CROSS))!=0 )
2e090 7b 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d  {.      mExtra =
2e0a0 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20   mPrior;.    }. 
2e0b0 20 20 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65     priorJoinType
2e0c0 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79   = pItem->jointy
2e0d0 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69  pe;.    if( IsVi
2e0e0 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
2e0f0 62 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  b) ){.      rc =
2e100 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
2e110 74 75 61 6c 28 70 42 75 69 6c 64 65 72 29 3b 0a  tual(pBuilder);.
2e120 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e130 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2e140 64 64 42 74 72 65 65 28 70 42 75 69 6c 64 65 72  ddBtree(pBuilder
2e150 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  , mExtra);.    }
2e160 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2e170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e180 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2e190 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 45  dOr(pBuilder, mE
2e1a0 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
2e1b0 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d   mPrior |= pNew-
2e1c0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
2e1d0 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
2e1e0 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
2e1f0 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f  k;.  }.  whereLo
2e200 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77  opClear(db, pNew
2e210 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2e220 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65  }../*.** Examine
2e230 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77 69   a WherePath (wi
2e240 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20  th the addition 
2e250 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68 65  of the extra Whe
2e260 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74  reLoop of the 5t
2e270 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29  h.** parameters)
2e280 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75   to see if it ou
2e290 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68  tputs rows in th
2e2a0 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44 45  e requested ORDE
2e2b0 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55  R BY.** (or GROU
2e2c0 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72 65  P BY) without re
2e2d0 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72 61  quiring a separa
2e2e0 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f  te sort operatio
2e2f0 6e 2e 20 20 52 65 74 75 72 6e 3a 0a 2a 2a 20 0a  n.  Return:.** .
2e300 2a 2a 20 20 20 20 30 3a 20 20 4f 52 44 45 52 20  **    0:  ORDER 
2e310 42 59 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66  BY is not satisf
2e320 69 65 64 2e 20 20 53 6f 72 74 69 6e 67 20 72 65  ied.  Sorting re
2e330 71 75 69 72 65 64 0a 2a 2a 20 20 20 20 31 3a 20  quired.**    1: 
2e340 20 4f 52 44 45 52 20 42 59 20 69 73 20 73 61 74   ORDER BY is sat
2e350 69 73 66 69 65 64 2e 20 20 20 20 20 20 4f 6d 69  isfied.      Omi
2e360 74 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 20 20 2d  t sorting.**   -
2e370 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61 74 20 74  1:  Unknown at t
2e380 68 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 4e  his time.**.** N
2e390 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73  ote that process
2e3a0 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52  ing for WHERE_GR
2e3b0 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f  OUPBY and WHERE_
2e3c0 44 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f  DISTINCTBY is no
2e3d0 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20  t as.** strict. 
2e3e0 20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61   With GROUP BY a
2e3f0 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20  nd DISTINCT the 
2e400 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74  only requirement
2e410 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69   is that.** equi
2e420 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65  valent rows appe
2e430 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ar immediately a
2e440 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61  djacent to one a
2e450 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42  nother.  GROUP B
2e460 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 54  Y.** and DISTINT
2e470 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
2e480 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20 69  rows to appear i
2e490 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  n any particular
2e4a0 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a   order as long.*
2e4b0 2a 20 61 73 20 65 71 75 69 76 65 6c 65 6e 74 20  * as equivelent 
2e4c0 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65 64  rows are grouped
2e4d0 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73   together.  Thus
2e4e0 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e   for GROUP BY an
2e4f0 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68  d DISTINCT.** th
2e500 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  e pOrderBy terms
2e510 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20   can be matched 
2e520 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57  in any order.  W
2e530 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68  ith ORDER BY, th
2e540 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74  e .** pOrderBy t
2e550 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74  erms must be mat
2e560 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c  ched in strict l
2e570 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64  eft-to-right ord
2e580 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2e590 74 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  t wherePathSatis
2e5a0 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57  fiesOrderBy(.  W
2e5b0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2e5c0 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52  ,    /* The WHER
2e5d0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
2e5e0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2e5f0 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ,   /* ORDER BY 
2e600 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44  or GROUP BY or D
2e610 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74  ISTINCT clause t
2e620 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65  o check */.  Whe
2e630 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20  rePath *pPath,  
2e640 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50     /* The WhereP
2e650 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ath to check */.
2e660 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
2e670 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74  ,       /* Might
2e680 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47   contain WHERE_G
2e690 52 4f 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f  ROUPBY or WHERE_
2e6a0 44 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20  DISTINCTBY */.  
2e6b0 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20  u16 nLoop,      
2e6c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2e6d0 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50  of entries in pP
2e6e0 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a  ath->aLoop[] */.
2e6f0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61    WhereLoop *pLa
2e700 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74  st,     /* Add t
2e710 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  his WhereLoop to
2e720 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74   the end of pPat
2e730 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
2e740 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73  Bitmask *pRevMas
2e750 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61  k     /* OUT: Ma
2e760 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73  sk of WhereLoops
2e770 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72   to run in rever
2e780 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20  se order */.){. 
2e790 20 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20   u8 revSet;     
2e7a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2e7b0 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a  f rev is known *
2e7c0 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20  /.  u8 rev;     
2e7d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
2e7e0 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65  posite sort orde
2e7f0 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78  r */.  u8 revIdx
2e800 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2e810 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72  Index sort order
2e820 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72   */.  u8 isOrder
2e830 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41  Distinct;   /* A
2e840 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f  ll prior WhereLo
2e850 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69  ops are order-di
2e860 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64  stinct */.  u8 d
2e870 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20  istinctColumns; 
2e880 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2e890 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45   loop has UNIQUE
2e8a0 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   NOT NULL column
2e8b0 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63  s */.  u8 isMatc
2e8c0 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h;           /* 
2e8d0 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20  iColumn matches 
2e8e0 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  a term of the OR
2e8f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2e900 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20  .  u16 nColumn; 
2e910 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2e920 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
2e930 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36   pIndex */.  u16
2e940 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
2e950 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72     /* Number ter
2e960 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
2e970 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
2e980 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
2e990 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2e9a0 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50   WhereLoop in pP
2e9b0 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73  ath being proces
2e9c0 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  sed */.  int i, 
2e9d0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
2e9e0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
2e9f0 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
2ea00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2ea10 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
2ea20 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  current WhereLoo
2ea30 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  p */.  int iColu
2ea40 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
2ea50 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  A column number 
2ea60 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75  within table iCu
2ea70 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  r */.  WhereLoop
2ea80 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20   *pLoop = 0; /* 
2ea90 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  Current WhereLoo
2eaa0 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  p being processe
2eab0 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  d. */.  WhereTer
2eac0 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a  m *pTerm;     /*
2ead0 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
2eae0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2eaf0 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  se */.  Expr *pO
2eb00 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  BExpr;        /*
2eb10 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
2eb20 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59  rom the ORDER BY
2eb30 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c   clause */.  Col
2eb40 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
2eb50 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75     /* COLLATE fu
2eb60 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f  nction from an O
2eb70 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
2eb80 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  erm */.  Index *
2eb90 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f  pIndex;        /
2eba0 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f  * The index asso
2ebb0 63 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f  ciated with pLoo
2ebc0 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  p */.  sqlite3 *
2ebd0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
2ebe0 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
2ebf0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2ec00 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
2ec10 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d  Sat = 0;    /* M
2ec20 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ask of ORDER BY 
2ec30 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
2ec40 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d  so far */.  Bitm
2ec50 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20  ask obDone;     
2ec60 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
2ec70 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
2ec80 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64  */.  Bitmask ord
2ec90 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20  erDistinctMask; 
2eca0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
2ecb0 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f  well-ordered loo
2ecc0 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ps */.  Bitmask 
2ecd0 72 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  ready;          
2ece0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69      /* Mask of i
2ecf0 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20  nner loops */.. 
2ed00 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20   /*.  ** We say 
2ed10 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  the WhereLoop is
2ed20 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74   "one-row" if it
2ed30 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f   generates no mo
2ed40 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a  re than one.  **
2ed50 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20   row of output. 
2ed60 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20   A WhereLoop is 
2ed70 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f  one-row if all o
2ed80 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2ed90 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20  are true:.  **  
2eda0 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f  (a) All index co
2edb0 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68  lumns match with
2edc0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
2edd0 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20  ..  **  (b) The 
2ede0 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a  index is unique.
2edf0 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f    ** Any WhereLo
2ee00 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45  op with an WHERE
2ee10 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74  _COLUMN_EQ const
2ee20 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77  raint on the row
2ee30 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20  id is one-row.. 
2ee40 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f   ** Every one-ro
2ee50 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c  w WhereLoop will
2ee60 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f   have the WHERE_
2ee70 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69  ONEROW bit set i
2ee80 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a  n wsFlags..  **.
2ee90 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
2eea0 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72  WhereLoop is "or
2eeb0 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66  der-distinct" if
2eec0 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75   the set of colu
2eed0 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mns from.  ** th
2eee0 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  at WhereLoop tha
2eef0 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44  t are in the ORD
2ef00 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
2ef10 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
2ef20 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  very.  ** row of
2ef30 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20   the WhereLoop. 
2ef40 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57   Every one-row W
2ef50 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f  hereLoop is auto
2ef60 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f  matically.  ** o
2ef70 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20  rder-distinct.  
2ef80 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61   A WhereLoop tha
2ef90 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73  t has no columns
2efa0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
2efb0 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20   clause.  ** is 
2efc0 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  not order-distin
2efd0 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d  ct. To be order-
2efe0 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20  distinct is not 
2eff0 71 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61  quite the same a
2f000 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49  s being.  ** UNI
2f010 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51  QUE since a UNIQ
2f020 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64  UE column or ind
2f030 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  ex can have mult
2f040 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a  iple rows that .
2f050 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e    ** are NULL an
2f060 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  d NULL values ar
2f070 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
2f080 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   the purpose of 
2f090 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a  order-distinct..
2f0a0 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72    ** To be order
2f0b0 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63  -distinct, the c
2f0c0 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55  olumns must be U
2f0d0 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55  NIQUE and NOT NU
2f0e0 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  LL..  **.  ** Th
2f0f0 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61  e rowid for a ta
2f100 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e  ble is always UN
2f110 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
2f120 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68  L so whenever th
2f130 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70  e.  ** rowid app
2f140 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45  ears in the ORDE
2f150 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
2f160 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
2f170 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a  hereLoop is.  **
2f180 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f   automatically o
2f190 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
2f1a0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
2f1b0 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 0a 20  OrderBy!=0 );.. 
2f1c0 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69 74 79 20   /* Sortability 
2f1d0 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  of virtual table
2f1e0 73 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  s is determined 
2f1f0 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  by the xBestInde
2f200 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a 20 6f 66  x method.  ** of
2f210 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
2f220 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 69  le itself */.  i
2f230 66 28 20 70 4c 61 73 74 2d 3e 77 73 46 6c 61 67  f( pLast->wsFlag
2f240 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
2f250 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 74 65  LTABLE ){.    te
2f260 73 74 63 61 73 65 28 20 6e 4c 6f 6f 70 3e 30 20  stcase( nLoop>0 
2f270 29 3b 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e  );  /* True when
2f280 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 61 72 65   outer loops are
2f290 20 6f 6e 65 2d 72 6f 77 20 61 6e 64 20 6d 61 74   one-row and mat
2f2a0 63 68 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ch .            
2f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2f2c0 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 74 65 72   no ORDER BY ter
2f2d0 6d 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ms */.    return
2f2e0 20 70 4c 61 73 74 2d 3e 75 2e 76 74 61 62 2e 69   pLast->u.vtab.i
2f2f0 73 4f 72 64 65 72 65 64 3b 0a 20 20 7d 0a 20 20  sOrdered;.  }.  
2f300 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74  if( nLoop && Opt
2f310 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
2f320 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64  d(db, SQLITE_Ord
2f330 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72  erByIdxJoin) ) r
2f340 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64  eturn 0;..  nOrd
2f350 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
2f360 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61  >nExpr;.  testca
2f370 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d  se( nOrderBy==BM
2f380 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72  S-1 );.  if( nOr
2f390 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65  derBy>BMS-1 ) re
2f3a0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e  turn 0;  /* Cann
2f3b0 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72  ot optimize over
2f3c0 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42  ly large ORDER B
2f3d0 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44  Ys */.  isOrderD
2f3e0 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f  istinct = 1;.  o
2f3f0 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28  bDone = MASKBIT(
2f400 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f  nOrderBy)-1;.  o
2f410 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
2f420 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20   = 0;.  ready = 
2f430 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  0;.  for(iLoop=0
2f440 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ; isOrderDistinc
2f450 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e  t && obSat<obDon
2f460 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f  e && iLoop<=nLoo
2f470 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
2f480 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72   if( iLoop>0 ) r
2f490 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  eady |= pLoop->m
2f4a0 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f  askSelf;.    pLo
2f4b0 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  op = iLoop<nLoop
2f4c0 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   ? pPath->aLoop[
2f4d0 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a  iLoop] : pLast;.
2f4e0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
2f4f0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2f500 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2f510 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 43 75 72  )==0 );.    iCur
2f520 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2f530 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54  ist->a[pLoop->iT
2f540 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  ab].iCursor;..  
2f550 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
2f560 79 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  y ORDER BY term 
2f570 58 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75  X that is a colu
2f580 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
2f590 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  of.    ** the cu
2f5a0 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77  rrent loop for w
2f5b0 68 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65  hich there is te
2f5c0 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a  rm in the WHERE.
2f5d0 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
2f5e0 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e   the form X IS N
2f5f0 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20  ULL or X=? that 
2f600 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
2f610 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70  uter.    ** loop
2f620 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
2f630 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
2f640 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  y; i++){.      i
2f650 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
2f660 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
2f670 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20  ;.      pOBExpr 
2f680 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
2f690 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
2f6a0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2f6b0 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2f6c0 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
2f6d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2f6e0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2f6f0 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
2f700 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
2f710 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
2f720 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43  &pWInfo->sWC, iC
2f730 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  ur, pOBExpr->iCo
2f740 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
2f750 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65               ~re
2f760 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  ady, WO_EQ|WO_IS
2f770 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 20 20  NULL, 0);.      
2f780 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63  if( pTerm==0 ) c
2f790 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
2f7a0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
2f7b0 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 26  ator&WO_EQ)!=0 &
2f7c0 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  & pOBExpr->iColu
2f7d0 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn>=0 ){.       
2f7e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c   const char *z1,
2f7f0 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43   *z2;.        pC
2f800 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2f810 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
2f820 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  >pParse, pOrderB
2f830 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2f840 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
2f850 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
2f860 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
2f870 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e      z1 = pColl->
2f880 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70  zName;.        p
2f890 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2f8a0 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
2f8b0 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  ->pParse, pTerm-
2f8c0 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >pExpr);.       
2f8d0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
2f8e0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
2f8f0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20  oll;.        z2 
2f900 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  = pColl->zName;.
2f910 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2f920 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
2f930 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  2)!=0 ) continue
2f940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f950 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
2f960 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (i);.    }..    
2f970 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
2f980 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
2f990 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OW)==0 ){.      
2f9a0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2f9b0 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29  gs & WHERE_IPK )
2f9c0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
2f9d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43   = 0;.        nC
2f9e0 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 20  olumn = 0;.     
2f9f0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64   }else if( (pInd
2fa00 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
2fa10 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c  ree.pIndex)==0 |
2fa20 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  | pIndex->bUnord
2fa30 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
2fa40 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
2fa50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
2fa60 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
2fa70 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >nColumn;.      
2fa80 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2fa90 74 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  t = pIndex->onEr
2faa0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20  ror!=OE_None;.  
2fab0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2fac0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
2fad0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
2fae0 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77  index and deal w
2faf0 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20  ith the ones.   
2fb00 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e     ** that are n
2fb10 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  ot constrained b
2fb20 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20  y == or IN..    
2fb30 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d    */.      rev =
2fb40 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20   revSet = 0;.   
2fb50 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d     distinctColum
2fb60 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  ns = 0;.      fo
2fb70 72 28 6a 3d 30 3b 20 6a 3c 3d 6e 43 6f 6c 75 6d  r(j=0; j<=nColum
2fb80 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
2fb90 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20   u8 bOnce;   /* 
2fba0 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20  True to run the 
2fbb0 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68 20  ORDER BY search 
2fbc0 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20  loop */..       
2fbd0 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d   /* Skip over ==
2fbe0 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72   and IS NULL ter
2fbf0 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ms */.        if
2fc00 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ( j<pLoop->u.btr
2fc10 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20  ee.nEq.         
2fc20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e  && ((i = pLoop->
2fc30 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
2fc40 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57  ator) & (WO_EQ|W
2fc50 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20  O_ISNULL))!=0.  
2fc60 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2fc70 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53     if( i & WO_IS
2fc80 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
2fc90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
2fca0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b  OrderDistinct );
2fcb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
2fcc0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
2fcd0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2fce0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2fcf0 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;  .        }.. 
2fd00 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68         /* Get th
2fd10 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
2fd20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43  in the table (iC
2fd30 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20  olumn) and sort 
2fd40 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  order.        **
2fd50 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68   (revIdx) for th
2fd60 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e j-th column of
2fd70 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
2fd80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2fd90 66 28 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  f( j<nColumn ){.
2fda0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72            /* Nor
2fdb0 6d 61 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  mal index column
2fdc0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  s */.          i
2fdd0 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
2fde0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
2fdf0 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d          revIdx =
2fe00 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
2fe10 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  der[j];.        
2fe20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70    if( iColumn==p
2fe30 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69  Index->pTable->i
2fe40 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d  PKey ) iColumn =
2fe50 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
2fe60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2fe70 20 54 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   The ROWID colum
2fe80 6e 20 61 74 20 74 68 65 20 65 6e 64 20 2a 2f 0a  n at the end */.
2fe90 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2fea0 28 20 6a 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  ( j==nColumn );.
2feb0 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
2fec0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2fed0 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20    revIdx = 0;.  
2fee0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2fef0 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61   /* An unconstra
2ff00 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ined column that
2ff10 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d   might be NULL m
2ff20 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20  eans that this. 
2ff30 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c         ** WhereL
2ff40 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d  oop is not well-
2ff50 6f 72 64 65 72 65 64 20 0a 20 20 20 20 20 20 20  ordered .       
2ff60 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2ff70 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a  isOrderDistinct.
2ff80 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c           && iCol
2ff90 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20  umn>=0.         
2ffa0 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62  && j>=pLoop->u.b
2ffb0 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20  tree.nEq.       
2ffc0 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61    && pIndex->pTa
2ffd0 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
2ffe0 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20  n].notNull==0.  
2fff0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
30000 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
30010 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
30020 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  }..        /* Fi
30030 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  nd the ORDER BY 
30040 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73  term that corres
30050 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74  ponds to the j-t
30060 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  h column.       
30070 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78   ** of the index
30080 20 61 6e 64 20 61 6e 64 20 6d 61 72 6b 20 74 68   and and mark th
30090 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  at ORDER BY term
300a0 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f   off .        */
300b0 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d  .        bOnce =
300c0 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61   1;.        isMa
300d0 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
300e0 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20   for(i=0; bOnce 
300f0 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  && i<nOrderBy; i
30100 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
30110 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
30120 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
30130 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45  ;.          pOBE
30140 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
30150 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
30160 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
30170 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  r);.          te
30180 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
30190 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
301a0 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
301b0 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
301c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
301d0 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20  TINCTBY );.     
301e0 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
301f0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52  lags & (WHERE_GR
30200 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54  OUPBY|WHERE_DIST
30210 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f  INCTBY))==0 ) bO
30220 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
30230 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
30240 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
30250 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
30260 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
30270 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20  >iTable!=iCur ) 
30280 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
30290 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
302a0 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  >iColumn!=iColum
302b0 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
302c0 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
302d0 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
302e0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
302f0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
30300 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
30310 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
30320 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
30330 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
30340 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
30350 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
30360 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
30370 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
30380 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43  ame, pIndex->azC
30390 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e  oll[j])!=0 ) con
303a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
303b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d   }.          isM
303c0 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  atch = 1;.      
303d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
303e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
303f0 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20   isMatch ){.    
30400 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
30410 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
30420 20 20 20 74 65 73 74 63 61 73 65 28 20 64 69 73     testcase( dis
30430 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20  tinctColumns==0 
30440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  );.            d
30450 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d  istinctColumns =
30460 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
30470 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
30480 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
30490 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57           if( (pW
304a0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
304b0 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
304c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
304d0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
304e0 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20   the sort order 
304f0 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e  is compatible in
30500 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
30510 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20  use..           
30520 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69   ** Sort order i
30530 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72  s irrelevant for
30540 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
30550 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
30560 20 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b     if( revSet ){
30570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
30580 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78  f( (rev ^ revIdx
30590 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  )!=pOrderBy->a[i
305a0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65  ].sortOrder ) re
305b0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
305c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
305d0 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72           rev = r
305e0 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79  evIdx ^ pOrderBy
305f0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
30600 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
30610 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d  if( rev ) *pRevM
30620 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  ask |= MASKBIT(i
30630 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Loop);.         
30640 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b       revSet = 1;
30650 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
30660 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30670 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30680 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20      /* No match 
30690 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
306a0 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a     if( j==0 || j
306b0 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  <nColumn ){.    
306c0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
306d0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
306e0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
306f0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
30700 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
30710 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
30720 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
30730 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c        } /* end L
30740 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
30750 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ex columns */.  
30760 20 20 20 20 69 66 28 20 64 69 73 74 69 6e 63 74      if( distinct
30770 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20  Columns ){.     
30780 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
30790 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20  rderDistinct==0 
307a0 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64  );.        isOrd
307b0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a  erDistinct = 1;.
307c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a        }.    } /*
307d0 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d   end-if not one-
307e0 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d  row */..    /* M
307f0 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65  ark off any othe
30800 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  r ORDER BY terms
30810 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
30820 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28  pLoop */.    if(
30830 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
30840 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44   ){.      orderD
30850 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70  istinctMask |= p
30860 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
30870 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
30880 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
30890 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
308a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41  ;.        if( MA
308b0 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
308c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
308d0 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42       p = pOrderB
308e0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
308f0 20 20 20 20 20 20 20 69 66 28 20 28 65 78 70 72         if( (expr
30900 54 61 62 6c 65 55 73 61 67 65 28 26 70 57 49 6e  TableUsage(&pWIn
30910 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 29  fo->sMaskSet, p)
30920 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  &~orderDistinctM
30930 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
30940 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
30950 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20  SKBIT(i);.      
30960 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30970 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65  }.  } /* End the
30980 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57   loop over all W
30990 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f  hereLoops from o
309a0 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74  uter-most down t
309b0 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a  o inner-most */.
309c0 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44    if( obSat==obD
309d0 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  one ) return 1;.
309e0 20 20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69    if( !isOrderDi
309f0 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
30a00 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0;.  return -1;.
30a10 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
30a20 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20  RACE_ENABLED./* 
30a30 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73  For debugging us
30a40 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69  e only: */.stati
30a50 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68  c const char *wh
30a60 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72  erePathName(Wher
30a70 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e  ePath *pPath, in
30a80 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f  t nLoop, WhereLo
30a90 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74  op *pLast){.  st
30aa0 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b  atic char zName[
30ab0 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  65];.  int i;.  
30ac0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70  for(i=0; i<nLoop
30ad0 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d  ; i++){ zName[i]
30ae0 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   = pPath->aLoop[
30af0 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28  i]->cId; }.  if(
30b00 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69   pLast ) zName[i
30b10 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64  ++] = pLast->cId
30b20 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30  ;.  zName[i] = 0
30b30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
30b40 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
30b50 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73  ** Given the lis
30b60 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f  t of WhereLoop o
30b70 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f  bjects at pWInfo
30b80 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72  ->pLoops, this r
30b90 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70  outine.** attemp
30ba0 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c  ts to find the l
30bb0 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
30bc0 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68  that visits each
30bd0 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e   WhereLoop.** on
30be0 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69  ce.  This path i
30bf0 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e  s then loaded in
30c00 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61  to the pWInfo->a
30c10 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73  [].pWLoop fields
30c20 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74  ..**.** Assume t
30c30 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  hat the total nu
30c40 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
30c50 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65  ows that will ne
30c60 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a  ed to be sorted.
30c70 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45  ** will be nRowE
30c80 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f  st (in the 10*lo
30c90 67 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  g2 representatio
30ca0 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20  n).  Or, ignore 
30cb0 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73  sorting.** costs
30cc0 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a   if nRowEst==0..
30cd0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
30ce0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
30cf0 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  s or SQLITE_NOME
30d00 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  M of a memory al
30d10 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f  location.** erro
30d20 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  r occurs..*/.sta
30d30 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74  tic int wherePat
30d40 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66  hSolver(WhereInf
30d50 6f 20 2a 70 57 49 6e 66 6f 2c 20 57 68 65 72 65  o *pWInfo, Where
30d60 43 6f 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20  Cost nRowEst){. 
30d70 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20   int mxChoice;  
30d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
30d90 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
30da0 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74  simultaneous pat
30db0 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20  hs tracked */.  
30dc0 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20  int nLoop;      
30dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
30de0 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
30df0 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61  the join */.  Pa
30e00 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
30e10 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
30e20 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
30e30 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
30e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30e50 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
30e60 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  tion */.  int iL
30e70 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
30e80 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
30e90 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72  ter over the ter
30ea0 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ms of the join *
30eb0 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20  /.  int ii, jj; 
30ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30ed0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
30ee0 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b  /.  int mxI = 0;
30ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30f00 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65   Index of next e
30f10 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20  ntry to replace 
30f20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72  */.  WhereCost r
30f30 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Cost;          /
30f40 2a 20 43 6f 73 74 20 6f 66 20 61 20 70 61 74 68  * Cost of a path
30f50 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
30f60 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
30f70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
30f80 70 75 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  puts */.  WhereC
30f90 6f 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20  ost mxCost = 0; 
30fa0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63      /* Maximum c
30fb0 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20  ost of a set of 
30fc0 70 61 74 68 73 20 2a 2f 0a 20 20 57 68 65 72 65  paths */.  Where
30fd0 43 6f 73 74 20 6d 78 4f 75 74 20 3d 20 30 3b 20  Cost mxOut = 0; 
30fe0 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
30ff0 6e 4f 75 74 20 76 61 6c 75 65 20 6f 6e 20 74 68  nOut value on th
31000 65 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a  e set of paths *
31010 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 53  /.  WhereCost rS
31020 6f 72 74 43 6f 73 74 3b 20 20 20 20 20 20 2f 2a  ortCost;      /*
31030 20 43 6f 73 74 20 74 6f 20 64 6f 20 61 20 73 6f   Cost to do a so
31040 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c  rt */.  int nTo,
31050 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   nFrom;         
31060 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
31070 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20  alid entries in 
31080 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b  aTo[] and aFrom[
31090 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  ] */.  WherePath
310a0 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *aFrom;        
310b0 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61   /* All nFrom pa
310c0 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69  ths at the previ
310d0 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ous level */.  W
310e0 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20  herePath *aTo;  
310f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
31100 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61  nTo best paths a
31110 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  t the current le
31120 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
31130 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20  th *pFrom;      
31140 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
31150 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74   of aFrom[] that
31160 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
31170 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  on */.  WherePat
31180 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20  h *pTo;         
31190 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
311a0 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65  of aTo[] that we
311b0 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
311c0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
311d0 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f  pWLoop;        /
311e0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65  * One of the Whe
311f0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
31200 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  /.  WhereLoop **
31210 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pX;           /*
31220 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70   Used to divy up
31230 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f   the pSpace memo
31240 72 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53  ry */.  char *pS
31250 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
31260 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d    /* Temporary m
31270 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
31280 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  is routine */.. 
31290 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
312a0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
312b0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e   pParse->db;.  n
312c0 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  Loop = pWInfo->n
312d0 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49  Level;.  /* TUNI
312e0 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71  NG: For simple q
312f0 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65  ueries, only the
31300 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72   best path is tr
31310 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  acked..  ** For 
31320 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65  2-way joins, the
31330 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72   5 best paths ar
31340 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a  e followed..  **
31350 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20   For joins of 3 
31360 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20  or more tables, 
31370 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73  track the 10 bes
31380 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43  t paths */.  mxC
31390 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3d 3d  hoice = (nLoop==
313a0 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d  1) ? 1 : (nLoop=
313b0 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20  =2 ? 5 : 10);.  
313c0 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70  assert( nLoop<=p
313d0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
313e0 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45  >nSrc );.  WHERE
313f0 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d  TRACE(0x002, ("-
31400 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72  --- begin solver
31410 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  \n"));..  /* All
31420 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
31430 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61  lize space for a
31440 54 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a  To and aFrom */.
31450 20 20 69 69 20 3d 20 28 73 69 7a 65 6f 66 28 57    ii = (sizeof(W
31460 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66  herePath)+sizeof
31470 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f  (WhereLoop*)*nLo
31480 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a  op)*mxChoice*2;.
31490 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74    pSpace = sqlit
314a0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
314b0 2c 20 69 69 29 3b 0a 20 20 69 66 28 20 70 53 70  , ii);.  if( pSp
314c0 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
314d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
314e0 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68  aTo = (WherePath
314f0 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f  *)pSpace;.  aFro
31500 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65  m = aTo+mxChoice
31510 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d  ;.  memset(aFrom
31520 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f  , 0, sizeof(aFro
31530 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28  m[0]));.  pX = (
31540 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72  WhereLoop**)(aFr
31550 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20  om+mxChoice);.  
31560 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a  for(ii=mxChoice*
31570 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69  2, pFrom=aTo; ii
31580 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b  >0; ii--, pFrom+
31590 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b  +, pX += nLoop){
315a0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  .    pFrom->aLoo
315b0 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f  p = pX;.  }..  /
315c0 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63  * Seed the searc
315d0 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  h with a single 
315e0 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69  WherePath contai
315f0 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c  ning zero WhereL
31600 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oops..  **.  ** 
31610 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c  TUNING: Do not l
31620 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
31630 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61   iterations go a
31640 62 6f 76 65 20 32 35 2e 20 20 49 66 20 74 68 65  bove 25.  If the
31650 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f   cost.  ** of co
31660 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d  mputing an autom
31670 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f  atic index is no
31680 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68  t paid back with
31690 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 35 0a  in the first 25.
316a0 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20    ** rows, then 
316b0 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61  do not use the a
316c0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20  utomatic index. 
316d0 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52  */.  aFrom[0].nR
316e0 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d  ow = MIN(pParse-
316f0 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36 29  >nQueryLoop, 46)
31700 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 77  ;  assert( 46==w
31710 68 65 72 65 43 6f 73 74 28 32 35 29 20 29 3b 0a  hereCost(25) );.
31720 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20    nFrom = 1;..  
31730 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 20 74 68  /* Precompute th
31740 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  e cost of sortin
31750 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75  g the final resu
31760 6c 74 20 73 65 74 2c 20 69 66 20 74 68 65 20 63  lt set, if the c
31770 61 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73 71  aller.  ** to sq
31780 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
31790 29 20 77 61 73 20 63 6f 6e 63 65 72 6e 65 64 20  ) was concerned 
317a0 61 62 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a 2f  about sorting */
317b0 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 30  .  rSortCost = 0
317c0 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
317d0 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e  pOrderBy==0 || n
317e0 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20  RowEst==0 ){.   
317f0 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
31800 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  redValid = 1;.  
31810 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 55  }else{.    /* TU
31820 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20  NING: Estimated 
31830 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
31840 69 73 20 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65  is N*log2(N) whe
31850 72 65 20 4e 20 69 73 20 74 68 65 0a 20 20 20 20  re N is the.    
31860 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ** number of out
31870 70 75 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20  put rows. */.   
31880 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f   rSortCost = nRo
31890 77 45 73 74 20 2b 20 65 73 74 4c 6f 67 28 6e 52  wEst + estLog(nR
318a0 6f 77 45 73 74 29 3b 0a 20 20 20 20 57 48 45 52  owEst);.    WHER
318b0 45 54 52 41 43 45 28 30 78 30 30 32 2c 28 22 2d  ETRACE(0x002,("-
318c0 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d  --- sort cost=%-
318d0 33 64 5c 6e 22 2c 20 72 53 6f 72 74 43 6f 73 74  3d\n", rSortCost
318e0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  ));.  }..  /* Co
318f0 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65  mpute successive
31900 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50  ly longer WhereP
31910 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70  aths using the p
31920 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69  revious generati
31930 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65  on.  ** of Where
31940 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73  Paths as the bas
31950 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e  is for the next.
31960 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
31970 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a  the mxChoice.  *
31980 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  * best paths at 
31990 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20  each generation 
319a0 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
319b0 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
319c0 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f  Loop++){.    nTo
319d0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69   = 0;.    for(ii
319e0 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b  =0, pFrom=aFrom;
319f0 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c   ii<nFrom; ii++,
31a00 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
31a10 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e   for(pWLoop=pWIn
31a20 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f  fo->pLoops; pWLo
31a30 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f  op; pWLoop=pWLoo
31a40 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
31a50 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
31a60 61 73 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  askNew;.        
31a70 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20  Bitmask revMask 
31a80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20  = 0;.        u8 
31a90 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
31aa0 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
31ab0 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20  dValid;.        
31ac0 75 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70  u8 isOrdered = p
31ad0 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b  From->isOrdered;
31ae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
31af0 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e  Loop->prereq & ~
31b00 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
31b10 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
31b20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c          if( (pWL
31b30 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20  oop->maskSelf & 
31b40 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
31b50 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
31b60 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
31b70 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70  is point, pWLoop
31b80 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
31b90 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c  to be the next l
31ba0 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  oop. .        **
31bb0 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73   Compute its cos
31bc0 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 43 6f  t */.        rCo
31bd0 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64  st = whereCostAd
31be0 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70  d(pWLoop->rSetup
31bf0 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20  ,pWLoop->rRun + 
31c00 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20  pFrom->nRow);.  
31c10 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68        rCost = wh
31c20 65 72 65 43 6f 73 74 41 64 64 28 72 43 6f 73 74  ereCostAdd(rCost
31c30 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b  , pFrom->rCost);
31c40 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20  .        nOut = 
31c50 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57  pFrom->nRow + pW
31c60 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20  Loop->nOut;.    
31c70 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46      maskNew = pF
31c80 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
31c90 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
31ca0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  ;.        if( !i
31cb0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 29 7b  sOrderedValid ){
31cc0 0a 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63  .          switc
31cd0 68 28 20 77 68 65 72 65 50 61 74 68 53 61 74 69  h( wherePathSati
31ce0 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
31cf0 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
31d00 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
31d10 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46  fo->pOrderBy, pF
31d20 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74  rom, pWInfo->wct
31d30 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  rlFlags,.       
31d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d50 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26  iLoop, pWLoop, &
31d60 72 65 76 4d 61 73 6b 29 20 29 7b 0a 20 20 20 20  revMask) ){.    
31d70 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20          case 1: 
31d80 20 2f 2a 20 59 65 73 2e 20 20 70 46 72 6f 6d 2b   /* Yes.  pFrom+
31d90 70 57 4c 6f 6f 70 20 64 6f 65 73 20 73 61 74 69  pWLoop does sati
31da0 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
31db0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
31dc0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
31dd0 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ed = 1;.        
31de0 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
31df0 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
31e00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
31e10 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
31e20 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70 46 72 6f  0:  /* No.  pFro
31e30 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c 20 72 65  m+pWLoop will re
31e40 71 75 69 72 65 20 61 20 73 65 70 61 72 61 74 65  quire a separate
31e50 20 73 6f 72 74 20 2a 2f 0a 20 20 20 20 20 20 20   sort */.       
31e60 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
31e70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
31e80 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c      isOrderedVal
31e90 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
31ea0 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68        rCost = wh
31eb0 65 72 65 43 6f 73 74 41 64 64 28 72 43 6f 73 74  ereCostAdd(rCost
31ec0 2c 20 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20 20  , rSortCost);.  
31ed0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
31ee0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  k;.            d
31ef0 65 66 61 75 6c 74 3a 20 2f 2a 20 43 61 6e 6e 6f  efault: /* Canno
31f00 74 20 74 65 6c 6c 20 79 65 74 2e 20 20 54 72 79  t tell yet.  Try
31f10 20 61 67 61 69 6e 20 6f 6e 20 74 68 65 20 6e 65   again on the ne
31f20 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a  xt iteration */.
31f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
31f40 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
31f50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
31f60 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73            revMas
31f70 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
31f80 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  op;.        }.  
31f90 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
31fa0 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20  o see if pWLoop 
31fb0 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20  should be added 
31fc0 74 6f 20 74 68 65 20 6d 78 43 68 6f 69 63 65 20  to the mxChoice 
31fd0 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20  best so far */. 
31fe0 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c         for(jj=0,
31ff0 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f   pTo=aTo; jj<nTo
32000 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
32010 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
32020 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73  o->maskLoop==mas
32030 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20  kNew.           
32040 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  && pTo->isOrdere
32050 64 56 61 6c 69 64 3d 3d 69 73 4f 72 64 65 72 65  dValid==isOrdere
32060 64 56 61 6c 69 64 0a 20 20 20 20 20 20 20 20 20  dValid.         
32070 20 20 26 26 20 28 28 70 54 6f 2d 3e 72 43 6f 73    && ((pTo->rCos
32080 74 3c 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d  t<=rCost && pTo-
32090 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 7c 7c 0a  >nRow<=nOut) ||.
320a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320b0 28 70 54 6f 2d 3e 72 43 6f 73 74 3e 3d 72 43 6f  (pTo->rCost>=rCo
320c0 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3e  st && pTo->nRow>
320d0 3d 6e 4f 75 74 29 29 0a 20 20 20 20 20 20 20 20  =nOut)).        
320e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
320f0 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e   testcase( jj==n
32100 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  To-1 );.        
32110 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
32120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
32130 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e  .        if( jj>
32140 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  =nTo ){.        
32150 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f    if( nTo>=mxCho
32160 69 63 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  ice .           
32170 26 26 20 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74  && (rCost>mxCost
32180 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f   || (rCost==mxCo
32190 73 74 20 26 26 20 6e 4f 75 74 3e 3d 6d 78 4f 75  st && nOut>=mxOu
321a0 74 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  t)).          ){
321b0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
321c0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
321d0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
321e0 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
321f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32200 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
32210 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20  intf("Skip   %s 
32220 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
32230 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
32240 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
32250 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
32260 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
32270 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
32280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32290 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
322a0 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27  ? (isOrdered ? '
322b0 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
322c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
322d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
322e0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
322f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32300 20 20 20 2f 2a 20 41 64 64 20 61 20 6e 65 77 20     /* Add a new 
32310 50 61 74 68 20 74 6f 20 74 68 65 20 61 54 6f 5b  Path to the aTo[
32320 5d 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 20  ] set */.       
32330 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f     if( nTo<mxCho
32340 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
32350 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74     /* Increase t
32360 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
32370 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f  To set by one */
32380 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
32390 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  = nTo++;.       
323a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
323b0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74        /* New pat
323c0 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 70  h replaces the p
323d0 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65  rior worst to ke
323e0 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d  ep count below m
323f0 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20  xChoice */.     
32400 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b         jj = mxI;
32410 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32420 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54         pTo = &aT
32430 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48  o[jj];.#ifdef WH
32440 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
32450 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
32460 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
32470 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
32480 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
32490 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25  Printf("New    %
324a0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
324b0 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
324c0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
324d0 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
324e0 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
324f0 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
32500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
32510 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
32520 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  (isOrdered ? 'Y'
32530 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
32540 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
32550 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  if.        }else
32560 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
32570 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73  pTo->rCost<=rCos
32580 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d  t && pTo->nRow<=
32590 6e 4f 75 74 20 29 7b 0a 23 69 66 64 65 66 20 57  nOut ){.#ifdef W
325a0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
325b0 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  D.            if
325c0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
325d0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
325e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
325f0 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
32600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
32610 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25  Skip   %s cost=%
32620 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
32630 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
32640 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
32650 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
32660 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
32670 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
32680 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
32690 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64  edValid ? (isOrd
326a0 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
326b0 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
326c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
326d0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76  ebugPrintf("   v
326e0 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  s %s cost=%-3d,%
326f0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
32700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32710 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
32720 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
32730 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
32740 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
32750 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
32760 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
32770 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20  (pTo->isOrdered 
32780 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
32790 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
327a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
327b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
327c0 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73  pTo->rCost==rCos
327d0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t );.           
327e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
327f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32800 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e   testcase( pTo->
32810 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29  rCost==rCost+1 )
32820 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;.          /* A
32830 20 6e 65 77 20 61 6e 64 20 62 65 74 74 65 72 20   new and better 
32840 73 63 6f 72 65 20 66 6f 72 20 61 20 70 72 65 76  score for a prev
32850 69 6f 75 73 6c 79 20 63 72 65 61 74 65 64 20 65  iously created e
32860 71 75 69 76 61 6c 65 6e 74 20 70 61 74 68 20 2a  quivalent path *
32870 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
32880 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
32890 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
328a0 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
328b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
328c0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
328d0 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
328e0 20 20 20 22 55 70 64 61 74 65 20 25 73 20 63 6f     "Update %s co
328f0 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65  st=%-3d,%3d orde
32900 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
32910 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
32920 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
32930 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
32940 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
32950 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
32960 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64  edValid ? (isOrd
32970 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
32980 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
32990 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
329a0 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20  ugPrintf("  was 
329b0 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
329c0 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
329d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
329e0 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
329f0 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
32a00 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
32a10 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
32a20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
32a30 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d  redValid ? (pTo-
32a40 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  >isOrdered ? 'Y'
32a50 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
32a60 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
32a70 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
32a80 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69       /* pWLoop i
32a90 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64  s a winner.  Add
32aa0 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f   it to the set o
32ab0 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f  f best so far */
32ac0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61  .        pTo->ma
32ad0 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  skLoop = pFrom->
32ae0 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
32af0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
32b00 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f       pTo->revLoo
32b10 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  p = revMask;.   
32b20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d       pTo->nRow =
32b30 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70   nOut;.        p
32b40 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73  To->rCost = rCos
32b50 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
32b60 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
32b70 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b   isOrderedValid;
32b80 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73  .        pTo->is
32b90 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65  Ordered = isOrde
32ba0 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  red;.        mem
32bb0 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20  cpy(pTo->aLoop, 
32bc0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69  pFrom->aLoop, si
32bd0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29  zeof(WhereLoop*)
32be0 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  *iLoop);.       
32bf0 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f   pTo->aLoop[iLoo
32c00 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20  p] = pWLoop;.   
32c10 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
32c20 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
32c30 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20      mxI = 0;.   
32c40 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
32c50 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20  aTo[0].rCost;.  
32c60 20 20 20 20 20 20 20 20 6d 78 4f 75 74 20 3d 20          mxOut = 
32c70 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20  aTo[0].nRow;.   
32c80 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c         for(jj=1,
32c90 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a   pTo=&aTo[1]; jj
32ca0 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c  <mxChoice; jj++,
32cb0 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
32cc0 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
32cd0 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 70  ost>mxCost || (p
32ce0 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73  To->rCost==mxCos
32cf0 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3e 6d  t && pTo->nRow>m
32d00 78 4f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 20  xOut) ){.       
32d10 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
32d20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20  pTo->rCost;.    
32d30 20 20 20 20 20 20 20 20 20 20 6d 78 4f 75 74 20            mxOut 
32d40 3d 20 70 54 6f 2d 3e 6e 52 6f 77 3b 0a 20 20 20  = pTo->nRow;.   
32d50 20 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d             mxI =
32d60 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20   jj;.           
32d70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
32d80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32d90 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57  .    }..#ifdef W
32da0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
32db0 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
32dc0 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20 29  3WhereTrace>=2 )
32dd0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
32de0 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d  ebugPrintf("----
32df0 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20   after round %d 
32e00 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b  ----\n", iLoop);
32e10 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c  .      for(ii=0,
32e20 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f   pTo=aTo; ii<nTo
32e30 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; ii++, pTo++){.
32e40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
32e50 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73 20  ebugPrintf(" %s 
32e60 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25  cost=%-3d nrow=%
32e70 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  -3d order=%c",. 
32e80 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
32e90 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
32ea0 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
32eb0 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
32ec0 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d  .           pTo-
32ed0 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  >isOrderedValid 
32ee0 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
32ef0 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
32f00 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69   '?');.        i
32f10 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  f( pTo->isOrdere
32f20 64 56 61 6c 69 64 20 26 26 20 70 54 6f 2d 3e 69  dValid && pTo->i
32f30 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20  sOrdered ){.    
32f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
32f50 75 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30  ugPrintf(" rev=0
32f60 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72  x%llx\n", pTo->r
32f70 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  evLoop);.       
32f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32f90 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
32fa0 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
32fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
32fc0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
32fd0 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65  /* Swap the role
32fe0 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61  s of aFrom and a
32ff0 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  To for the next 
33000 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
33010 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20    pFrom = aTo;. 
33020 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a     aTo = aFrom;.
33030 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f      aFrom = pFro
33040 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e  m;.    nFrom = n
33050 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e  To;.  }..  if( n
33060 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  From==0 ){.    s
33070 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
33080 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79  Parse, "no query
33090 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20   solution");.   
330a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
330b0 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20  b, pSpace);.    
330c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
330d0 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ROR;.  }.  .  /*
330e0 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74   Find the lowest
330f0 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72   cost path.  pFr
33100 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20  om will be left 
33110 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74  pointing to that
33120 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d   path */.  pFrom
33130 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28   = aFrom;.  for(
33140 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  ii=1; ii<nFrom; 
33150 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
33160 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f  From->rCost>aFro
33170 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46  m[ii].rCost ) pF
33180 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d  rom = &aFrom[ii]
33190 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
331a0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
331b0 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f  nLoop );.  /* Lo
331c0 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  ad the lowest co
331d0 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49  st path into pWI
331e0 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  nfo */.  for(iLo
331f0 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
33200 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
33210 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
33220 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20  vel = pWInfo->a 
33230 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65  + iLoop;.    pLe
33240 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57  vel->pWLoop = pW
33250 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c  Loop = pFrom->aL
33260 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20  oop[iLoop];.    
33270 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20  pLevel->iFrom = 
33280 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20  pWLoop->iTab;.  
33290 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75    pLevel->iTabCu
332a0 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  r = pWInfo->pTab
332b0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
332c0 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a  iFrom].iCursor;.
332d0 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66    }.  if( (pWInf
332e0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
332f0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
33300 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70  NCT)!=0.   && (p
33310 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
33320 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
33330 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70  CTBY)==0.   && p
33340 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
33350 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
33360 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77  _NOOP.   && nRow
33370 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74  Est.  ){.    Bit
33380 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20  mask notUsed;.  
33390 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65    int rc = where
333a0 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
333b0 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49  erBy(pWInfo, pWI
333c0 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c  nfo->pResultSet,
333d0 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20   pFrom,.        
333e0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 44           WHERE_D
333f0 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70  ISTINCTBY, nLoop
33400 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  -1, pFrom->aLoop
33410 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55  [nLoop-1], &notU
33420 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sed);.    if( rc
33430 3d 3d 31 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44  ==1 ) pWInfo->eD
33440 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
33450 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
33460 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 6f  ;.  }.  if( pFro
33470 6d 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a  m->isOrdered ){.
33480 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
33490 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
334a0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b  RE_DISTINCTBY ){
334b0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
334c0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
334d0 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
334e0 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
334f0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53      pWInfo->bOBS
33500 61 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 57  at = 1;.      pW
33510 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
33520 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
33530 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e      }.  }.  pWIn
33540 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46  fo->nRowOut = pF
33550 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a  rom->nRow;..  /*
33560 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20   Free temporary 
33570 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72  memory and retur
33580 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73  n success */.  s
33590 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
335a0 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75   pSpace);.  retu
335b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
335c0 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72  ./*.** Most quer
335d0 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73  ies use only a s
335e0 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65  ingle table (the
335f0 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29  y are not joins)
33600 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d   and have.** sim
33610 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ple == constrain
33620 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78  ts against index
33630 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73  ed fields.  This
33640 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
33650 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f  s.** to plan tho
33660 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20  se simple cases 
33670 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20  using much less 
33680 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68  ceremony than th
33690 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72  e.** general-pur
336a0 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e  pose query plann
336b0 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20  er, and thereby 
336c0 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c  yield faster sql
336d0 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a  ite3_prepare().*
336e0 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20  * times for the 
336f0 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a  common case..**.
33700 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
33710 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69  ro on success, i
33720 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  f this query can
33730 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74   be handled by t
33740 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73  his.** no-frills
33750 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20   query planner. 
33760 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20   Return zero if 
33770 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73  this query needs
33780 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c   the .** general
33790 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70  -purpose query p
337a0 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  lanner..*/.stati
337b0 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74  c int whereShort
337c0 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  Cut(WhereLoopBui
337d0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
337e0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
337f0 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53  Info;.  struct S
33800 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
33810 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  em;.  WhereClaus
33820 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54  e *pWC;.  WhereT
33830 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68  erm *pTerm;.  Wh
33840 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a  ereLoop *pLoop;.
33850 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e    int iCur;.  in
33860 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  t j;.  Table *pT
33870 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
33880 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d  x;.  .  pWInfo =
33890 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
338a0 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  o;.  if( pWInfo-
338b0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
338c0 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20  ERE_FORCE_TABLE 
338d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
338e0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54  sert( pWInfo->pT
338f0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20  abList->nSrc>=1 
33900 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49  );.  pItem = pWI
33910 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
33920 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d  ;.  pTab = pItem
33930 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73  ->pTab;.  if( Is
33940 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
33950 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
33960 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20  pItem->zIndex ) 
33970 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72  return 0;.  iCur
33980 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
33990 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  r;.  pWC = &pWIn
339a0 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70  fo->sWC;.  pLoop
339b0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
339c0 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  w;.  pLoop->wsFl
339d0 61 67 73 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d  ags = 0;.  pTerm
339e0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
339f0 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
33a00 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  _EQ, 0);.  if( p
33a10 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  Term ){.    pLoo
33a20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
33a30 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
33a40 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45  RE_IPK|WHERE_ONE
33a50 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  ROW;.    pLoop->
33a60 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
33a70 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  m;.    pLoop->nL
33a80 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c  Term = 1;.    pL
33a90 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
33aa0 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e   = 1;.    /* TUN
33ab0 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72  ING: Cost of a r
33ac0 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31  owid lookup is 1
33ad0 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 */.    pLoop->
33ae0 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33  rRun = 33;  /* 3
33af0 33 3d 3d 77 68 65 72 65 43 6f 73 74 28 31 30 29  3==whereCost(10)
33b00 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
33b10 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
33b20 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
33b30 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
33b40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33b50 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
33b60 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  e==pLoop->aLTerm
33b70 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
33b80 28 20 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f  ( ArraySize(pLoo
33b90 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3d  p->aLTermSpace)=
33ba0 3d 34 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =4 );.      if( 
33bb0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
33bc0 45 5f 4e 6f 6e 65 20 0a 20 20 20 20 20 20 20 7c  E_None .       |
33bd0 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  | pIdx->pPartIdx
33be0 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20  Where!=0 .      
33bf0 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   || pIdx->nColum
33c00 6e 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f  n>ArraySize(pLoo
33c10 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20  p->aLTermSpace) 
33c20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75  .      ) continu
33c30 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  e;.      for(j=0
33c40 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; j<pIdx->nColum
33c50 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
33c60 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
33c70 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 49 64  m(pWC, iCur, pId
33c80 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20  x->aiColumn[j], 
33c90 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b  0, WO_EQ, pIdx);
33ca0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
33cb0 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rm==0 ) break;. 
33cc0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
33cd0 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b  Term[j] = pTerm;
33ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
33cf0 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 43 6f 6c  f( j!=pIdx->nCol
33d00 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
33d10 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46        pLoop->wsF
33d20 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
33d30 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45  UMN_EQ|WHERE_ONE
33d40 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45  ROW|WHERE_INDEXE
33d50 44 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 49  D;.      if( (pI
33d60 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e  tem->colUsed & ~
33d70 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70  columnsInIndex(p
33d80 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Idx))==0 ){.    
33d90 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
33da0 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f  gs |= WHERE_IDX_
33db0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ONLY;.      }.  
33dc0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
33dd0 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  m = j;.      pLo
33de0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
33df0 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  = j;.      pLoop
33e00 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
33e10 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f   = pIdx;.      /
33e20 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
33e30 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  f a unique index
33e40 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f   lookup is 15 */
33e50 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  .      pLoop->rR
33e60 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d  un = 39;  /* 39=
33e70 3d 77 68 65 72 65 43 6f 73 74 28 31 35 29 20 2a  =whereCost(15) *
33e80 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
33e90 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
33ea0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b  Loop->wsFlags ){
33eb0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  .    pLoop->nOut
33ec0 20 3d 20 28 57 68 65 72 65 43 6f 73 74 29 31 3b   = (WhereCost)1;
33ed0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
33ee0 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70  ].pWLoop = pLoop
33ef0 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73  ;.    pLoop->mas
33f00 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28  kSelf = getMask(
33f10 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
33f20 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57  t, iCur);.    pW
33f30 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43  Info->a[0].iTabC
33f40 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  ur = iCur;.    p
33f50 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d  WInfo->nRowOut =
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 70 4f 72 64 65 72 42 79 20 29 20 70  fo->pOrderBy ) p
33f80 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20  WInfo->bOBSat = 
33f90 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   1;.    if( pWIn
33fa0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
33fb0 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
33fc0 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57  INCT ){.      pW
33fd0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
33fe0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
33ff0 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23  _UNIQUE;.    }.#
34000 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
34010 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49  UG.    pLoop->cI
34020 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a  d = '0';.#endif.
34030 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
34040 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
34050 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
34060 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
34070 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66   the loop used f
34080 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  or WHERE clause 
34090 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54  processing..** T
340a0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
340b0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
340c0 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74  an opaque struct
340d0 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ure that contain
340e0 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  s.** information
340f0 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69   needed to termi
34100 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20  nate the loop.  
34110 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69  Later, the calli
34120 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68  ng routine.** sh
34130 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69  ould invoke sqli
34140 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69  te3WhereEnd() wi
34150 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  th the return va
34160 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
34170 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  tion.** in order
34180 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
34190 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
341a0 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
341b0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
341c0 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  rs, this routine
341d0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a   returns NULL..*
341e0 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69  *.** The basic i
341f0 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e  dea is to do a n
34200 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20  ested loop, one 
34210 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61  loop for each ta
34220 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52  ble in.** the FR
34230 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73  OM clause of a s
34240 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20  elect.  (INSERT 
34250 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65  and UPDATE state
34260 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a  ments are the.**
34270 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43   same as a SELEC
34280 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69  T with only a si
34290 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68  ngle table in th
342a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20  e FROM clause.) 
342b0 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c   For.** example,
342c0 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74   if the SQL is t
342d0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
342e0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
342f0 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20  1, t2, t3 WHERE 
34300 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...;.**.** Then 
34310 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
34320 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c  ed is conceptual
34330 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c  ly like the foll
34340 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
34350 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
34360 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20  n t1 do       \ 
34370 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65     Code generate
34380 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65  d.**        fore
34390 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
343a0 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71  o      |-- by sq
343b0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
343c0 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f  ).**          fo
343d0 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33  reach row3 in t3
343e0 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20   do   /.**      
343f0 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
34400 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
34410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20                \ 
34420 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65     Code generate
34430 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20  d.**        end 
34440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34450 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71         |-- by sq
34460 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a  lite3WhereEnd().
34470 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20  **      end     
34480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34490 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65      /.**.** Note
344a0 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20   that the loops 
344b0 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73  might not be nes
344c0 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  ted in the order
344d0 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a   in which they.*
344e0 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  * appear in the 
344f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61  FROM clause if a
34500 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
34510 20 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20   is better able 
34520 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f  to make.** use o
34530 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65  f indices.  Note
34540 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20   also that when 
34550 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
34560 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68  appears in.** th
34570 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
34580 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  it might result 
34590 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65  in additional ne
345a0 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a  sted loops for.*
345b0 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  * scanning throu
345c0 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e  gh all values on
345d0 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
345e0 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a  side of the IN..
345f0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
34600 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73  Btree cursors as
34610 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
34620 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73  ch table.  t1 us
34630 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d  es cursor.** num
34640 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ber pTabList->a[
34650 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20  0].iCursor.  t2 
34660 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20  uses the cursor 
34670 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69  pTabList->a[1].i
34680 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73  Cursor..** And s
34690 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72  o forth.  This r
346a0 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
346b0 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68   code to open th
346c0 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73  ose VDBE cursors
346d0 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57  .** and sqlite3W
346e0 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61  hereEnd() genera
346f0 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20  tes the code to 
34700 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  close them..**.*
34710 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20  * The code that 
34720 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
34730 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65  n() generates le
34740 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73  aves the cursors
34750 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61   named.** in pTa
34760 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61  bList pointing a
34770 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69  t their appropri
34780 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68  ate entries.  Th
34790 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20  e [...] code.** 
347a0 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d  can use OP_Colum
347b0 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f  n and OP_Rowid o
347c0 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20  pcodes on these 
347d0 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61  cursors to extra
347e0 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  ct.** data from 
347f0 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c  the various tabl
34800 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  es of the loop..
34810 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45  **.** If the WHE
34820 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70  RE clause is emp
34830 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20  ty, the foreach 
34840 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20  loops must each 
34850 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e  scan their.** en
34860 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68  tire tables.  Th
34870 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a  us a three-way j
34880 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29  oin is an O(N^3)
34890 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74   operation.  But
348a0 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
348b0 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61  s have indices a
348c0 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72  nd there are ter
348d0 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
348e0 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72  clause that.** r
348f0 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e  efer to those in
34900 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74  dices, a complet
34910 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e  e table scan can
34920 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20   be avoided and 
34930 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c  the.** code will
34940 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72   run much faster
34950 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77  .  Most of the w
34960 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ork of this rout
34970 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a  ine is checking.
34980 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ** to see if the
34990 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74  re are indices t
349a0 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
349b0 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20  to speed up the 
349c0 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  loop..**.** Term
349d0 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
349e0 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75  lause are also u
349f0 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69  sed to limit whi
34a00 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79  ch rows actually
34a10 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74  .** make it to t
34a20 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20  he "..." in the 
34a30 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f  middle of the lo
34a40 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  op.  After each 
34a50 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65  "foreach",.** te
34a60 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
34a70 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65   clause that use
34a80 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74   only terms in t
34a90 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74  hat loop and out
34aa0 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20  er.** loops are 
34ab0 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66  evaluated and if
34ac0 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73   false a jump is
34ad0 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c   made around all
34ae0 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69   subsequent.** i
34af0 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61  nner loops (or a
34b00 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20  round the "..." 
34b10 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75  if the test occu
34b20 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e  rs within the in
34b30 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f  ner-.** most loo
34b40 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a  p).**.** OUTER J
34b50 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75  OINS.**.** An ou
34b60 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c  ter join of tabl
34b70 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20  es t1 and t2 is 
34b80 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65  conceptally code
34b90 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
34ba0 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72  .**    foreach r
34bb0 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20  ow1 in t1 do.** 
34bc0 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a       flag = 0.**
34bd0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
34be0 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20  w2 in t2 do.**  
34bf0 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20        start:.** 
34c00 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
34c10 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20           flag = 
34c20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a  1.**      end.**
34c30 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30        if flag==0
34c40 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20   then.**        
34c50 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75  move the row2 cu
34c60 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72  rsor to a null r
34c70 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74  ow.**        got
34c80 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20  o start.**      
34c90 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a  fi.**    end.**.
34ca0 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55  ** ORDER BY CLAU
34cb0 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a  SE PROCESSING.**
34cc0 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20  .** pOrderBy is 
34cd0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
34ce0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
34cf0 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42   (or the GROUP B
34d00 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74  Y clause.** if t
34d10 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  he WHERE_GROUPBY
34d20 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20   flag is set in 
34d30 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61  wctrlFlags) of a
34d40 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
34d50 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  t.** if there is
34d60 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20   one.  If there 
34d70 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  is no ORDER BY c
34d80 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73  lause or if this
34d90 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
34da0 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50  alled from an UP
34db0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
34dc0 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70  tatement, then p
34dd0 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e  OrderBy is NULL.
34de0 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73  .*/.WhereInfo *s
34df0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
34e00 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
34e10 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
34e20 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
34e30 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
34e40 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 46 52  abList,    /* FR
34e50 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73  OM clause: A lis
34e60 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  t of all tables 
34e70 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f  to be scanned */
34e80 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
34e90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
34ea0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
34eb0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
34ec0 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52  erBy,   /* An OR
34ed0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f  DER BY clause, o
34ee0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  r NULL */.  Expr
34ef0 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74  List *pResultSet
34f00 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 20  , /* Result set 
34f10 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
34f20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
34f30 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  ,       /* One o
34f40 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  f the WHERE_* fl
34f50 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
34f60 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20  qliteInt.h */.  
34f70 69 6e 74 20 69 49 64 78 43 75 72 20 20 20 20 20  int iIdxCur     
34f80 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52        /* If WHER
34f90 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
34fa0 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75  is set, index cu
34fb0 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  rsor number */.)
34fc0 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e  {.  int nByteWIn
34fd0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
34fe0 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c  * Num. bytes all
34ff0 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65  ocated for Where
35000 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20  Info struct */. 
35010 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20   int nTabList;  
35020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
35030 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
35040 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f  s in pTabList */
35050 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
35060 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a  Info;         /*
35070 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   Will become the
35080 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
35090 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
350a0 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
350b0 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f  arse->pVdbe;   /
350c0 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61  * The virtual da
350d0 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f  tabase engine */
350e0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
350f0 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ady;          /*
35100 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   Cursors that ar
35110 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69  e not yet positi
35120 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oned */.  WhereL
35130 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b  oopBuilder sWLB;
35140 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
35150 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f  eLoop builder */
35160 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
35170 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a  *pMaskSet;    /*
35180 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
35190 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68  mask set */.  Wh
351a0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
351b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69  ;        /* A si
351c0 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57  ngle level in pW
351d0 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57  Info->a[] */.  W
351e0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
351f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
35200 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65  nter to a single
35210 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
35220 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  t */.  int ii;  
35230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35240 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
35250 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
35260 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
35270 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
35280 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
35290 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
352a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
352b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f  rn code */...  /
352c0 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69  * Variable initi
352d0 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64  alization */.  d
352e0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
352f0 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20    memset(&sWLB, 
35300 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29  0, sizeof(sWLB))
35310 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  ;.  sWLB.pOrderB
35320 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20  y = pOrderBy;.. 
35330 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20   /* Disable the 
35340 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a  DISTINCT optimiz
35350 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ation if SQLITE_
35360 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73  DistinctOpt is s
35370 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69  et via.  ** sqli
35380 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51  te3_test_ctrl(SQ
35390 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
353a0 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29  TIMIZATIONS,...)
353b0 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
353c0 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
353d0 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  b, SQLITE_Distin
353e0 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63  ctOpt) ){.    wc
353f0 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  trlFlags &= ~WHE
35400 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
35410 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
35420 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  number of tables
35430 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
35440 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
35450 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
35460 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42    ** bits in a B
35470 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74  itmask .  */.  t
35480 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73  estcase( pTabLis
35490 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a  t->nSrc==BMS );.
354a0 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
354b0 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20  nSrc>BMS ){.    
354c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
354d0 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
354e0 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
354f0 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20  join", BMS);.   
35500 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
35510 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
35520 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65  on normally gene
35530 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c  rates a nested l
35540 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  oop for all tabl
35550 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62  es in .  ** pTab
35560 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68  List.  But if th
35570 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  e WHERE_ONETABLE
35580 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
35590 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c  t, then we shoul
355a0 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65  d.  ** only gene
355b0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
355c0 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e  e first table in
355d0 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73   pTabList and as
355e0 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61  sume that.  ** a
355f0 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ny cursors assoc
35600 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65  iated with subse
35610 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65  quent tables are
35620 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
35630 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20    */.  nTabList 
35640 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  = (wctrlFlags & 
35650 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
35660 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c  NLY) ? 1 : pTabL
35670 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a  ist->nSrc;..  /*
35680 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
35690 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65  itialize the Whe
356a0 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
356b0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
356c0 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72  e the.  ** retur
356d0 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c  n value. A singl
356e0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
356f0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
35700 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a  e WhereInfo.  **
35710 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e   struct, the con
35720 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e  tents of WhereIn
35730 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72  fo.a[], the Wher
35740 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
35750 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57  e.  ** and the W
35760 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
35770 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65  cture. Since Whe
35780 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  reClause contain
35790 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a  s an 8-byte.  **
357a0 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74   field (type Bit
357b0 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65  mask) it must be
357c0 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38   aligned on an 8
357d0 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f  -byte boundary o
357e0 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68  n.  ** some arch
357f0 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65  itectures. Hence
35800 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65   the ROUND8() be
35810 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74  low..  */.  nByt
35820 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28  eWInfo = ROUND8(
35830 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f  sizeof(WhereInfo
35840 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73  )+(nTabList-1)*s
35850 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
35860 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73  ));.  pWInfo = s
35870 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
35880 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66  ro(db, nByteWInf
35890 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65  o + sizeof(Where
358a0 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62  Loop));.  if( db
358b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
358c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
358d0 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
358e0 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b  .    pWInfo = 0;
358f0 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
35900 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  eginError;.  }. 
35910 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
35920 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = nTabList;.  pW
35930 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
35940 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
35950 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
35960 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
35970 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
35980 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rBy;.  pWInfo->p
35990 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65 73  ResultSet = pRes
359a0 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f  ultSet;.  pWInfo
359b0 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ->iBreak = sqlit
359c0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
359d0 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63  v);.  pWInfo->wc
359e0 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c  trlFlags = wctrl
359f0 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d  Flags;.  pWInfo-
35a00 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
35a10 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
35a20 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65  yLoop;.  pMaskSe
35a30 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  t = &pWInfo->sMa
35a40 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57  skSet;.  sWLB.pW
35a50 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20  Info = pWInfo;. 
35a60 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49   sWLB.pWC = &pWI
35a70 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42  nfo->sWC;.  sWLB
35a80 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f  .pNew = (WhereLo
35a90 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49  op*)(((char*)pWI
35aa0 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29  nfo)+nByteWInfo)
35ab0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
35ac0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
35ad0 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20  (sWLB.pNew) );. 
35ae0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73   whereLoopInit(s
35af0 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65  WLB.pNew);.#ifde
35b00 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
35b10 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20   sWLB.pNew->cId 
35b20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20  = '*';.#endif.. 
35b30 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48   /* Split the WH
35b40 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20  ERE clause into 
35b50 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72  separate subexpr
35b60 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61  essions where ea
35b70 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65  ch.  ** subexpre
35b80 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
35b90 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65  ed by an AND ope
35ba0 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e  rator..  */.  in
35bb0 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53  itMaskSet(pMaskS
35bc0 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  et);.  whereClau
35bd0 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e  seInit(&pWInfo->
35be0 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  sWC, pWInfo);.  
35bf0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
35c00 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c  onstants(pParse,
35c10 20 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72   pWhere);.  wher
35c20 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e  eSplit(&pWInfo->
35c30 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f  sWC, pWhere, TK_
35c40 41 4e 44 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  AND);.  sqlite3C
35c50 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
35c60 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20  pParse, -1); /* 
35c70 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69  Insert the cooki
35c80 65 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20  e verifier Goto 
35c90 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65  */.    .  /* Spe
35ca0 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45  cial case: a WHE
35cb0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
35cc0 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61  s constant.  Eva
35cd0 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65  luate the.  ** e
35ce0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69  xpression and ei
35cf0 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61  ther jump over a
35d00 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f  ll of the code o
35d10 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a  r fall thru..  *
35d20 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 26  /.  if( pWhere &
35d30 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c  & (nTabList==0 |
35d40 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  | sqlite3ExprIsC
35d50 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
35d60 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73  Where)) ){.    s
35d70 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
35d80 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  e(pParse, pWhere
35d90 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
35da0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
35db0 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72 65  ULL);.    pWhere
35dc0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
35dd0 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f  Special case: No
35de0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
35df0 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74  /.  if( nTabList
35e00 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
35e10 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f  OrderBy ) pWInfo
35e20 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20 20  ->bOBSat = 1;.  
35e30 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
35e40 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
35e50 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
35e60 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
35e70 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
35e80 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
35e90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67  .  }..  /* Assig
35ea0 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65  n a bit from the
35eb0 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72   bitmask to ever
35ec0 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52  y term in the FR
35ed0 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OM clause..  **.
35ee0 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e    ** When assign
35ef0 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75  ing bitmask valu
35f00 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73  es to FROM claus
35f10 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75  e cursors, it mu
35f20 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63  st be.  ** the c
35f30 61 73 65 20 74 68 61 74 20 69 66 20 58 20 69 73  ase that if X is
35f40 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
35f50 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63   the N-th FROM c
35f60 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a  lause term then.
35f70 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b    ** the bitmask
35f80 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c   for all FROM cl
35f90 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68  ause terms to th
35fa0 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d  e left of the N-
35fb0 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20  th term.  ** is 
35fc0 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72  (X-1).   An expr
35fd0 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ession from the 
35fe0 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c  ON clause of a L
35ff0 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65  EFT JOIN can use
36000 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69  .  ** its Expr.i
36010 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76  RightJoinTable v
36020 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65  alue to find the
36030 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20   bitmask of the 
36040 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a  right table.  **
36050 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53   of the join.  S
36060 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66  ubtracting one f
36070 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74 61  rom the right ta
36080 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65  ble bitmask give
36090 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b  s a.  ** bitmask
360a0 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
360b0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
360c0 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e  he join.  Knowin
360d0 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20  g the bitmask.  
360e0 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ** for all table
360f0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
36100 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20   a left join is 
36110 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b  important.  Tick
36120 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20  et #3015..  **. 
36130 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69   ** Note that bi
36140 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74  tmasks are creat
36150 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c  ed for all pTabL
36160 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73  ist->nSrc tables
36170 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73   in.  ** pTabLis
36180 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20  t, not just the 
36190 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74  first nTabList t
361a0 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74  ables.  nTabList
361b0 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a   is normally.  *
361c0 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c  * equal to pTabL
361d0 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69  ist->nSrc but mi
361e0 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64  ght be shortened
361f0 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a   to 1 if the.  *
36200 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  * WHERE_ONETABLE
36210 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
36220 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  t..  */.  for(ii
36230 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d  =0; ii<pTabList-
36240 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nSrc; ii++){.  
36250 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61    createMask(pMa
36260 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
36270 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
36280 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
36290 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d  BUG.  {.    Bitm
362a0 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20  ask toTheLeft = 
362b0 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  0;.    for(ii=0;
362c0 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53   ii<pTabList->nS
362d0 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  rc; ii++){.     
362e0 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74   Bitmask m = get
362f0 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
36300 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69  TabList->a[ii].i
36310 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61  Cursor);.      a
36320 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f  ssert( (m-1)==to
36330 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  TheLeft );.     
36340 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b   toTheLeft |= m;
36350 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
36360 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  f..  /* Analyze 
36370 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78  all of the subex
36380 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65  pressions.  Note
36390 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a   that exprAnalyz
363a0 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61  e() might.  ** a
363b0 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  dd new virtual t
363c0 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  erms onto the en
363d0 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  d of the WHERE c
363e0 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f  lause.  We do no
363f0 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61  t.  ** want to a
36400 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72  nalyze these vir
36410 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73  tual terms, so s
36420 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61  tart analyzing a
36430 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61  t the end.  ** a
36440 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20  nd work forward 
36450 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65  so that the adde
36460 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  d virtual terms 
36470 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73  are never proces
36480 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72  sed..  */.  expr
36490 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c  AnalyzeAll(pTabL
364a0 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  ist, &pWInfo->sW
364b0 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  C);.  if( db->ma
364c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
364d0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
364e0 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f  nError;.  }..  /
364f0 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42  * If the ORDER B
36500 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  Y (or GROUP BY) 
36510 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
36520 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 67 65  references to ge
36530 6e 65 72 61 6c 0a 20 20 2a 2a 20 65 78 70 72 65  neral.  ** expre
36540 73 73 69 6f 6e 73 2c 20 74 68 65 6e 20 77 65 20  ssions, then we 
36550 77 6f 6e 27 74 20 62 65 20 61 62 6c 65 20 74 6f  won't be able to
36560 20 73 61 74 69 73 66 79 20 69 74 20 75 73 69 6e   satisfy it usin
36570 67 20 69 6e 64 69 63 65 73 2c 20 73 6f 0a 20 20  g indices, so.  
36580 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ** go ahead and 
36590 64 69 73 61 62 6c 65 20 69 74 20 6e 6f 77 2e 0a  disable it now..
365a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
365b0 72 42 79 20 26 26 20 28 77 63 74 72 6c 46 6c 61  rBy && (wctrlFla
365c0 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
365d0 44 49 53 54 49 4e 43 54 29 21 3d 30 20 29 7b 0a  DISTINCT)!=0 ){.
365e0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
365f0 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
36600 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  ; ii++){.      E
36610 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c  xpr *pExpr = sql
36620 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
36630 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
36640 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  ii].pExpr);.    
36650 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
36660 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
36670 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
36680 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
36690 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62  y = 0;.        b
366a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
366b0 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f  e if( pExpr->iCo
366c0 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
366d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
366e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
366f0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
36700 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
36710 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  CT ){.    if( is
36720 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e  DistinctRedundan
36730 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  t(pParse, pTabLi
36740 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  st, &pWInfo->sWC
36750 2c 20 70 52 65 73 75 6c 74 53 65 74 29 20 29 7b  , pResultSet) ){
36760 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49  .      /* The DI
36770 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69  STINCT marking i
36780 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67  s pointless.  Ig
36790 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  nore it. */.    
367a0 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
367b0 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
367c0 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
367d0 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 64 65   }else if( pOrde
367e0 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
367f0 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44 45 52 20  /* Try to ORDER 
36800 42 59 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  BY the result se
36810 74 20 74 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e  t to make distin
36820 63 74 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61  ct processing ea
36830 73 69 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 57  sier */.      pW
36840 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
36850 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e   |= WHERE_DISTIN
36860 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57 49 6e  CTBY;.      pWIn
36870 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  fo->pOrderBy = p
36880 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d  ResultSet;.    }
36890 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74  .  }..  /* Const
368a0 72 75 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f  ruct the WhereLo
368b0 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  op objects */.  
368c0 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
368d0 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  f,("*** Optimize
368e0 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29  r Start ***\n"))
368f0 3b 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74  ;.  if( nTabList
36900 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72  !=1 || whereShor
36910 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29  tCut(&sWLB)==0 )
36920 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  {.    rc = where
36930 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42  LoopAddAll(&sWLB
36940 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
36950 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
36960 72 72 6f 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  rror;.  .    /* 
36970 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74  Display all of t
36980 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
36990 65 63 74 73 20 69 66 20 77 68 65 72 65 74 72 61  ects if wheretra
369a0 63 65 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  ce is enabled */
369b0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
369c0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
369d0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
369e0 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 57 68  race ){.      Wh
369f0 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20  ereLoop *p;.    
36a00 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
36a10 74 61 74 69 63 20 63 68 61 72 20 7a 4c 61 62 65  tatic char zLabe
36a20 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38  l[] = "012345678
36a30 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  9abcdefghijklmno
36a40 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20 20  pqrstuvwyxz".   
36a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a70 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
36a80 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22  LMNOPQRSTUVWYXZ"
36a90 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57  ;.      for(p=pW
36aa0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d  Info->pLoops, i=
36ab0 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  0; p; p=p->pNext
36ac0 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Loop, i++){.    
36ad0 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61      p->cId = zLa
36ae0 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61  bel[i%sizeof(zLa
36af0 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20 77  bel)];.        w
36b00 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c  hereLoopPrint(p,
36b10 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20   pTabList);.    
36b20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
36b30 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61 74  .  .    wherePat
36b40 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
36b50 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
36b60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
36b70 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
36b80 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ror;.    if( pWI
36b90 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  nfo->pOrderBy ){
36ba0 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74  .       wherePat
36bb0 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
36bc0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b  pWInfo->nRowOut+
36bd0 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64  1);.       if( d
36be0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
36bf0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
36c00 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  nError;.    }.  
36c10 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  }.  if( pWInfo->
36c20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28  pOrderBy==0 && (
36c30 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
36c40 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29  TE_ReverseOrder)
36c50 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e  !=0 ){.     pWIn
36c60 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42  fo->revMask = (B
36c70 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d  itmask)(-1);.  }
36c80 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
36c90 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d  Err || NEVER(db-
36ca0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29  >mallocFailed) )
36cb0 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
36cc0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
36cd0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
36ce0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
36cf0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
36d00 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  e ){.    int ii;
36d10 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
36d20 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f  gPrintf("---- So
36d30 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c  lution nRow=%d",
36d40 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
36d50 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
36d60 6f 2d 3e 62 4f 42 53 61 74 20 29 7b 0a 20 20 20  o->bOBSat ){.   
36d70 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
36d80 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d  rintf(" ORDERBY=
36d90 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d  0x%llx", pWInfo-
36da0 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  >revMask);.    }
36db0 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 57 49  .    switch( pWI
36dc0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29  nfo->eDistinct )
36dd0 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
36de0 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
36df0 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
36e00 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
36e10 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69  ("  DISTINCT=uni
36e20 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62  que");.        b
36e30 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
36e40 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
36e50 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a  ISTINCT_ORDERED:
36e60 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
36e70 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
36e80 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65   DISTINCT=ordere
36e90 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d");.        bre
36ea0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
36eb0 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
36ec0 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a  TINCT_UNORDERED:
36ed0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
36ee0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
36ef0 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65   DISTINCT=unorde
36f00 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
36f10 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
36f20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
36f30 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
36f40 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
36f50 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  ii<pWInfo->nLeve
36f60 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  l; ii++){.      
36f70 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
36f80 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c  WInfo->a[ii].pWL
36f90 6f 6f 70 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  oop, pTabList);.
36fa0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
36fb0 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
36fc0 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f   omit tables fro
36fd0 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20  m the join that 
36fe0 64 6f 20 6e 6f 74 20 65 66 66 65 63 74 20 74 68  do not effect th
36ff0 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66  e result */.  if
37000 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
37010 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c  >=2.   && pResul
37020 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20 4f 70  tSet!=0.   && Op
37030 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
37040 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69  d(db, SQLITE_Omi
37050 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a  tNoopJoin).  ){.
37060 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55      Bitmask tabU
37070 73 65 64 20 3d 20 65 78 70 72 4c 69 73 74 54 61  sed = exprListTa
37080 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
37090 74 2c 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a  t, pResultSet);.
370a0 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72      if( sWLB.pOr
370b0 64 65 72 42 79 20 29 20 74 61 62 55 73 65 64 20  derBy ) tabUsed 
370c0 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
370d0 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
370e0 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a  sWLB.pOrderBy);.
370f0 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66      while( pWInf
37100 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a  o->nLevel>=2 ){.
37110 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
37120 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20  *pTerm, *pEnd;. 
37130 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49       pLoop = pWI
37140 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e  nfo->a[pWInfo->n
37150 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b  Level-1].pWLoop;
37160 0a 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e  .      if( (pWIn
37170 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
37180 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f 69  pLoop->iTab].joi
37190 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
371a0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
371b0 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
371c0 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
371d0 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20  DISTINCT)==0.   
371e0 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77      && (pLoop->w
371f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
37200 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20  NEROW)==0.      
37210 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
37220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37230 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20 70  if( (tabUsed & p
37240 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  Loop->maskSelf)!
37250 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
37260 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57    pEnd = sWLB.pW
37270 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d  C->a + sWLB.pWC-
37280 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f  >nTerm;.      fo
37290 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43  r(pTerm=sWLB.pWC
372a0 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b  ->a; pTerm<pEnd;
372b0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
372c0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
372d0 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
372e0 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20  ->maskSelf)!=0. 
372f0 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
37300 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
37310 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
37320 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29  mJoin).        )
37330 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
37340 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
37350 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
37360 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61  Term<pEnd ) brea
37370 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  k;.      WHERETR
37380 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e  ACE(0xffff, ("->
37390 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f   drop loop %c no
373a0 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70  t used\n", pLoop
373b0 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70  ->cId));.      p
373c0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b  WInfo->nLevel--;
373d0 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d  .      nTabList-
373e0 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57  -;.    }.  }.  W
373f0 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
37400 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  ,("*** Optimizer
37410 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22   Finished ***\n"
37420 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50  ));.  pWInfo->pP
37430 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
37440 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77   += pWInfo->nRow
37450 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Out;..  /* If th
37460 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55  e caller is an U
37470 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
37480 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
37490 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a  s requesting.  *
374a0 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70  * to use a one-p
374b0 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64  ass algorithm, d
374c0 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73  etermine if this
374d0 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   is appropriate.
374e0 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61  .  ** The one-pa
374f0 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c  ss algorithm onl
37500 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57  y works if the W
37510 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
37520 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65  traints.  ** the
37530 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70   statement to up
37540 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  date a single ro
37550 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
37560 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
37570 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
37580 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49  SIRED)==0 || pWI
37590 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29  nfo->nLevel==1 )
375a0 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c  ;.  if( (wctrlFl
375b0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
375c0 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
375d0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
375e0 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46  a[0].pWLoop->wsF
375f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
37600 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ROW)!=0 ){.    p
37610 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
37620 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f   = 1;.    pWInfo
37630 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77  ->a[0].pWLoop->w
37640 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  sFlags &= ~WHERE
37650 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a  _IDX_ONLY;.  }..
37660 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61    /* Open all ta
37670 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62  bles in the pTab
37680 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64  List and any ind
37690 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f  ices selected fo
376a0 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67  r.  ** searching
376b0 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
376c0 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
376d0 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
376e0 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c  for(ii=0, pLevel
376f0 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e  =pWInfo->a; ii<n
37700 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70  TabList; ii++, p
37710 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
37720 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
37730 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
37740 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
37750 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
37760 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
37770 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
37780 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  dex */.    struc
37790 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
377a0 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70  pTabItem;..    p
377b0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
377c0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
377d0 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20  From];.    pTab 
377e0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
377f0 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
37800 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
37810 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
37820 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  ma);.    pLoop =
37830 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
37840 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
37850 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
37860 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70  hemeral)!=0 || p
37870 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
37880 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
37890 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ing */.    }else
378a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
378b0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
378c0 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  E.    if( (pLoop
378d0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
378e0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
378f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
37900 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
37910 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
37920 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
37930 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
37940 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
37950 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
37960 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
37970 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
37980 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
37990 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
379a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
379b0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
379c0 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a  .      /* noop *
379d0 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  /.    }else.#end
379e0 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  if.    if( (pLoo
379f0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
37a00 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
37a10 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
37a20 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
37a30 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
37a40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
37a50 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b   op = pWInfo->ok
37a60 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65  OnePass ? OP_Ope
37a70 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e  nWrite : OP_Open
37a80 52 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69  Read;.      sqli
37a90 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
37aa0 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  rse, pTabItem->i
37ab0 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61  Cursor, iDb, pTa
37ac0 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65  b, op);.      te
37ad0 73 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d  stcase( !pWInfo-
37ae0 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
37af0 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  ab->nCol==BMS-1 
37b00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
37b10 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  e( !pWInfo->okOn
37b20 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
37b30 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
37b40 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
37b50 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
37b60 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20  ->nCol<BMS ){.  
37b70 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20        Bitmask b 
37b80 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55  = pTabItem->colU
37b90 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  sed;.        int
37ba0 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
37bb0 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c  for(; b; b=b>>1,
37bc0 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   n++){}.        
37bd0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
37be0 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56 64  eP4(v, sqlite3Vd
37bf0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
37c00 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
37c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
37c30 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29  TR(n), P4_INT32)
37c40 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
37c50 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( n<=pTab->nCol 
37c60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37c70 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
37c80 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
37c90 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
37ca0 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
37cb0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
37cc0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
37cd0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
37ce0 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  XED ){.      Ind
37cf0 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d  ex *pIx = pLoop-
37d00 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
37d10 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
37d20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
37d30 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
37d40 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 2f  e, pIx);.      /
37d50 2a 20 46 49 58 4d 45 3a 20 20 41 73 20 61 6e 20  * FIXME:  As an 
37d60 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 65  optimization use
37d70 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
37d80 6f 72 20 69 66 20 57 48 45 52 45 5f 49 44 58 5f  or if WHERE_IDX_
37d90 4f 4e 4c 59 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ONLY */.      in
37da0 74 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c  t iIndexCur = pL
37db0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
37dc0 69 49 64 78 43 75 72 20 3f 20 69 49 64 78 43 75  iIdxCur ? iIdxCu
37dd0 72 20 3a 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r : pParse->nTab
37de0 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
37df0 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
37e00 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
37e10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
37e20 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20  IndexCur>=0 );. 
37e30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37e40 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
37e50 6e 52 65 61 64 2c 20 69 49 6e 64 65 78 43 75 72  nRead, iIndexCur
37e60 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  , pIx->tnum, iDb
37e70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
37e80 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
37e90 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46  )pKey, P4_KEYINF
37ea0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
37eb0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
37ec0 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61  , "%s", pIx->zNa
37ed0 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  me));.    }.    
37ee0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
37ef0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
37f00 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61  iDb);.    notRea
37f10 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26  dy &= ~getMask(&
37f20 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
37f30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
37f40 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  sor);.  }.  pWIn
37f50 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
37f60 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
37f70 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
37f80 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
37f90 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
37fa0 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
37fb0 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
37fc0 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
37fd0 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
37fe0 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
37ff0 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
38000 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
38010 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
38020 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
38030 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
38040 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
38050 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
38060 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
38070 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65  ; ii++){.    pLe
38080 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
38090 5b 69 69 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51  [ii];.#ifndef SQ
380a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
380b0 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66  TIC_INDEX.    if
380c0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  ( (pLevel->pWLoo
380d0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
380e0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
380f0 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
38100 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  ructAutomaticInd
38110 65 78 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e  ex(pParse, &pWIn
38120 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20  fo->sWC,.       
38130 20 20 20 20 20 20 20 20 20 26 70 54 61 62 4c 69           &pTabLi
38140 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
38150 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20  rom], notReady, 
38160 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69  pLevel);.      i
38170 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
38180 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
38190 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
381a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 65 78 70  }.#endif.    exp
381b0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72  lainOneScan(pPar
381c0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  se, pTabList, pL
381d0 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c  evel, ii, pLevel
381e0 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c  ->iFrom, wctrlFl
381f0 61 67 73 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  ags);.