/ Hex Artifact Content
Login

Artifact 3ea606b1282032b9cc00ee7b1bb9c1d3683f7ea1:


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 0a 2a 2f 0a 74  d reference.*/.t
04c0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
04d0: 65 72 65 43 6c 61 75 73 65 20 57 68 65 72 65 43  ereClause WhereC
04e0: 6c 61 75 73 65 3b 0a 74 79 70 65 64 65 66 20 73  lause;.typedef s
04f0: 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53  truct WhereMaskS
0500: 65 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 3b  et WhereMaskSet;
0510: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0520: 57 68 65 72 65 4f 72 49 6e 66 6f 20 57 68 65 72  WhereOrInfo Wher
0530: 65 4f 72 49 6e 66 6f 3b 0a 74 79 70 65 64 65 66  eOrInfo;.typedef
0540: 20 73 74 72 75 63 74 20 57 68 65 72 65 41 6e 64   struct WhereAnd
0550: 49 6e 66 6f 20 57 68 65 72 65 41 6e 64 49 6e 66  Info WhereAndInf
0560: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0570: 74 20 57 68 65 72 65 4c 65 76 65 6c 20 57 68 65  t WhereLevel Whe
0580: 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65 66  reLevel;.typedef
0590: 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f   struct WhereLoo
05a0: 70 20 57 68 65 72 65 4c 6f 6f 70 3b 0a 74 79 70  p WhereLoop;.typ
05b0: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
05c0: 65 50 61 74 68 20 57 68 65 72 65 50 61 74 68 3b  ePath WherePath;
05d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05e0: 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65 54  WhereTerm WhereT
05f0: 65 72 6d 3b 0a 74 79 70 65 64 65 66 20 73 74 72  erm;.typedef str
0600: 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  uct WhereLoopBui
0610: 6c 64 65 72 20 57 68 65 72 65 4c 6f 6f 70 42 75  lder WhereLoopBu
0620: 69 6c 64 65 72 3b 0a 74 79 70 65 64 65 66 20 73  ilder;.typedef s
0630: 74 72 75 63 74 20 57 68 65 72 65 53 63 61 6e 20  truct WhereScan 
0640: 57 68 65 72 65 53 63 61 6e 3b 0a 0a 2f 2a 0a 2a  WhereScan;../*.*
0650: 2a 20 43 6f 73 74 20 58 20 69 73 20 74 72 61 63  * Cost X is trac
0660: 6b 65 64 20 61 73 20 31 30 2a 6c 6f 67 32 28 58  ked as 10*log2(X
0670: 29 20 73 74 6f 72 65 64 20 69 6e 20 61 20 31 36  ) stored in a 16
0680: 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20 54  -bit integer.  T
0690: 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 63 6f  he.** maximum co
06a0: 73 74 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20  st for ordinary 
06b0: 74 61 62 6c 65 73 20 69 73 20 36 34 2a 28 32 2a  tables is 64*(2*
06c0: 2a 36 33 29 20 77 68 69 63 68 20 62 65 63 6f 6d  *63) which becom
06d0: 65 73 20 36 39 30 30 2e 0a 2a 2a 20 28 56 69 72  es 6900..** (Vir
06e0: 74 75 61 6c 20 74 61 62 6c 65 73 20 63 61 6e 20  tual tables can 
06f0: 72 65 74 75 72 6e 20 61 20 6c 61 72 67 65 72 20  return a larger 
0700: 63 6f 73 74 2c 20 62 75 74 20 6c 65 74 27 73 20  cost, but let's 
0710: 61 73 73 75 6d 65 20 74 68 65 79 20 64 6f 20 6e  assume they do n
0720: 6f 74 2e 29 0a 2a 2a 20 53 6f 20 61 6c 6c 20 63  ot.).** So all c
0730: 6f 73 74 73 20 63 61 6e 20 62 65 20 73 74 6f 72  osts can be stor
0740: 65 64 20 69 6e 20 61 20 31 36 2d 62 69 74 20 75  ed in a 16-bit u
0750: 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
0760: 77 69 74 68 6f 75 74 20 72 69 73 6b 0a 2a 2a 20  without risk.** 
0770: 6f 66 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2a 0a  of overflow..**.
0780: 2a 2a 20 43 6f 73 74 73 20 61 72 65 20 65 73 74  ** Costs are est
0790: 69 6d 61 74 65 73 2c 20 73 6f 20 64 6f 6e 27 74  imates, so don't
07a0: 20 67 6f 20 74 6f 20 74 68 65 20 63 6f 6d 70 75   go to the compu
07b0: 74 61 74 69 6f 6e 61 6c 20 74 72 6f 75 62 6c 65  tational trouble
07c0: 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 31   to compute.** 1
07d0: 30 2a 6c 6f 67 32 28 58 29 20 65 78 61 63 74 6c  0*log2(X) exactl
07e0: 79 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 20 63  y.  Instead, a c
07f0: 6c 6f 73 65 20 65 73 74 69 6d 61 74 65 20 69 73  lose estimate is
0800: 20 75 73 65 64 2e 20 20 41 6e 79 20 76 61 6c 75   used.  Any valu
0810: 65 20 6f 66 0a 2a 2a 20 58 3c 3d 31 20 69 73 20  e of.** X<=1 is 
0820: 73 74 6f 72 65 64 20 61 73 20 30 2e 20 20 58 3d  stored as 0.  X=
0830: 32 20 69 73 20 31 30 2e 20 20 58 3d 33 20 69 73  2 is 10.  X=3 is
0840: 20 31 36 2e 20 20 58 3d 31 30 30 30 20 69 73 20   16.  X=1000 is 
0850: 39 39 2e 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 54  99. etc..**.** T
0860: 68 65 20 74 6f 6f 6c 2f 77 68 65 72 65 63 6f 73  he tool/wherecos
0870: 74 74 65 73 74 2e 63 20 73 6f 75 72 63 65 20 66  ttest.c source f
0880: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ile implements a
0890: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 70 72   command-line pr
08a0: 6f 67 72 61 6d 0a 2a 2a 20 74 68 61 74 20 77 69  ogram.** that wi
08b0: 6c 6c 20 63 6f 6e 76 65 72 74 20 62 65 74 77 65  ll convert betwe
08c0: 65 6e 20 57 68 65 72 65 43 6f 73 74 20 74 6f 20  en WhereCost to 
08d0: 69 6e 74 65 67 65 72 73 20 61 6e 64 20 64 6f 20  integers and do 
08e0: 61 64 64 69 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  addition and.** 
08f0: 6d 75 6c 74 69 70 6c 69 63 61 74 69 6f 6e 20 6f  multiplication o
0900: 6e 20 57 68 65 72 65 43 6f 73 74 20 76 61 6c 75  n WhereCost valu
0910: 65 73 2e 20 20 54 68 61 74 20 63 6f 6d 6d 61 6e  es.  That comman
0920: 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d 20 69  d-line program i
0930: 73 20 61 0a 2a 2a 20 75 73 65 66 75 6c 20 75 74  s a.** useful ut
0940: 69 6c 69 74 79 20 74 6f 20 68 61 76 65 20 61 72  ility to have ar
0950: 6f 75 6e 64 20 77 68 65 6e 20 77 6f 72 6b 69 6e  ound when workin
0960: 67 20 77 69 74 68 20 74 68 69 73 20 6d 6f 64 75  g with this modu
0970: 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75  le..*/.typedef u
0980: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e  nsigned short in
0990: 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f 2a  t WhereCost;../*
09a0: 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20  .** This object 
09b0: 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72 6d 61  contains informa
09c0: 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 69  tion needed to i
09d0: 6d 70 6c 65 6d 65 6e 74 20 61 20 73 69 6e 67 6c  mplement a singl
09e0: 65 20 6e 65 73 74 65 64 0a 2a 2a 20 6c 6f 6f 70  e nested.** loop
09f0: 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65   in WHERE clause
0a00: 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 74 72 61 73 74  ..**.** Contrast
0a10: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 77 69 74   this object wit
0a20: 68 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 54 68  h WhereLoop.  Th
0a30: 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  is object descri
0a40: 62 65 73 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65  bes the.** imple
0a50: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
0a60: 20 6c 6f 6f 70 2e 20 20 57 68 65 72 65 4c 6f 6f   loop.  WhereLoo
0a70: 70 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  p describes the 
0a80: 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 20 54 68  algorithm..** Th
0a90: 69 73 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69  is object contai
0aa0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
0ab0: 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 61 6c  the WhereLoop al
0ac0: 67 6f 72 69 74 68 6d 20 61 73 20 6f 6e 65 20 6f  gorithm as one o
0ad0: 66 0a 2a 2a 20 69 74 73 20 65 6c 65 6d 65 6e 74  f.** its element
0ae0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 57 68 65  s..**.** The Whe
0af0: 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f  reInfo object co
0b00: 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20  ntains a single 
0b10: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
0b20: 20 6f 62 6a 65 63 74 20 66 6f 72 0a 2a 2a 20 65   object for.** e
0b30: 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ach term in the 
0b40: 46 52 4f 4d 20 63 6c 61 75 73 65 20 28 77 68 69  FROM clause (whi
0b50: 63 68 20 69 73 20 74 6f 20 73 61 79 2c 20 66 6f  ch is to say, fo
0b60: 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  r each of the.**
0b70: 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 61 73   nested loops as
0b80: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29 2e 20 20   implemented).  
0b90: 54 68 65 20 6f 72 64 65 72 20 6f 66 20 57 68 65  The order of Whe
0ba0: 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 73 20  reLevel objects 
0bb0: 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 74 68  determines.** th
0bc0: 65 20 6c 6f 6f 70 20 6e 65 73 74 65 64 20 6f 72  e loop nested or
0bd0: 64 65 72 2c 20 77 69 74 68 20 57 68 65 72 65 49  der, with WhereI
0be0: 6e 66 6f 2e 61 5b 30 5d 20 62 65 69 6e 67 20 74  nfo.a[0] being t
0bf0: 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 61 6e  he outer loop an
0c00: 64 0a 2a 2a 20 57 68 65 72 65 49 6e 66 6f 2e 61  d.** WhereInfo.a
0c10: 5b 57 68 65 72 65 49 6e 66 6f 2e 6e 4c 65 76 65  [WhereInfo.nLeve
0c20: 6c 2d 31 5d 20 62 65 69 6e 67 20 74 68 65 20 69  l-1] being the i
0c30: 6e 6e 65 72 20 6c 6f 6f 70 2e 0a 2a 2f 0a 73 74  nner loop..*/.st
0c40: 72 75 63 74 20 57 68 65 72 65 4c 65 76 65 6c 20  ruct WhereLevel 
0c50: 7b 0a 20 20 69 6e 74 20 69 4c 65 66 74 4a 6f 69  {.  int iLeftJoi
0c60: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  n;        /* Mem
0c70: 6f 72 79 20 63 65 6c 6c 20 75 73 65 64 20 74 6f  ory cell used to
0c80: 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 45 46 54 20   implement LEFT 
0c90: 4f 55 54 45 52 20 4a 4f 49 4e 20 2a 2f 0a 20 20  OUTER JOIN */.  
0ca0: 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20  int iTabCur;    
0cb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
0cc0: 45 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f  E cursor used to
0cd0: 20 61 63 63 65 73 73 20 74 68 65 20 74 61 62 6c   access the tabl
0ce0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  e */.  int iIdxC
0cf0: 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur;          /* 
0d00: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
0d10: 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 70  used to access p
0d20: 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  Idx */.  int add
0d30: 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  rBrk;          /
0d40: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
0d50: 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
0d60: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
0d70: 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 20  drNxt;          
0d80: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
0d90: 73 74 61 72 74 20 74 68 65 20 6e 65 78 74 20 49  start the next I
0da0: 4e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 2a 2f  N combination */
0db0: 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b  .  int addrCont;
0dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
0dd0: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
0de0: 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
0df0: 6c 6f 6f 70 20 63 79 63 6c 65 20 2a 2f 0a 20 20  loop cycle */.  
0e00: 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20 20  int addrFirst;  
0e10: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69        /* First i
0e20: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 69 6e  nstruction of in
0e30: 74 65 72 69 6f 72 20 6f 66 20 74 68 65 20 6c 6f  terior of the lo
0e40: 6f 70 20 2a 2f 0a 20 20 75 38 20 69 46 72 6f 6d  op */.  u8 iFrom
0e50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0e60: 20 57 68 69 63 68 20 65 6e 74 72 79 20 69 6e 20   Which entry in 
0e70: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
0e80: 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 70 35 3b 20  */.  u8 op, p5; 
0e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
0ea0: 63 6f 64 65 20 61 6e 64 20 50 35 20 6f 66 20 74  code and P5 of t
0eb0: 68 65 20 6f 70 63 6f 64 65 20 74 68 61 74 20 65  he opcode that e
0ec0: 6e 64 73 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  nds the loop */.
0ed0: 20 20 69 6e 74 20 70 31 2c 20 70 32 3b 20 20 20    int p1, p2;   
0ee0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61          /* Opera
0ef0: 6e 64 73 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  nds of the opcod
0f00: 65 20 75 73 65 64 20 74 6f 20 65 6e 64 73 20 74  e used to ends t
0f10: 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 6e 69  he loop */.  uni
0f20: 6f 6e 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  on {            
0f30: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
0f40: 6e 20 74 68 61 74 20 64 65 70 65 6e 64 73 20 6f  n that depends o
0f50: 6e 20 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  n pWLoop->wsFlag
0f60: 73 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  s */.    struct 
0f70: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 6e 3b  {.      int nIn;
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f90: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
0fa0: 65 73 20 69 6e 20 61 49 6e 4c 6f 6f 70 5b 5d 20  es in aInLoop[] 
0fb0: 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
0fc0: 49 6e 4c 6f 6f 70 20 7b 0a 20 20 20 20 20 20 20  InLoop {.       
0fd0: 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
0fe0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
0ff0: 44 42 45 20 63 75 72 73 6f 72 20 75 73 65 64 20  DBE cursor used 
1000: 62 79 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61  by this IN opera
1010: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tor */.        i
1020: 6e 74 20 61 64 64 72 49 6e 54 6f 70 3b 20 20 20  nt addrInTop;   
1030: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
1040: 74 68 65 20 49 4e 20 6c 6f 6f 70 20 2a 2f 0a 20  the IN loop */. 
1050: 20 20 20 20 20 20 20 75 38 20 65 45 6e 64 4c 6f         u8 eEndLo
1060: 6f 70 4f 70 3b 20 20 20 20 20 20 20 20 20 2f 2a  opOp;         /*
1070: 20 49 4e 20 4c 6f 6f 70 20 74 65 72 6d 69 6e 61   IN Loop termina
1080: 74 6f 72 2e 20 4f 50 5f 4e 65 78 74 20 6f 72 20  tor. OP_Next or 
1090: 4f 50 5f 50 72 65 76 20 2a 2f 0a 20 20 20 20 20  OP_Prev */.     
10a0: 20 7d 20 2a 61 49 6e 4c 6f 6f 70 3b 20 20 20 20   } *aInLoop;    
10b0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d         /* Inform
10c0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68  ation about each
10d0: 20 6e 65 73 74 65 64 20 49 4e 20 6f 70 65 72 61   nested IN opera
10e0: 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 20 69 6e 3b  tor */.    } in;
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 2f 2a 20 55 73 65 64 20 77 68 65 6e 20 70 57   /* Used when pW
1110: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
1120: 45 52 45 5f 49 4e 5f 41 42 4c 45 20 2a 2f 0a 20  ERE_IN_ABLE */. 
1130: 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 69 64     Index *pCovid
1140: 78 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  x;       /* Poss
1150: 69 62 6c 65 20 63 6f 76 65 72 69 6e 67 20 69 6e  ible covering in
1160: 64 65 78 20 66 6f 72 20 57 48 45 52 45 5f 4d 55  dex for WHERE_MU
1170: 4c 54 49 5f 4f 52 20 2a 2f 0a 20 20 7d 20 75 3b  LTI_OR */.  } u;
1180: 0a 20 20 73 74 72 75 63 74 20 57 68 65 72 65 4c  .  struct WhereL
1190: 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 2f 2a  oop *pWLoop;  /*
11a0: 20 54 68 65 20 73 65 6c 65 63 74 65 64 20 57 68   The selected Wh
11b0: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
11c0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  /.};../*.** Each
11d0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
11e0: 73 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65  s object represe
11f0: 6e 74 73 20 61 6e 20 61 6c 67 6f 72 69 74 68 6d  nts an algorithm
1200: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
1210: 6f 6e 65 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 61  one.** term of a
1220: 20 6a 6f 69 6e 2e 20 20 45 76 65 72 79 20 74 65   join.  Every te
1230: 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
1240: 6c 61 75 73 65 20 77 69 6c 6c 20 68 61 76 65 20  lause will have 
1250: 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20  at least.** one 
1260: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
1270: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 28  ereLoop object (
1280: 75 6e 6c 65 73 73 20 49 4e 44 45 58 45 44 20 42  unless INDEXED B
1290: 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  Y constraints.**
12a0: 20 70 72 65 76 65 6e 74 20 61 20 71 75 65 72 79   prevent a query
12b0: 20 73 6f 6c 75 74 69 6f 6e 20 2d 20 77 68 69 63   solution - whic
12c0: 68 20 69 73 20 61 6e 20 65 72 72 6f 72 29 20 61  h is an error) a
12d0: 6e 64 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66  nd many terms of
12e0: 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
12f0: 75 73 65 20 77 69 6c 6c 20 68 61 76 65 20 6d 75  use will have mu
1300: 6c 74 69 70 6c 65 20 57 68 65 72 65 4c 6f 6f 70  ltiple WhereLoop
1310: 20 6f 62 6a 65 63 74 73 2c 20 65 61 63 68 20 64   objects, each d
1320: 65 73 63 72 69 62 69 6e 67 20 61 0a 2a 2a 20 70  escribing a.** p
1330: 6f 74 65 6e 74 69 61 6c 20 77 61 79 20 6f 66 20  otential way of 
1340: 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61  implementing tha
1350: 74 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65  t FROM-clause te
1360: 72 6d 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74  rm, together wit
1370: 68 0a 2a 2a 20 64 65 70 65 6e 64 65 6e 63 69 65  h.** dependencie
1380: 73 20 61 6e 64 20 63 6f 73 74 20 65 73 74 69 6d  s and cost estim
1390: 61 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74  ates for using t
13a0: 68 65 20 63 68 6f 73 65 6e 20 61 6c 67 6f 72 69  he chosen algori
13b0: 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79  thm..**.** Query
13c0: 20 70 6c 61 6e 6e 69 6e 67 20 63 6f 6e 73 69 73   planning consis
13d0: 74 73 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 75  ts of building u
13e0: 70 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f  p a collection o
13f0: 66 20 74 68 65 73 65 20 57 68 65 72 65 4c 6f 6f  f these WhereLoo
1400: 70 0a 2a 2a 20 6f 62 6a 65 63 74 73 2c 20 74 68  p.** objects, th
1410: 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 61 20 70  en computing a p
1420: 61 72 74 69 63 75 6c 61 72 20 73 65 71 75 65 6e  articular sequen
1430: 63 65 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  ce of WhereLoop 
1440: 6f 62 6a 65 63 74 73 2c 20 77 69 74 68 0a 2a 2a  objects, with.**
1450: 20 6f 6e 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   one WhereLoop o
1460: 62 6a 65 63 74 20 70 65 72 20 46 52 4f 4d 20 63  bject per FROM c
1470: 6c 61 75 73 65 20 74 65 72 6d 2c 20 74 68 61 74  lause term, that
1480: 20 73 61 74 69 73 66 79 20 61 6c 6c 20 64 65 70   satisfy all dep
1490: 65 6e 64 65 6e 63 69 65 73 0a 2a 2a 20 61 6e 64  endencies.** and
14a0: 20 74 68 61 74 20 6d 69 6e 69 6d 69 7a 65 20 74   that minimize t
14b0: 68 65 20 6f 76 65 72 61 6c 6c 20 63 6f 73 74 2e  he overall cost.
14c0: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
14d0: 4c 6f 6f 70 20 7b 0a 20 20 42 69 74 6d 61 73 6b  Loop {.  Bitmask
14e0: 20 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 2f   prereq;       /
14f0: 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 6f 74 68  * Bitmask of oth
1500: 65 72 20 6c 6f 6f 70 73 20 74 68 61 74 20 6d 75  er loops that mu
1510: 73 74 20 72 75 6e 20 66 69 72 73 74 20 2a 2f 0a  st run first */.
1520: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53 65    Bitmask maskSe
1530: 6c 66 3b 20 20 20 20 20 2f 2a 20 42 69 74 6d 61  lf;     /* Bitma
1540: 73 6b 20 69 64 65 6e 74 69 66 79 69 6e 67 20 74  sk identifying t
1550: 61 62 6c 65 20 69 54 61 62 20 2a 2f 0a 23 69 66  able iTab */.#if
1560: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1570: 0a 20 20 63 68 61 72 20 63 49 64 3b 20 20 20 20  .  char cId;    
1580: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62           /* Symb
1590: 6f 6c 69 63 20 49 44 20 6f 66 20 74 68 69 73 20  olic ID of this 
15a0: 6c 6f 6f 70 20 66 6f 72 20 64 65 62 75 67 67 69  loop for debuggi
15b0: 6e 67 20 75 73 65 20 2a 2f 0a 23 65 6e 64 69 66  ng use */.#endif
15c0: 0a 20 20 75 38 20 69 54 61 62 3b 20 20 20 20 20  .  u8 iTab;     
15d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
15e0: 74 69 6f 6e 20 69 6e 20 46 52 4f 4d 20 63 6c 61  tion in FROM cla
15f0: 75 73 65 20 6f 66 20 74 61 62 6c 65 20 66 6f 72  use of table for
1600: 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
1610: 75 38 20 69 53 6f 72 74 49 64 78 3b 20 20 20 20  u8 iSortIdx;    
1620: 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67        /* Sorting
1630: 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 2e 20 20   index number.  
1640: 30 3d 3d 4e 6f 6e 65 20 2a 2f 0a 20 20 57 68 65  0==None */.  Whe
1650: 72 65 43 6f 73 74 20 72 53 65 74 75 70 3b 20 20  reCost rSetup;  
1660: 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 73     /* One-time s
1670: 65 74 75 70 20 63 6f 73 74 20 28 65 78 3a 20 63  etup cost (ex: c
1680: 72 65 61 74 65 20 74 72 61 6e 73 69 65 6e 74 20  reate transient 
1690: 69 6e 64 65 78 29 20 2a 2f 0a 20 20 57 68 65 72  index) */.  Wher
16a0: 65 43 6f 73 74 20 72 52 75 6e 3b 20 20 20 20 20  eCost rRun;     
16b0: 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 72 75 6e    /* Cost of run
16c0: 6e 69 6e 67 20 65 61 63 68 20 6c 6f 6f 70 20 2a  ning each loop *
16d0: 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e 4f  /.  WhereCost nO
16e0: 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 45 73 74  ut;       /* Est
16f0: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
1700: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a   output rows */.
1710: 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74    union {.    st
1720: 72 75 63 74 20 7b 20 20 20 20 20 20 20 20 20 20  ruct {          
1730: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1740: 69 6f 6e 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ion for internal
1750: 20 62 74 72 65 65 20 74 61 62 6c 65 73 20 2a 2f   btree tables */
1760: 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 3b 20  .      int nEq; 
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1780: 20 4e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c   Number of equal
1790: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
17a0: 2a 2f 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  */.      Index *
17b0: 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
17c0: 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 2c 20 6f  /* Index used, o
17d0: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 7d 20  r NULL */.    } 
17e0: 62 74 72 65 65 3b 0a 20 20 20 20 73 74 72 75 63  btree;.    struc
17f0: 74 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  t {             
1800: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1810: 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62   for virtual tab
1820: 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  les */.      int
1830: 20 69 64 78 4e 75 6d 3b 20 20 20 20 20 20 20 20   idxNum;        
1840: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
1850: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ber */.      u8 
1860: 6e 65 65 64 46 72 65 65 3b 20 20 20 20 20 20 20  needFree;       
1870: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
1880: 71 6c 69 74 65 33 5f 66 72 65 65 28 69 64 78 53  qlite3_free(idxS
1890: 74 72 29 20 69 73 20 6e 65 65 64 65 64 20 2a 2f  tr) is needed */
18a0: 0a 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65  .      u8 isOrde
18b0: 72 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  red;          /*
18c0: 20 54 72 75 65 20 69 66 20 73 61 74 69 73 66 69   True if satisfi
18d0: 65 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  es ORDER BY */. 
18e0: 20 20 20 20 20 75 31 36 20 6f 6d 69 74 4d 61 73       u16 omitMas
18f0: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  k;          /* T
1900: 65 72 6d 73 20 74 68 61 74 20 6d 61 79 20 62 65  erms that may be
1910: 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 20 20   omitted */.    
1920: 20 20 63 68 61 72 20 2a 69 64 78 53 74 72 3b 20    char *idxStr; 
1930: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1940: 78 20 69 64 65 6e 74 69 66 69 65 72 20 73 74 72  x identifier str
1950: 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 20 76 74 61  ing */.    } vta
1960: 62 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20  b;.  } u;.  u32 
1970: 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  wsFlags;        
1980: 20 20 2f 2a 20 57 48 45 52 45 5f 2a 20 66 6c 61    /* WHERE_* fla
1990: 67 73 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  gs describing th
19a0: 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75 31 36 20  e plan */.  u16 
19b0: 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  nLTerm;         
19c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
19d0: 6e 74 72 69 65 73 20 69 6e 20 61 4c 54 65 72 6d  ntries in aLTerm
19e0: 5b 5d 20 2a 2f 0a 20 20 2f 2a 2a 2a 2a 20 77 68  [] */.  /**** wh
19f0: 65 72 65 4c 6f 6f 70 58 66 65 72 28 29 20 63 6f  ereLoopXfer() co
1a00: 70 69 65 73 20 66 69 65 6c 64 73 20 61 62 6f 76  pies fields abov
1a10: 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e **************
1a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 20 64 65 66  *********/.# def
1a30: 69 6e 65 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58  ine WHERE_LOOP_X
1a40: 46 45 52 5f 53 5a 20 6f 66 66 73 65 74 6f 66 28  FER_SZ offsetof(
1a50: 57 68 65 72 65 4c 6f 6f 70 2c 6e 4c 53 6c 6f 74  WhereLoop,nLSlot
1a60: 29 0a 20 20 75 31 36 20 6e 4c 53 6c 6f 74 3b 20  ).  u16 nLSlot; 
1a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a80: 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 61 6c 6c  ber of slots all
1a90: 6f 63 61 74 65 64 20 66 6f 72 20 61 4c 54 65 72  ocated for aLTer
1aa0: 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  m[] */.  WhereTe
1ab0: 72 6d 20 2a 2a 61 4c 54 65 72 6d 3b 20 20 20 2f  rm **aLTerm;   /
1ac0: 2a 20 57 68 65 72 65 54 65 72 6d 73 20 75 73 65  * WhereTerms use
1ad0: 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  d */.  WhereLoop
1ae0: 20 2a 70 4e 65 78 74 4c 6f 6f 70 3b 20 2f 2a 20   *pNextLoop; /* 
1af0: 4e 65 78 74 20 57 68 65 72 65 4c 6f 6f 70 20 6f  Next WhereLoop o
1b00: 62 6a 65 63 74 20 69 6e 20 74 68 65 20 57 68 65  bject in the Whe
1b10: 72 65 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  reClause */.  Wh
1b20: 65 72 65 54 65 72 6d 20 2a 61 4c 54 65 72 6d 53  ereTerm *aLTermS
1b30: 70 61 63 65 5b 34 5d 3b 20 20 2f 2a 20 49 6e 69  pace[4];  /* Ini
1b40: 74 69 61 6c 20 61 4c 54 65 72 6d 5b 5d 20 73 70  tial aLTerm[] sp
1b50: 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 46 6f  ace */.};../* Fo
1b60: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1b70: 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  n of methods */.
1b80: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
1b90: 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74  LoopResize(sqlit
1ba0: 65 33 2a 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c  e3*, WhereLoop*,
1bb0: 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61   int);../*.** Ea
1bc0: 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ch instance of t
1bd0: 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73  his object holds
1be0: 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 57   a sequence of W
1bf0: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1c00: 0a 2a 2a 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  .** that impleme
1c10: 6e 74 20 73 6f 6d 65 20 6f 72 20 61 6c 6c 20 6f  nt some or all o
1c20: 66 20 61 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  f a query plan..
1c30: 2a 2a 0a 2a 2a 20 54 68 69 6e 6b 20 6f 66 20 65  **.** Think of e
1c40: 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ach WhereLoop ob
1c50: 6a 65 63 74 73 20 61 73 20 61 20 6e 6f 64 65 20  jects as a node 
1c60: 69 6e 20 61 20 67 72 61 70 68 2c 20 77 68 69 63  in a graph, whic
1c70: 68 20 61 72 63 73 0a 2a 2a 20 73 68 6f 77 69 6e  h arcs.** showin
1c80: 67 20 64 65 70 65 6e 64 65 6e 63 65 73 20 61 6e  g dependences an
1c90: 64 20 63 6f 73 74 73 20 66 6f 72 20 74 72 61 76  d costs for trav
1ca0: 65 6c 6c 69 6e 67 20 62 65 74 77 65 65 6e 20 6e  elling between n
1cb0: 6f 64 65 73 2e 20 20 28 54 68 61 74 20 69 73 0a  odes.  (That is.
1cc0: 2a 2a 20 6e 6f 74 20 61 20 63 6f 6d 70 6c 65 74  ** not a complet
1cd0: 65 6c 79 20 61 63 63 75 72 61 74 65 20 64 65 73  ely accurate des
1ce0: 63 72 69 70 74 69 6f 6e 20 62 65 63 61 75 73 65  cription because
1cf0: 20 57 68 65 72 65 4c 6f 6f 70 20 63 6f 73 74 73   WhereLoop costs
1d00: 20 61 72 65 20 61 0a 2a 2a 20 76 65 63 74 6f 72   are a.** vector
1d10: 2c 20 6e 6f 74 20 61 20 73 63 61 6c 61 72 2c 20  , not a scalar, 
1d20: 61 6e 64 20 62 65 63 61 75 73 65 20 64 65 70 65  and because depe
1d30: 6e 64 65 6e 63 65 73 20 61 72 65 20 6d 61 6e 79  ndences are many
1d40: 2d 74 6f 2d 6f 6e 65 2c 20 6e 6f 74 0a 2a 2a 20  -to-one, not.** 
1d50: 6f 6e 65 2d 74 6f 2d 6f 6e 65 20 61 73 20 61 72  one-to-one as ar
1d60: 65 20 67 72 61 70 68 20 6e 6f 64 65 73 2e 20 20  e graph nodes.  
1d70: 42 75 74 20 69 74 20 69 73 20 61 20 75 73 65 66  But it is a usef
1d80: 75 6c 20 76 69 73 75 61 6c 69 7a 61 74 69 6f 6e  ul visualization
1d90: 20 61 69 64 2e 29 0a 2a 2a 20 54 68 65 6e 20 61   aid.).** Then a
1da0: 20 57 68 65 72 65 50 61 74 68 20 6f 62 6a 65 63   WherePath objec
1db0: 74 20 69 73 20 61 20 70 61 74 68 20 74 68 72 6f  t is a path thro
1dc0: 75 67 68 20 74 68 65 20 67 72 61 70 68 20 74 68  ugh the graph th
1dd0: 61 74 20 76 69 73 69 74 73 20 73 6f 6d 65 0a 2a  at visits some.*
1de0: 2a 20 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  * or all of the 
1df0: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1e00: 73 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  s once..**.** Th
1e10: 65 20 22 73 6f 6c 76 65 72 22 20 77 6f 72 6b 73  e "solver" works
1e20: 20 62 79 20 63 72 65 61 74 69 6e 67 20 74 68 65   by creating the
1e30: 20 4e 20 62 65 73 74 20 57 68 65 72 65 50 61 74   N best WherePat
1e40: 68 20 6f 62 6a 65 63 74 73 20 6f 66 20 6c 65 6e  h objects of len
1e50: 67 74 68 0a 2a 2a 20 31 2e 20 20 54 68 65 6e 20  gth.** 1.  Then 
1e60: 75 73 69 6e 67 20 74 68 6f 73 65 20 61 73 20 61  using those as a
1e70: 20 62 61 73 69 73 20 74 6f 20 63 6f 6d 70 75 74   basis to comput
1e80: 65 20 74 68 65 20 4e 20 62 65 73 74 20 57 68 65  e the N best Whe
1e90: 72 65 50 61 74 68 20 6f 62 6a 65 63 74 73 0a 2a  rePath objects.*
1ea0: 2a 20 6f 66 20 6c 65 6e 67 74 68 20 32 2e 20 20  * of length 2.  
1eb0: 41 6e 64 20 73 6f 20 66 6f 72 74 68 20 75 6e 74  And so forth unt
1ec0: 69 6c 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  il the length of
1ed0: 20 57 68 65 72 65 50 61 74 68 73 20 65 71 75 61   WherePaths equa
1ee0: 6c 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  ls the.** number
1ef0: 20 6f 66 20 6e 6f 64 65 73 20 69 6e 20 74 68 65   of nodes in the
1f00: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1f10: 68 65 20 62 65 73 74 20 28 6c 6f 77 65 73 74 20  he best (lowest 
1f20: 63 6f 73 74 29 20 57 68 65 72 65 50 61 74 68 0a  cost) WherePath.
1f30: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 69 73  ** at the end is
1f40: 20 74 68 65 20 63 68 6f 6f 73 65 6e 20 71 75 65   the choosen que
1f50: 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 73 74 72 75  ry plan..*/.stru
1f60: 63 74 20 57 68 65 72 65 50 61 74 68 20 7b 0a 20  ct WherePath {. 
1f70: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4c 6f 6f   Bitmask maskLoo
1f80: 70 3b 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  p;     /* Bitmas
1f90: 6b 20 6f 66 20 61 6c 6c 20 57 68 65 72 65 4c 6f  k of all WhereLo
1fa0: 6f 70 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  op objects in th
1fb0: 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 42 69 74  is path */.  Bit
1fc0: 6d 61 73 6b 20 72 65 76 4c 6f 6f 70 3b 20 20 20  mask revLoop;   
1fd0: 20 20 20 2f 2a 20 61 4c 6f 6f 70 5b 5d 73 20 74     /* aLoop[]s t
1fe0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65  hat should be re
1ff0: 76 65 72 73 65 64 20 66 6f 72 20 4f 52 44 45 52  versed for ORDER
2000: 20 42 59 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f   BY */.  WhereCo
2010: 73 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 2f  st nRow;       /
2020: 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  * Estimated numb
2030: 65 72 20 6f 66 20 72 6f 77 73 20 67 65 6e 65 72  er of rows gener
2040: 61 74 65 64 20 62 79 20 74 68 69 73 20 70 61 74  ated by this pat
2050: 68 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  h */.  WhereCost
2060: 20 72 43 6f 73 74 3b 20 20 20 20 20 20 2f 2a 20   rCost;      /* 
2070: 54 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 74 68  Total cost of th
2080: 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 75 38 20  is path */.  u8 
2090: 69 73 4f 72 64 65 72 65 64 3b 20 20 20 20 20 20  isOrdered;      
20a0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
20b0: 69 73 20 70 61 74 68 20 73 61 74 69 73 66 69 65  is path satisfie
20c0: 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  s ORDER BY */.  
20d0: 75 38 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69  u8 isOrderedVali
20e0: 64 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  d;    /* True if
20f0: 20 74 68 65 20 69 73 4f 72 64 65 72 65 64 20 66   the isOrdered f
2100: 69 65 6c 64 20 69 73 20 76 61 6c 69 64 20 2a 2f  ield is valid */
2110: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 61  .  WhereLoop **a
2120: 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 41 72 72 61  Loop;    /* Arra
2130: 79 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f  y of WhereLoop o
2140: 62 6a 65 63 74 73 20 69 6d 70 6c 65 6d 65 6e 74  bjects implement
2150: 69 6e 67 20 74 68 69 73 20 70 61 74 68 20 2a 2f  ing this path */
2160: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71  .};../*.** The q
2170: 75 65 72 79 20 67 65 6e 65 72 61 74 6f 72 20 75  uery generator u
2180: 73 65 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ses an array of 
2190: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 69  instances of thi
21a0: 73 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a  s structure to.*
21b0: 2a 20 68 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a  * help it analyz
21c0: 65 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  e the subexpress
21d0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 57 48 45 52  ions of the WHER
21e0: 45 20 63 6c 61 75 73 65 2e 20 20 45 61 63 68 20  E clause.  Each 
21f0: 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20  WHERE.** clause 
2200: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
2210: 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20   separated from 
2220: 74 68 65 20 6f 74 68 65 72 73 20 62 79 20 41 4e  the others by AN
2230: 44 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20  D operators,.** 
2240: 75 73 75 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65  usually, or some
2250: 74 69 6d 65 73 20 73 75 62 65 78 70 72 65 73 73  times subexpress
2260: 69 6f 6e 73 20 73 65 70 61 72 61 74 65 64 20 62  ions separated b
2270: 79 20 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  y OR..**.** All 
2280: 57 68 65 72 65 54 65 72 6d 73 20 61 72 65 20 63  WhereTerms are c
2290: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 61 20  ollected into a 
22a0: 73 69 6e 67 6c 65 20 57 68 65 72 65 43 6c 61 75  single WhereClau
22b0: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 0a  se structure.  .
22c0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
22d0: 20 69 64 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a   identity holds:
22e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 68  .**.**        Wh
22f0: 65 72 65 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57  ereTerm.pWC->a[W
2300: 68 65 72 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d  hereTerm.idx] ==
2310: 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a   WhereTerm.**.**
2320: 20 57 68 65 6e 20 61 20 74 65 72 6d 20 69 73 20   When a term is 
2330: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
2340: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2350: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a  X <op> <expr>.**
2360: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
2370: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64   column name and
2380: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20   <op> is one of 
2390: 63 65 72 74 61 69 6e 20 6f 70 65 72 61 74 6f 72  certain operator
23a0: 73 2c 0a 2a 2a 20 74 68 65 6e 20 57 68 65 72 65  s,.** then Where
23b0: 54 65 72 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20  Term.leftCursor 
23c0: 61 6e 64 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  and WhereTerm.u.
23d0: 6c 65 66 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72  leftColumn recor
23e0: 64 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  d the.** cursor 
23f0: 6e 75 6d 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d  number and colum
2400: 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e 20  n number for X. 
2410: 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72   WhereTerm.eOper
2420: 61 74 6f 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ator records.** 
2430: 74 68 65 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61  the <op> using a
2440: 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e   bitmask encodin
2450: 67 20 64 65 66 69 6e 65 64 20 62 79 20 57 4f 5f  g defined by WO_
2460: 78 78 78 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a  xxx below.  The.
2470: 2a 2a 20 75 73 65 20 6f 66 20 61 20 62 69 74 6d  ** use of a bitm
2480: 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72  ask encoding for
2490: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 61 6c   the operator al
24a0: 6c 6f 77 73 20 75 73 20 74 6f 20 73 65 61 72 63  lows us to searc
24b0: 68 0a 2a 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72  h.** quickly for
24c0: 20 74 65 72 6d 73 20 74 68 61 74 20 6d 61 74 63   terms that matc
24d0: 68 20 61 6e 79 20 6f 66 20 73 65 76 65 72 61 6c  h any of several
24e0: 20 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61   different opera
24f0: 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68  tors..**.** A Wh
2500: 65 72 65 54 65 72 6d 20 6d 69 67 68 74 20 61 6c  ereTerm might al
2510: 73 6f 20 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72  so be two or mor
2520: 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65  e subterms conne
2530: 63 74 65 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a  cted by OR:.**.*
2540: 2a 20 20 20 20 20 20 20 20 20 28 74 31 2e 58 20  *         (t1.X 
2550: 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20  <op> <expr>) OR 
2560: 28 74 31 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72  (t1.Y <op> <expr
2570: 3e 29 20 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a  >) OR .....**.**
2580: 20 49 6e 20 74 68 69 73 20 73 65 63 6f 6e 64 20   In this second 
2590: 63 61 73 65 2c 20 77 74 46 6c 61 67 20 61 73 20  case, wtFlag as 
25a0: 74 68 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20  the TERM_ORINFO 
25b0: 73 65 74 20 61 6e 64 20 65 4f 70 65 72 61 74 6f  set and eOperato
25c0: 72 3d 3d 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20  r==WO_OR.** and 
25d0: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
25e0: 70 4f 72 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f  pOrInfo field po
25f0: 69 6e 74 73 20 74 6f 20 61 75 78 69 6c 69 61 72  ints to auxiliar
2600: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  y information th
2610: 61 74 0a 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74  at.** is collect
2620: 65 64 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a  ed about the.**.
2630: 2a 2a 20 49 66 20 61 20 74 65 72 6d 20 69 6e 20  ** If a term in 
2640: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2650: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
2660: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77  either of the tw
2670: 6f 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61  o previous.** ca
2680: 74 65 67 6f 72 69 65 73 2c 20 74 68 65 6e 20 65  tegories, then e
2690: 4f 70 65 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68  Operator==0.  Th
26a0: 65 20 57 68 65 72 65 54 65 72 6d 2e 70 45 78 70  e WhereTerm.pExp
26b0: 72 20 66 69 65 6c 64 20 69 73 20 73 74 69 6c 6c  r field is still
26c0: 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f   set.** to the o
26d0: 72 69 67 69 6e 61 6c 20 73 75 62 65 78 70 72 65  riginal subexpre
26e0: 73 73 69 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e  ssion content an
26f0: 64 20 77 74 46 6c 61 67 73 20 69 73 20 73 65 74  d wtFlags is set
2700: 20 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 6c   up appropriatel
2710: 79 0a 2a 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65  y.** but no othe
2720: 72 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  r fields in the 
2730: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
2740: 20 61 72 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e   are meaningful.
2750: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65  .**.** When eOpe
2760: 72 61 74 6f 72 21 3d 30 2c 20 70 72 65 72 65 71  rator!=0, prereq
2770: 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65 71  Right and prereq
2780: 41 6c 6c 20 72 65 63 6f 72 64 20 73 65 74 73 20  All record sets 
2790: 6f 66 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  of cursor number
27a0: 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 79 20 64  s,.** but they d
27b0: 6f 20 73 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e  o so indirectly.
27c0: 20 20 41 20 73 69 6e 67 6c 65 20 57 68 65 72 65    A single Where
27d0: 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
27e0: 65 20 74 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20  e translates.** 
27f0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e  cursor number in
2800: 74 6f 20 62 69 74 73 20 61 6e 64 20 74 68 65 20  to bits and the 
2810: 74 72 61 6e 73 6c 61 74 65 64 20 62 69 74 20 69  translated bit i
2820: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
2830: 70 72 65 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73  prereq.** fields
2840: 2e 20 20 54 68 65 20 74 72 61 6e 73 6c 61 74 69  .  The translati
2850: 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20 6f 72  on is used in or
2860: 64 65 72 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20  der to maximize 
2870: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
2880: 20 62 69 74 73 20 74 68 61 74 20 77 69 6c 6c 20   bits that will 
2890: 66 69 74 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  fit in a Bitmask
28a0: 2e 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73  .  The VDBE curs
28b0: 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74  or numbers might
28c0: 20 62 65 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75   be.** spread ou
28d0: 74 20 6f 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e  t over the non-n
28e0: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 73  egative integers
28f0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
2900: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  the cursor.** nu
2910: 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65 20 33  mbers might be 3
2920: 2c 20 38 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20  , 8, 9, 10, 20, 
2930: 32 33 2c 20 34 31 2c 20 61 6e 64 20 34 35 2e 20  23, 41, and 45. 
2940: 20 54 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65   The WhereMaskSe
2950: 74 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 73 20  t.** translates 
2960: 74 68 65 73 65 20 73 70 61 72 73 65 20 63 75 72  these sparse cur
2970: 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f  sor numbers into
2980: 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74   consecutive int
2990: 65 67 65 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69  egers.** beginni
29a0: 6e 67 20 77 69 74 68 20 30 20 69 6e 20 6f 72 64  ng with 0 in ord
29b0: 65 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 62  er to make the b
29c0: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 75 73 65  est possible use
29d0: 20 6f 66 20 74 68 65 20 61 76 61 69 6c 61 62 6c   of the availabl
29e0: 65 0a 2a 2a 20 62 69 74 73 20 69 6e 20 74 68 65  e.** bits in the
29f0: 20 42 69 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69   Bitmask.  So, i
2a00: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  n the example ab
2a10: 6f 76 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ove, the cursor 
2a20: 6e 75 6d 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64  numbers.** would
2a30: 20 62 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   be mapped into 
2a40: 69 6e 74 65 67 65 72 73 20 30 20 74 68 72 6f 75  integers 0 throu
2a50: 67 68 20 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  gh 7..**.** The 
2a60: 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  number of terms 
2a70: 69 6e 20 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d  in a join is lim
2a80: 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
2a90: 65 72 20 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e  er of bits.** in
2aa0: 20 70 72 65 72 65 71 52 69 67 68 74 20 61 6e 64   prereqRight and
2ab0: 20 70 72 65 72 65 71 41 6c 6c 2e 20 20 54 68 65   prereqAll.  The
2ac0: 20 64 65 66 61 75 6c 74 20 69 73 20 36 34 20 62   default is 64 b
2ad0: 69 74 73 2c 20 68 65 6e 63 65 20 53 51 4c 69 74  its, hence SQLit
2ae0: 65 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c  e.** is only abl
2af0: 65 20 74 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69  e to process joi
2b00: 6e 73 20 77 69 74 68 20 36 34 20 6f 72 20 66 65  ns with 64 or fe
2b10: 77 65 72 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  wer tables..*/.s
2b20: 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d 20  truct WhereTerm 
2b30: 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2b50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75  ointer to the su
2b60: 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74  bexpression that
2b70: 20 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a 2f   is this term */
2b80: 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
2b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
2ba0: 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61  sable pWC->a[iPa
2bb0: 72 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20  rent] when this 
2bc0: 74 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f  term disabled */
2bd0: 0a 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73 6f  .  int leftCurso
2be0: 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  r;         /* Cu
2bf0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58  rsor number of X
2c00: 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   in "X <op> <exp
2c10: 72 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b  r>" */.  union {
2c20: 0a 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c  .    int leftCol
2c30: 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  umn;         /* 
2c40: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
2c50: 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65   X in "X <op> <e
2c60: 78 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65  xpr>" */.    Whe
2c70: 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66  reOrInfo *pOrInf
2c80: 6f 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e  o;   /* Extra in
2c90: 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f  formation if (eO
2ca0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29  perator & WO_OR)
2cb0: 21 3d 30 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  !=0 */.    Where
2cc0: 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66  AndInfo *pAndInf
2cd0: 6f 3b 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f  o; /* Extra info
2ce0: 72 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f 70 65  rmation if (eOpe
2cf0: 72 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21 3d  rator& WO_AND)!=
2d00: 30 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75 31  0 */.  } u;.  u1
2d10: 36 20 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 20  6 eOperator;    
2d20: 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78 78        /* A WO_xx
2d30: 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 69 6e   value describin
2d40: 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20 77  g <op> */.  u8 w
2d50: 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  tFlags;         
2d60: 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78 78 78 20      /* TERM_xxx 
2d70: 62 69 74 20 66 6c 61 67 73 2e 20 20 53 65 65 20  bit flags.  See 
2d80: 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e 43  below */.  u8 nC
2d90: 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
2da0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2db0: 63 68 69 6c 64 72 65 6e 20 74 68 61 74 20 6d 75  children that mu
2dc0: 73 74 20 64 69 73 61 62 6c 65 20 75 73 20 2a 2f  st disable us */
2dd0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2de0: 70 57 43 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  pWC;       /* Th
2df0: 65 20 63 6c 61 75 73 65 20 74 68 69 73 20 74 65  e clause this te
2e00: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 2a 2f  rm is part of */
2e10: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
2e20: 71 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 42 69  qRight;    /* Bi
2e30: 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20  tmask of tables 
2e40: 75 73 65 64 20 62 79 20 70 45 78 70 72 2d 3e 70  used by pExpr->p
2e50: 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d 61  Right */.  Bitma
2e60: 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20  sk prereqAll;   
2e70: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66     /* Bitmask of
2e80: 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63   tables referenc
2e90: 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f 0a 7d  ed by pExpr */.}
2ea0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
2eb0: 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72 65   values of Where
2ec0: 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a 2a 2f 0a  Term.wtFlags.*/.
2ed0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 44 59 4e  #define TERM_DYN
2ee0: 41 4d 49 43 20 20 20 20 30 78 30 31 20 20 20 2f  AMIC    0x01   /
2ef0: 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73  * Need to call s
2f00: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
2f10: 28 64 62 2c 20 70 45 78 70 72 29 20 2a 2f 0a 23  (db, pExpr) */.#
2f20: 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 49 52 54  define TERM_VIRT
2f30: 55 41 4c 20 20 20 20 30 78 30 32 20 20 20 2f 2a  UAL    0x02   /*
2f40: 20 41 64 64 65 64 20 62 79 20 74 68 65 20 6f 70   Added by the op
2f50: 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e 6f 74  timizer.  Do not
2f60: 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65   code */.#define
2f70: 20 54 45 52 4d 5f 43 4f 44 45 44 20 20 20 20 20   TERM_CODED     
2f80: 20 30 78 30 34 20 20 20 2f 2a 20 54 68 69 73 20   0x04   /* This 
2f90: 74 65 72 6d 20 69 73 20 61 6c 72 65 61 64 79 20  term is already 
2fa0: 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  coded */.#define
2fb0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 20 20 20   TERM_COPIED    
2fc0: 20 30 78 30 38 20 20 20 2f 2a 20 48 61 73 20 61   0x08   /* Has a
2fd0: 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66 69 6e   child */.#defin
2fe0: 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 20 20  e TERM_ORINFO   
2ff0: 20 20 30 78 31 30 20 20 20 2f 2a 20 4e 65 65 64    0x10   /* Need
3000: 20 74 6f 20 66 72 65 65 20 74 68 65 20 57 68 65   to free the Whe
3010: 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f  reTerm.u.pOrInfo
3020: 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64 65 66 69   object */.#defi
3030: 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20  ne TERM_ANDINFO 
3040: 20 20 20 30 78 32 30 20 20 20 2f 2a 20 4e 65 65     0x20   /* Nee
3050: 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57 68  d to free the Wh
3060: 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e 64 49 6e  ereTerm.u.pAndIn
3070: 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65 66 69 6e  fo obj */.#defin
3080: 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20 20  e TERM_OR_OK    
3090: 20 20 30 78 34 30 20 20 20 2f 2a 20 55 73 65 64    0x40   /* Used
30a0: 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61 75 73   during OR-claus
30b0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a  e processing */.
30c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
30d0: 41 42 4c 45 5f 53 54 41 54 33 0a 23 20 20 64 65  ABLE_STAT3.#  de
30e0: 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  fine TERM_VNULL 
30f0: 20 20 20 30 78 38 30 20 20 20 2f 2a 20 4d 61 6e     0x80   /* Man
3100: 75 66 61 63 74 75 72 65 64 20 78 3e 4e 55 4c 4c  ufactured x>NULL
3110: 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74 65 72 6d   or x<=NULL term
3120: 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20 64 65 66   */.#else.#  def
3130: 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20  ine TERM_VNULL  
3140: 20 20 30 78 30 30 20 20 20 2f 2a 20 44 69 73 61    0x00   /* Disa
3150: 62 6c 65 64 20 69 66 20 6e 6f 74 20 75 73 69 6e  bled if not usin
3160: 67 20 73 74 61 74 33 20 2a 2f 0a 23 65 6e 64 69  g stat3 */.#endi
3170: 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  f../*.** An inst
3180: 61 6e 63 65 20 6f 66 20 74 68 65 20 57 68 65 72  ance of the Wher
3190: 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 69 73 20  eScan object is 
31a0: 75 73 65 64 20 61 73 20 61 6e 20 69 74 65 72 61  used as an itera
31b0: 74 6f 72 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67  tor for locating
31c0: 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65  .** terms in the
31d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
31e0: 61 74 20 61 72 65 20 75 73 65 66 75 6c 20 74 6f  at are useful to
31f0: 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e   the query plann
3200: 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  er..*/.struct Wh
3210: 65 72 65 53 63 61 6e 20 7b 0a 20 20 57 68 65 72  ereScan {.  Wher
3220: 65 43 6c 61 75 73 65 20 2a 70 4f 72 69 67 57 43  eClause *pOrigWC
3230: 3b 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  ;      /* Origin
3240: 61 6c 2c 20 69 6e 6e 65 72 6d 6f 73 74 20 57 68  al, innermost Wh
3250: 65 72 65 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57  ereClause */.  W
3260: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
3270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
3280: 72 65 43 6c 61 75 73 65 20 63 75 72 72 65 6e 74  reClause current
3290: 6c 79 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64  ly being scanned
32a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   */.  char *zCol
32b0: 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  lName;          
32c0: 20 2f 2a 20 52 65 71 75 69 72 65 64 20 63 6f 6c   /* Required col
32d0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c  lating sequence,
32e0: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
32f0: 20 20 63 68 61 72 20 69 64 78 61 66 66 3b 20 20    char idxaff;  
3300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3310: 4d 75 73 74 20 6d 61 74 63 68 20 74 68 69 73 20  Must match this 
3320: 61 66 66 69 6e 69 74 79 2c 20 69 66 20 7a 43 6f  affinity, if zCo
3330: 6c 6c 4e 61 6d 65 21 3d 4e 55 4c 4c 20 2a 2f 0a  llName!=NULL */.
3340: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3350: 6e 45 71 75 69 76 3b 20 20 20 20 20 20 2f 2a 20  nEquiv;      /* 
3360: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
3370: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f  s in aEquiv[] */
3380: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
3390: 20 69 45 71 75 69 76 3b 20 20 20 20 20 20 2f 2a   iEquiv;      /*
33a0: 20 4e 65 78 74 20 75 6e 75 73 65 64 20 73 6c 6f   Next unused slo
33b0: 74 20 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f  t in aEquiv[] */
33c0: 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 3b 20 20  .  u32 opMask;  
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33e0: 20 41 63 63 65 70 74 61 62 6c 65 20 6f 70 65 72   Acceptable oper
33f0: 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6b  ators */.  int k
3400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3410: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20        /* Resume 
3420: 73 63 61 6e 6e 69 6e 67 20 61 74 20 74 68 69 73  scanning at this
3430: 2d 3e 70 57 43 2d 3e 61 5b 74 68 69 73 2d 3e 6b  ->pWC->a[this->k
3440: 5d 20 2a 2f 0a 20 20 69 6e 74 20 61 45 71 75 69  ] */.  int aEqui
3450: 76 5b 32 32 5d 3b 20 20 20 20 20 20 20 20 20 20  v[22];          
3460: 20 20 2f 2a 20 43 75 72 73 6f 72 2c 43 6f 6c 75    /* Cursor,Colu
3470: 6d 6e 20 70 61 69 72 73 20 66 6f 72 20 65 71 75  mn pairs for equ
3480: 69 76 61 6c 65 6e 63 65 20 63 6c 61 73 73 65 73  ivalence classes
3490: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
34a0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
34b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
34c0: 74 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69  ture holds all i
34d0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
34e0: 20 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75   a.** WHERE clau
34f0: 73 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73  se.  Mostly this
3500: 20 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20   is a container 
3510: 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  for one or more 
3520: 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a  WhereTerms..**.*
3530: 2a 20 45 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  * Explanation of
3540: 20 70 4f 75 74 65 72 3a 20 20 46 6f 72 20 61 20   pOuter:  For a 
3550: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
3560: 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20  the form.**.**  
3570: 20 20 20 20 20 20 20 20 20 61 20 41 4e 44 20 28           a AND (
3580: 28 62 20 41 4e 44 20 63 29 20 4f 52 20 28 64 20  (b AND c) OR (d 
3590: 41 4e 44 20 65 29 29 20 41 4e 44 20 66 0a 2a 2a  AND e)) AND f.**
35a0: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65  .** There are se
35b0: 70 61 72 61 74 65 20 57 68 65 72 65 43 6c 61 75  parate WhereClau
35c0: 73 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 74  se objects for t
35d0: 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65 20  he whole clause 
35e0: 61 6e 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  and for.** the s
35f0: 75 62 63 6c 61 75 73 65 73 20 22 28 62 20 41 4e  ubclauses "(b AN
3600: 44 20 63 29 22 20 61 6e 64 20 22 28 64 20 41 4e  D c)" and "(d AN
3610: 44 20 65 29 22 2e 20 20 54 68 65 20 70 4f 75 74  D e)".  The pOut
3620: 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a  er field of the.
3630: 2a 2a 20 73 75 62 63 6c 61 75 73 65 73 20 70 6f  ** subclauses po
3640: 69 6e 74 73 20 74 6f 20 74 68 65 20 57 68 65 72  ints to the Wher
3650: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 66  eClause object f
3660: 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 63 6c 61  or the whole cla
3670: 75 73 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  use..*/.struct W
3680: 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20 20 57  hereClause {.  W
3690: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
36a0: 3b 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45  ;       /* WHERE
36b0: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
36c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
36d0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 75  WhereClause *pOu
36e0: 74 65 72 3b 20 20 20 20 20 2f 2a 20 4f 75 74 65  ter;     /* Oute
36f0: 72 20 63 6f 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f  r conjunction */
3700: 0a 20 20 75 38 20 6f 70 3b 20 20 20 20 20 20 20  .  u8 op;       
3710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3720: 70 6c 69 74 20 6f 70 65 72 61 74 6f 72 2e 20 20  plit operator.  
3730: 54 4b 5f 41 4e 44 20 6f 72 20 54 4b 5f 4f 52 20  TK_AND or TK_OR 
3740: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20  */.  int nTerm; 
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3760: 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
3770: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b   */.  int nSlot;
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3790: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
37a0: 69 65 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20  ies in a[] */.  
37b0: 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 20 20 20  WhereTerm *a;   
37c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 61 63 68           /* Each
37d0: 20 61 5b 5d 20 64 65 73 63 72 69 62 65 73 20 61   a[] describes a
37e0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
37f0: 52 45 20 63 6c 75 61 73 65 20 2a 2f 0a 23 69 66  RE cluase */.#if
3800: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3810: 53 4d 41 4c 4c 5f 53 54 41 43 4b 29 0a 20 20 57  SMALL_STACK).  W
3820: 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69 63  hereTerm aStatic
3830: 5b 31 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69  [1];    /* Initi
3840: 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65 20  al static space 
3850: 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6c 73 65  for a[] */.#else
3860: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 61 53 74  .  WhereTerm aSt
3870: 61 74 69 63 5b 38 5d 3b 20 20 20 20 2f 2a 20 49  atic[8];    /* I
3880: 6e 69 74 69 61 6c 20 73 74 61 74 69 63 20 73 70  nitial static sp
3890: 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23  ace for a[] */.#
38a0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
38b0: 41 20 57 68 65 72 65 54 65 72 6d 20 77 69 74 68  A WhereTerm with
38c0: 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f   eOperator==WO_O
38d0: 52 20 68 61 73 20 69 74 73 20 75 2e 70 4f 72 49  R has its u.pOrI
38e0: 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20  nfo pointer set 
38f0: 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61  to.** a dynamica
3900: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  lly allocated 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 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
3940: 72 65 4f 72 49 6e 66 6f 20 7b 0a 20 20 57 68 65  reOrInfo {.  Whe
3950: 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20  reClause wc;    
3960: 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f        /* Decompo
3970: 73 69 74 69 6f 6e 20 69 6e 74 6f 20 73 75 62 74  sition into subt
3980: 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
3990: 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20  k indexable;    
39a0: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66     /* Bitmask of
39b0: 20 61 6c 6c 20 69 6e 64 65 78 61 62 6c 65 20 74   all indexable t
39c0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 63 6c 61  ables in the cla
39d0: 75 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  use */.};../*.**
39e0: 20 41 20 57 68 65 72 65 54 65 72 6d 20 77 69 74   A WhereTerm wit
39f0: 68 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  h eOperator==WO_
3a00: 41 4e 44 20 68 61 73 20 69 74 73 20 75 2e 70 41  AND has its u.pA
3a10: 6e 64 49 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73  ndInfo pointer s
3a20: 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d  et to.** a dynam
3a30: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
3a40: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3a50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
3a60: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
3a70: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 7b 0a 20  WhereAndInfo {. 
3a80: 20 57 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b   WhereClause wc;
3a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3aa0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 62   subexpression b
3ab0: 72 6f 6b 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a  roken out */.};.
3ac0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
3ad0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
3ae0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
3af0: 65 70 73 20 74 72 61 63 6b 20 6f 66 20 61 20 6d  eps track of a m
3b00: 61 70 70 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65  apping.** betwee
3b10: 6e 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  n VDBE cursor nu
3b20: 6d 62 65 72 73 20 61 6e 64 20 62 69 74 73 20 6f  mbers and bits o
3b30: 66 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20 69  f the bitmasks i
3b40: 6e 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  n WhereTerm..**.
3b50: 2a 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  ** The VDBE curs
3b60: 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 73  or numbers are s
3b70: 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 63 6f  mall integers co
3b80: 6e 74 61 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53  ntained in .** S
3b90: 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 43 75 72  rcList_item.iCur
3ba0: 73 6f 72 20 61 6e 64 20 45 78 70 72 2e 69 54 61  sor and Expr.iTa
3bb0: 62 6c 65 20 66 69 65 6c 64 73 2e 20 20 46 6f 72  ble fields.  For
3bc0: 20 61 6e 79 20 67 69 76 65 6e 20 57 48 45 52 45   any given WHERE
3bd0: 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 74 68 65   .** clause, the
3be0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
3bf0: 6d 69 67 68 74 20 6e 6f 74 20 62 65 67 69 6e 20  might not begin 
3c00: 77 69 74 68 20 30 20 61 6e 64 20 74 68 65 79 20  with 0 and they 
3c10: 6d 69 67 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  might.** contain
3c20: 20 67 61 70 73 20 69 6e 20 74 68 65 20 6e 75 6d   gaps in the num
3c30: 62 65 72 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  bering sequence.
3c40: 20 20 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f    But we want to
3c50: 20 6d 61 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a   make maximum.**
3c60: 20 75 73 65 20 6f 66 20 74 68 65 20 62 69 74 73   use of the bits
3c70: 20 69 6e 20 6f 75 72 20 62 69 74 6d 61 73 6b 73   in our bitmasks
3c80: 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72  .  This structur
3c90: 65 20 70 72 6f 76 69 64 65 73 20 61 20 6d 61 70  e provides a map
3ca0: 70 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  ping.** from the
3cb0: 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e   sparse cursor n
3cc0: 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73  umbers into cons
3cd0: 65 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73  ecutive integers
3ce0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69   beginning.** wi
3cf0: 74 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57  th 0..**.** If W
3d00: 68 65 72 65 4d 61 73 6b 53 65 74 2e 69 78 5b 41  hereMaskSet.ix[A
3d10: 5d 3d 3d 42 20 69 74 20 6d 65 61 6e 73 20 74 68  ]==B it means th
3d20: 61 74 20 54 68 65 20 41 2d 74 68 20 62 69 74 20  at The A-th bit 
3d30: 6f 66 20 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20  of a Bitmask.** 
3d40: 63 6f 72 72 65 73 70 6f 6e 64 73 20 56 44 42 45  corresponds VDBE
3d50: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 42   cursor number B
3d60: 2e 20 20 54 68 65 20 41 2d 74 68 20 62 69 74 20  .  The A-th bit 
3d70: 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 69 73 20  of a bitmask is 
3d80: 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  1<<A..**.** For 
3d90: 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
3da0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
3db0: 72 65 73 73 69 6f 6e 20 75 73 65 64 20 74 68 65  ression used the
3dc0: 73 65 20 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f  se VDBE.** curso
3dd0: 72 73 3a 20 20 34 2c 20 35 2c 20 38 2c 20 32 39  rs:  4, 5, 8, 29
3de0: 2c 20 35 37 2c 20 37 33 2e 20 20 54 68 65 6e 20  , 57, 73.  Then 
3df0: 74 68 65 20 20 57 68 65 72 65 4d 61 73 6b 53 65  the  WhereMaskSe
3e00: 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 77  t structure.** w
3e10: 6f 75 6c 64 20 6d 61 70 20 74 68 6f 73 65 20 63  ould map those c
3e20: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
3e30: 74 6f 20 62 69 74 73 20 30 20 74 68 72 6f 75 67  to bits 0 throug
3e40: 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  h 5..**.** Note 
3e50: 74 68 61 74 20 74 68 65 20 6d 61 70 70 69 6e 67  that the mapping
3e60: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
3e70: 69 6c 79 20 6f 72 64 65 72 65 64 2e 20 20 49 6e  ily ordered.  In
3e80: 20 74 68 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20   the example.** 
3e90: 61 62 6f 76 65 2c 20 74 68 65 20 6d 61 70 70 69  above, the mappi
3ea0: 6e 67 20 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65  ng might go like
3eb0: 20 74 68 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d   this:  4->3, 5-
3ec0: 3e 31 2c 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c  >1, 8->2, 29->0,
3ed0: 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34  .** 57->5, 73->4
3ee0: 2e 20 20 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39  .  Or one of 719
3ef0: 20 6f 74 68 65 72 20 63 6f 6d 62 69 6e 61 74 69   other combinati
3f00: 6f 6e 73 20 6d 69 67 68 74 20 62 65 20 75 73 65  ons might be use
3f10: 64 2e 20 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d. It.** does no
3f20: 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e  t really matter.
3f30: 20 20 57 68 61 74 20 69 73 20 69 6d 70 6f 72 74    What is import
3f40: 61 6e 74 20 69 73 20 74 68 61 74 20 73 70 61 72  ant is that spar
3f50: 73 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d  se cursor.** num
3f60: 62 65 72 73 20 61 6c 6c 20 67 65 74 20 6d 61 70  bers all get map
3f70: 70 65 64 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d  ped into bit num
3f80: 62 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20  bers that begin 
3f90: 77 69 74 68 20 30 20 61 6e 64 20 63 6f 6e 74 61  with 0 and conta
3fa0: 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a  in.** no gaps..*
3fb0: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4d 61  /.struct WhereMa
3fc0: 73 6b 53 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b  skSet {.  int n;
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fe0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3ff0: 72 20 6f 66 20 61 73 73 69 67 6e 65 64 20 63 75  r of assigned cu
4000: 72 73 6f 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20  rsor values */. 
4010: 20 69 6e 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20   int ix[BMS];   
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4030: 2a 20 43 75 72 73 6f 72 20 61 73 73 69 67 6e 65  * Cursor assigne
4040: 64 20 74 6f 20 65 61 63 68 20 62 69 74 20 2a 2f  d to each bit */
4050: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .};../*.** This 
4060: 6f 62 6a 65 63 74 20 69 73 20 61 20 63 6f 6e 76  object is a conv
4070: 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20  enience wrapper 
4080: 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 69 6e 66 6f  holding all info
4090: 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 0a 2a  rmation needed.*
40a0: 2a 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 57  * to construct W
40b0: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
40c0: 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
40d0: 72 20 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 72 75  r query..*/.stru
40e0: 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ct WhereLoopBuil
40f0: 64 65 72 20 7b 0a 20 20 57 68 65 72 65 49 6e 66  der {.  WhereInf
4100: 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
4110: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
4120: 20 61 62 6f 75 74 20 74 68 69 73 20 57 48 45 52   about this WHER
4130: 45 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  E */.  WhereClau
4140: 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
4150: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
4160: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 45 78 70 72   terms */.  Expr
4170: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
4180: 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42        /* ORDER B
4190: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  Y clause */.  Wh
41a0: 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
41b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
41c0: 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  ate WhereLoop */
41d0: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 42  .  WhereLoop *pB
41e0: 65 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  est;         /* 
41f0: 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 73 74 6f  If non-NULL, sto
4200: 72 65 20 73 69 6e 67 6c 65 20 62 65 73 74 20 6c  re single best l
4210: 6f 6f 70 20 68 65 72 65 20 2a 2f 0a 7d 3b 0a 0a  oop here */.};..
4220: 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52 45 20  /*.** The WHERE 
4230: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
4240: 67 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 77  g routine has tw
4250: 6f 20 68 61 6c 76 65 73 2e 20 20 54 68 65 0a 2a  o halves.  The.*
4260: 2a 20 66 69 72 73 74 20 70 61 72 74 20 64 6f 65  * first part doe
4270: 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  s the start of t
4280: 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 20 61 6e  he WHERE loop an
4290: 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  d the second.** 
42a0: 68 61 6c 66 20 64 6f 65 73 20 74 68 65 20 74 61  half does the ta
42b0: 69 6c 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  il of the WHERE 
42c0: 6c 6f 6f 70 2e 20 20 41 6e 20 69 6e 73 74 61 6e  loop.  An instan
42d0: 63 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 73 74  ce of.** this st
42e0: 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72  ructure is retur
42f0: 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
4300: 20 68 61 6c 66 20 61 6e 64 20 70 61 73 73 65 64   half and passed
4310: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 63  .** into the sec
4320: 6f 6e 64 20 68 61 6c 66 20 74 6f 20 67 69 76 65  ond half to give
4330: 20 73 6f 6d 65 20 63 6f 6e 74 69 6e 75 69 74 79   some continuity
4340: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ..**.** An insta
4350: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
4360: 63 74 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6d  ct holds the com
4370: 70 6c 65 74 65 20 73 74 61 74 65 20 6f 66 20 74  plete state of t
4380: 68 65 20 71 75 65 72 79 0a 2a 2a 20 70 6c 61 6e  he query.** plan
4390: 6e 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  ner..*/.struct W
43a0: 68 65 72 65 49 6e 66 6f 20 7b 0a 20 20 50 61 72  hereInfo {.  Par
43b0: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
43c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
43d0: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
43e0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
43f0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
4400: 4c 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  List;        /* 
4410: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  List of tables i
4420: 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  n the join */.  
4430: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
4440: 42 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  By;       /* The
4450: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
4460: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
4470: 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53  prList *pResultS
4480: 65 74 3b 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  et;     /* Resul
4490: 74 20 73 65 74 2e 20 44 49 53 54 49 4e 43 54 20  t set. DISTINCT 
44a0: 6f 70 65 72 61 74 65 73 20 6f 6e 20 74 68 65 73  operates on thes
44b0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  e */.  WhereLoop
44c0: 20 2a 70 4c 6f 6f 70 73 3b 20 20 20 20 20 20 20   *pLoops;       
44d0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
44e0: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
44f0: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72  s */.  Bitmask r
4500: 65 76 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  evMask;         
4510: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45   /* Mask of ORDE
4520: 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20  R BY terms that 
4530: 6e 65 65 64 20 72 65 76 65 72 73 69 6e 67 20 2a  need reversing *
4540: 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e 52  /.  WhereCost nR
4550: 6f 77 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a  owOut;        /*
4560: 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
4570: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
4580: 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
4590: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
45a0: 2f 2a 20 46 6c 61 67 73 20 6f 72 69 67 69 6e 61  /* Flags origina
45b0: 6c 6c 79 20 70 61 73 73 65 64 20 74 6f 20 73 71  lly passed to sq
45c0: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
45d0: 29 20 2a 2f 0a 20 20 75 38 20 62 4f 42 53 61 74  ) */.  u8 bOBSat
45e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
45f0: 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 73 61 74   /* ORDER BY sat
4600: 69 73 66 69 65 64 20 62 79 20 69 6e 64 69 63 65  isfied by indice
4610: 73 20 2a 2f 0a 20 20 75 38 20 6f 6b 4f 6e 65 50  s */.  u8 okOneP
4620: 61 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ass;            
4630: 20 2f 2a 20 4f 6b 20 74 6f 20 75 73 65 20 6f 6e   /* Ok to use on
4640: 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
4650: 20 66 6f 72 20 55 50 44 41 54 45 2f 44 45 4c 45   for UPDATE/DELE
4660: 54 45 20 2a 2f 0a 20 20 75 38 20 75 6e 74 65 73  TE */.  u8 untes
4670: 74 65 64 54 65 72 6d 73 3b 20 20 20 20 20 20 20  tedTerms;       
4680: 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 20 57 48 45    /* Not all WHE
4690: 52 45 20 74 65 72 6d 73 20 72 65 73 6f 6c 76 65  RE terms resolve
46a0: 64 20 62 79 20 6f 75 74 65 72 20 6c 6f 6f 70 20  d by outer loop 
46b0: 2a 2f 0a 20 20 75 38 20 65 44 69 73 74 69 6e 63  */.  u8 eDistinc
46c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
46d0: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
46e0: 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 76 61  RE_DISTINCT_* va
46f0: 6c 75 65 73 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  lues below */.  
4700: 75 38 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20  u8 nLevel;      
4710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4720: 62 65 72 20 6f 66 20 6e 65 73 74 65 64 20 6c 6f  ber of nested lo
4730: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f 70  op */.  int iTop
4740: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4750: 20 20 2f 2a 20 54 68 65 20 76 65 72 79 20 62 65    /* The very be
4760: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 57  ginning of the W
4770: 48 45 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  HERE loop */.  i
4780: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 20 20 20  nt iContinue;   
4790: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
47a0: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
47b0: 65 20 77 69 74 68 20 6e 65 78 74 20 72 65 63 6f  e with next reco
47c0: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  rd */.  int iBre
47d0: 61 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ak;             
47e0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
47f0: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
4800: 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
4810: 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
4820: 3b 20 20 20 20 20 20 2f 2a 20 70 50 61 72 73 65  ;      /* pParse
4830: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 6f 75 74  ->nQueryLoop out
4840: 73 69 64 65 20 74 68 65 20 57 48 45 52 45 20 6c  side the WHERE l
4850: 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  oop */.  WhereMa
4860: 73 6b 53 65 74 20 73 4d 61 73 6b 53 65 74 3b 20  skSet sMaskSet; 
4870: 20 20 20 2f 2a 20 4d 61 70 20 63 75 72 73 6f 72     /* Map cursor
4880: 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d   numbers to bitm
4890: 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  asks */.  WhereC
48a0: 6c 61 75 73 65 20 73 57 43 3b 20 20 20 20 20 20  lause sWC;      
48b0: 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69      /* Decomposi
48c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 57 48 45 52  tion of the WHER
48d0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
48e0: 65 72 65 4c 65 76 65 6c 20 61 5b 31 5d 3b 20 20  ereLevel a[1];  
48f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
4900: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63  mation about eac
4910: 68 20 6e 65 73 74 20 6c 6f 6f 70 20 69 6e 20 57  h nest loop in W
4920: 48 45 52 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  HERE */.};../*.*
4930: 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74  * Bitmasks for t
4940: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 6f 6e 20  he operators on 
4950: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
4960: 73 2e 20 20 54 68 65 73 65 20 61 72 65 20 61 6c  s.  These are al
4970: 6c 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74  l.** operators t
4980: 68 61 74 20 61 72 65 20 6f 66 20 69 6e 74 65 72  hat are of inter
4990: 65 73 74 20 74 6f 20 74 68 65 20 71 75 65 72 79  est to the query
49a0: 20 70 6c 61 6e 6e 65 72 2e 20 20 41 6e 0a 2a 2a   planner.  An.**
49b0: 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69   OR-ed combinati
49c0: 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75  on of these valu
49d0: 65 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  es can be used w
49e0: 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20 66 6f  hen searching fo
49f0: 72 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20  r.** particular 
4a00: 57 68 65 72 65 54 65 72 6d 73 20 77 69 74 68 69  WhereTerms withi
4a10: 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 2e  n a WhereClause.
4a20: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49  .*/.#define WO_I
4a30: 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65 66  N     0x001.#def
4a40: 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30 78  ine WO_EQ     0x
4a50: 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c  002.#define WO_L
4a60: 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  T     (WO_EQ<<(T
4a70: 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65  K_LT-TK_EQ)).#de
4a80: 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20 28  fine WO_LE     (
4a90: 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b  WO_EQ<<(TK_LE-TK
4aa0: 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f  _EQ)).#define WO
4ab0: 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c  _GT     (WO_EQ<<
4ac0: 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a 23  (TK_GT-TK_EQ)).#
4ad0: 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20 20  define WO_GE    
4ae0: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d   (WO_EQ<<(TK_GE-
4af0: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
4b00: 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30 0a  WO_MATCH  0x040.
4b10: 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55 4c  #define WO_ISNUL
4b20: 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65 20  L 0x080.#define 
4b30: 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30 20  WO_OR     0x100 
4b40: 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20        /* Two or 
4b50: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
4b60: 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69  d terms */.#defi
4b70: 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78 32  ne WO_AND    0x2
4b80: 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20  00       /* Two 
4b90: 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e  or more AND-conn
4ba0: 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23  ected terms */.#
4bb0: 64 65 66 69 6e 65 20 57 4f 5f 45 51 55 49 56 20  define WO_EQUIV 
4bc0: 20 30 78 34 30 30 20 20 20 20 20 20 20 2f 2a 20   0x400       /* 
4bd0: 4f 66 20 74 68 65 20 66 6f 72 6d 20 41 3d 3d 42  Of the form A==B
4be0: 2c 20 62 6f 74 68 20 63 6f 6c 75 6d 6e 73 20 2a  , both columns *
4bf0: 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f 4f  /.#define WO_NOO
4c00: 50 20 20 20 30 78 38 30 30 20 20 20 20 20 20 20  P   0x800       
4c10: 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64 6f 65  /* This term doe
4c20: 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74 20 73  s not restrict s
4c30: 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 0a  earch space */..
4c40: 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20 20  #define WO_ALL  
4c50: 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f 2a    0xfff       /*
4c60: 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f 73   Mask of all pos
4c70: 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75 65  sible WO_* value
4c80: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  s */.#define WO_
4c90: 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20 20  SINGLE 0x0ff    
4ca0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c     /* Mask of al
4cb0: 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57  l non-compound W
4cc0: 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f  O_* values */../
4cd0: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 64  *.** These are d
4ce0: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 62 69  efinitions of bi
4cf0: 74 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 4c  ts in the WhereL
4d00: 6f 6f 70 2e 77 73 46 6c 61 67 73 20 66 69 65 6c  oop.wsFlags fiel
4d10: 64 2e 0a 2a 2a 20 54 68 65 20 70 61 72 74 69 63  d..** The partic
4d20: 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ular combination
4d30: 20 6f 66 20 62 69 74 73 20 69 6e 20 65 61 63 68   of bits in each
4d40: 20 57 68 65 72 65 4c 6f 6f 70 20 68 65 6c 70 20   WhereLoop help 
4d50: 74 6f 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20  to.** determine 
4d60: 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68  the algorithm th
4d70: 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 72 65 70  at WhereLoop rep
4d80: 72 65 73 65 6e 74 73 2e 0a 2a 2f 0a 23 64 65 66  resents..*/.#def
4d90: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ine WHERE_COLUMN
4da0: 5f 45 51 20 20 20 20 30 78 30 30 30 30 30 30 30  _EQ    0x0000000
4db0: 31 20 20 2f 2a 20 78 3d 45 58 50 52 20 2a 2f 0a  1  /* x=EXPR */.
4dc0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
4dd0: 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30 30  LUMN_RANGE 0x000
4de0: 30 30 30 30 32 20 20 2f 2a 20 78 3c 45 58 50 52  00002  /* x<EXPR
4df0: 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a   and/or x>EXPR *
4e00: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
4e10: 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78 30  COLUMN_IN    0x0
4e20: 30 30 30 30 30 30 34 20 20 2f 2a 20 78 20 49 4e  0000004  /* x IN
4e30: 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e   (...) */.#defin
4e40: 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  e WHERE_COLUMN_N
4e50: 55 4c 4c 20 20 30 78 30 30 30 30 30 30 30 38 20  ULL  0x00000008 
4e60: 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f   /* x IS NULL */
4e70: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
4e80: 4f 4e 53 54 52 41 49 4e 54 20 20 20 30 78 30 30  ONSTRAINT   0x00
4e90: 30 30 30 30 30 66 20 20 2f 2a 20 41 6e 79 20 6f  00000f  /* Any o
4ea0: 66 20 74 68 65 20 57 48 45 52 45 5f 43 4f 4c 55  f the WHERE_COLU
4eb0: 4d 4e 5f 78 78 78 20 76 61 6c 75 65 73 20 2a 2f  MN_xxx values */
4ec0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54  .#define WHERE_T
4ed0: 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30  OP_LIMIT    0x00
4ee0: 30 30 30 30 31 30 20 20 2f 2a 20 78 3c 45 58 50  000010  /* x<EXP
4ef0: 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e  R or x<=EXPR con
4f00: 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69  straint */.#defi
4f10: 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  ne WHERE_BTM_LIM
4f20: 49 54 20 20 20 20 30 78 30 30 30 30 30 30 32 30  IT    0x00000020
4f30: 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20 78    /* x>EXPR or x
4f40: 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e  >=EXPR constrain
4f50: 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  t */.#define WHE
4f60: 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20 20  RE_BOTH_LIMIT   
4f70: 30 78 30 30 30 30 30 30 33 30 20 20 2f 2a 20 42  0x00000030  /* B
4f80: 6f 74 68 20 78 3e 45 58 50 52 20 61 6e 64 20 78  oth x>EXPR and x
4f90: 3c 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  <EXPR */.#define
4fa0: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
4fb0: 20 20 20 20 30 78 30 30 30 30 30 30 34 30 20 20      0x00000040  
4fc0: 2f 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c  /* Use index onl
4fd0: 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a  y - omit table *
4fe0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
4ff0: 49 50 4b 20 20 20 20 20 20 20 20 20 20 30 78 30  IPK          0x0
5000: 30 30 30 30 31 30 30 20 20 2f 2a 20 78 20 69 73  0000100  /* x is
5010: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
5020: 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 23 64 65 66  MARY KEY */.#def
5030: 69 6e 65 20 57 48 45 52 45 5f 49 4e 44 45 58 45  ine WHERE_INDEXE
5040: 44 20 20 20 20 20 20 30 78 30 30 30 30 30 32 30  D      0x0000020
5050: 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e  0  /* WhereLoop.
5060: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 69  u.btree.pIndex i
5070: 73 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66 69  s valid */.#defi
5080: 6e 65 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c  ne WHERE_VIRTUAL
5090: 54 41 42 4c 45 20 30 78 30 30 30 30 30 34 30 30  TABLE 0x00000400
50a0: 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75    /* WhereLoop.u
50b0: 2e 76 74 61 62 20 69 73 20 76 61 6c 69 64 20 2a  .vtab is valid *
50c0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
50d0: 49 4e 5f 41 42 4c 45 20 20 20 20 20 20 30 78 30  IN_ABLE      0x0
50e0: 30 30 30 30 38 30 30 20 20 2f 2a 20 41 62 6c 65  0000800  /* Able
50f0: 20 74 6f 20 73 75 70 70 6f 72 74 20 61 6e 20 49   to support an I
5100: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23 64  N operator */.#d
5110: 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 4e 45 52  efine WHERE_ONER
5120: 4f 57 20 20 20 20 20 20 20 30 78 30 30 30 30 31  OW       0x00001
5130: 30 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20  000  /* Selects 
5140: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
5150: 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20   row */.#define 
5160: 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20  WHERE_MULTI_OR  
5170: 20 20 20 30 78 30 30 30 30 32 30 30 30 20 20 2f     0x00002000  /
5180: 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69  * OR using multi
5190: 70 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 23  ple indices */.#
51a0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 41 55 54  define WHERE_AUT
51b0: 4f 5f 49 4e 44 45 58 20 20 20 30 78 30 30 30 30  O_INDEX   0x0000
51c0: 34 30 30 30 20 20 2f 2a 20 55 73 65 73 20 61 6e  4000  /* Uses an
51d0: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
51e0: 20 2a 2f 0a 0a 0a 2f 2a 20 43 6f 6e 76 65 72 74   */.../* Convert
51f0: 20 61 20 57 68 65 72 65 43 6f 73 74 20 76 61 6c   a WhereCost val
5200: 75 65 20 28 31 30 20 74 69 6d 65 73 20 6c 6f 67  ue (10 times log
5210: 32 28 58 29 29 20 69 6e 74 6f 20 69 74 73 20 69  2(X)) into its i
5220: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 58 2e 0a  nteger value X..
5230: 2a 2a 20 41 20 72 6f 75 67 68 20 61 70 70 72 6f  ** A rough appro
5240: 78 69 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ximation is used
5250: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  .  The value ret
5260: 75 72 6e 65 64 20 69 73 20 6e 6f 74 20 65 78 61  urned is not exa
5270: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36  ct..*/.static u6
5280: 34 20 77 68 65 72 65 43 6f 73 74 54 6f 49 6e 74  4 whereCostToInt
5290: 28 57 68 65 72 65 43 6f 73 74 20 78 29 7b 0a 20  (WhereCost x){. 
52a0: 20 75 36 34 20 6e 3b 0a 20 20 69 66 28 20 78 3c   u64 n;.  if( x<
52b0: 31 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  10 ) return 1;. 
52c0: 20 6e 20 3d 20 78 25 31 30 3b 0a 20 20 78 20 2f   n = x%10;.  x /
52d0: 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 3e 3d 35  = 10;.  if( n>=5
52e0: 20 29 20 6e 20 2d 3d 20 32 3b 0a 20 20 65 6c 73   ) n -= 2;.  els
52f0: 65 20 69 66 28 20 6e 3e 3d 31 20 29 20 6e 20 2d  e if( n>=1 ) n -
5300: 3d 20 31 3b 0a 20 20 69 66 28 20 78 3e 3d 33 20  = 1;.  if( x>=3 
5310: 29 20 72 65 74 75 72 6e 20 28 6e 2b 38 29 3c 3c  ) return (n+8)<<
5320: 28 78 2d 33 29 3b 0a 20 20 72 65 74 75 72 6e 20  (x-3);.  return 
5330: 28 6e 2b 38 29 3e 3e 28 33 2d 78 29 3b 0a 7d 0a  (n+8)>>(3-x);.}.
5340: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5350: 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
5360: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
5370: 73 20 66 72 6f 6d 20 61 20 57 48 45 52 45 20 63  s from a WHERE c
5380: 6c 61 75 73 65 0a 2a 2f 0a 75 36 34 20 73 71 6c  lause.*/.u64 sql
5390: 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
53a0: 6f 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66  owCount(WhereInf
53b0: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
53c0: 74 75 72 6e 20 77 68 65 72 65 43 6f 73 74 54 6f  turn whereCostTo
53d0: 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  Int(pWInfo->nRow
53e0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Out);.}../*.** R
53f0: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65  eturn one of the
5400: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
5410: 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20  xxxxx values to 
5420: 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69  indicate how thi
5430: 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  s.** WHERE claus
5440: 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74  e returns output
5450: 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  s for DISTINCT p
5460: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e  rocessing..*/.in
5470: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
5480: 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e  Distinct(WhereIn
5490: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
54a0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44  eturn pWInfo->eD
54b0: 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  istinct;.}../*.*
54c0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
54d0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
54e0: 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69  e returns rows i
54f0: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  n ORDER BY order
5500: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  ..** Return FALS
5510: 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  E if the output 
5520: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74  needs to be sort
5530: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
5540: 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
5550: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
5560: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
5570: 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30 3b  Info->bOBSat!=0;
5580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5590: 20 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73   the VDBE addres
55a0: 73 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75  s or label to ju
55b0: 6d 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74  mp to in order t
55c0: 6f 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d  o continue.** im
55d0: 6d 65 64 69 61 74 65 6c 79 20 77 69 74 68 20 74  mediately with t
55e0: 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61  he next row of a
55f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
5600: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
5610: 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28  reContinueLabel(
5620: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
5630: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
5640: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a  nfo->iContinue;.
5650: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5660: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
5670: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
5680: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
5690: 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66   break.** out of
56a0: 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a   a WHERE loop..*
56b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
56c0: 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65  reBreakLabel(Whe
56d0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
56e0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
56f0: 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a  ->iBreak;.}../*.
5700: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
5710: 66 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  f an UPDATE or D
5720: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
5730: 63 61 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65  can operate dire
5740: 63 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72  ctly on.** the r
5750: 6f 77 69 64 73 20 72 65 74 75 72 6e 65 64 20 62  owids returned b
5760: 79 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  y a WHERE clause
5770: 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  .  Return FALSE 
5780: 69 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55  if doing an.** U
5790: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
57a0: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 73 75 62  might change sub
57b0: 73 65 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c  sequent WHERE cl
57c0: 61 75 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2f  ause results..*/
57d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
57e0: 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68 65 72 65  eOkOnePass(Where
57f0: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
5800: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
5810: 6f 6b 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f 2a  okOnePass;.}../*
5820: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
5830: 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68   preallocated Wh
5840: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
5850: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
5860: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49  oid whereClauseI
5870: 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75  nit(.  WhereClau
5880: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
5890: 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  /* The WhereClau
58a0: 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c  se to be initial
58b0: 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 49  ized */.  WhereI
58c0: 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20 20  nfo *pWInfo     
58d0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
58e0: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
58f0: 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e  xt */.){.  pWC->
5900: 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b  pWInfo = pWInfo;
5910: 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20 3d  .  pWC->pOuter =
5920: 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d   0;.  pWC->nTerm
5930: 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c   = 0;.  pWC->nSl
5940: 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70  ot = ArraySize(p
5950: 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20  WC->aStatic);.  
5960: 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53  pWC->a = pWC->aS
5970: 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  tatic;.}../* For
5980: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
5990: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
59a0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57  ereClauseClear(W
59b0: 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f  hereClause*);../
59c0: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
59d0: 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
59e0: 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68 65  iated with a Whe
59f0: 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  reOrInfo object.
5a00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5a10: 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74  whereOrInfoDelet
5a20: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
5a30: 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a  hereOrInfo *p){.
5a40: 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
5a50: 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71  ar(&p->wc);.  sq
5a60: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5a70: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  p);.}../*.** Dea
5a80: 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f  llocate all memo
5a90: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
5aa0: 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e 66  th a WhereAndInf
5ab0: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  o object..*/.sta
5ac0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41 6e  tic void whereAn
5ad0: 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69  dInfoDelete(sqli
5ae0: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41 6e  te3 *db, WhereAn
5af0: 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65  dInfo *p){.  whe
5b00: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70  reClauseClear(&p
5b10: 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->wc);.  sqlite3
5b20: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
5b30: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
5b40: 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73 65  te a WhereClause
5b50: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
5b60: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
5b70: 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66  ucture.** itself
5b80: 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20   is not freed.  
5b90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5ba0: 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77  the inverse of w
5bb0: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29  hereClauseInit()
5bc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5bd0: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
5be0: 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  r(WhereClause *p
5bf0: 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  WC){.  int i;.  
5c00: 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20  WhereTerm *a;.  
5c10: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
5c20: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  C->pWInfo->pPars
5c30: 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70  e->db;.  for(i=p
5c40: 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70  WC->nTerm-1, a=p
5c50: 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d  WC->a; i>=0; i--
5c60: 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , a++){.    if( 
5c70: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
5c80: 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  M_DYNAMIC ){.   
5c90: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
5ca0: 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70  lete(db, a->pExp
5cb0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
5cc0: 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  ( a->wtFlags & T
5cd0: 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20  ERM_ORINFO ){.  
5ce0: 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44      whereOrInfoD
5cf0: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70  elete(db, a->u.p
5d00: 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c  OrInfo);.    }el
5d10: 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67  se if( a->wtFlag
5d20: 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  s & TERM_ANDINFO
5d30: 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41   ){.      whereA
5d40: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c  ndInfoDelete(db,
5d50: 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b   a->u.pAndInfo);
5d60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5d70: 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53   pWC->a!=pWC->aS
5d80: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c  tatic ){.    sql
5d90: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5da0: 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  WC->a);.  }.}../
5db0: 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
5dc0: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
5dd0: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68 65  entry to the Whe
5de0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
5df0: 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20  pWC..** The new 
5e00: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
5e10: 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20   is constructed 
5e20: 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20  from Expr p and 
5e30: 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a  with wtFlags..**
5e40: 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57   The index in pW
5e50: 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65  C->a[] of the ne
5e60: 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20 72  w WhereTerm is r
5e70: 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
5e80: 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75  ss..** 0 is retu
5e90: 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77 20  rned if the new 
5ea0: 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20  WhereTerm could 
5eb0: 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75 65  not be added due
5ec0: 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20   to a memory.** 
5ed0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
5ee0: 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c  .  The memory al
5ef0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  location failure
5f00: 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65   will be recorde
5f10: 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e  d in.** the db->
5f20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
5f30: 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65 72  g so that higher
5f40: 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73  -level functions
5f50: 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a   can detect it..
5f60: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5f70: 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ne will increase
5f80: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
5f90: 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20   pWC->a[] array 
5fa0: 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
5fb0: 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61  .** If the wtFla
5fc0: 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c  gs argument incl
5fd0: 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49  udes TERM_DYNAMI
5fe0: 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69  C, then responsi
5ff0: 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72  bility.** for fr
6000: 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65 73  eeing the expres
6010: 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65  sion p is assume
6020: 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43 6c  d by the WhereCl
6030: 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e  ause object pWC.
6040: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75 65  .** This is true
6050: 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f   even if this ro
6060: 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61  utine fails to a
6070: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68  llocate a new Wh
6080: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57  ereTerm..**.** W
6090: 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f  ARNING:  This ro
60a0: 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c  utine might real
60b0: 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65  locate the space
60c0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a   used to store.*
60d0: 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41  * WhereTerms.  A
60e0: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57  ll pointers to W
60f0: 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64  hereTerms should
6100: 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
6110: 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67  after.** calling
6120: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
6130: 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61  Such pointers ma
6140: 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a  y be reinitializ
6150: 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e  ed by referencin
6160: 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b  g.** the pWC->a[
6170: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
6180: 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75  ic int whereClau
6190: 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c  seInsert(WhereCl
61a0: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
61b0: 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b  *p, u8 wtFlags){
61c0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
61d0: 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  erm;.  int idx;.
61e0: 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46 6c    testcase( wtFl
61f0: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
6200: 41 4c 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d  AL );  /* EV: R-
6210: 30 30 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a 20  00211-15100 */. 
6220: 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e   if( pWC->nTerm>
6230: 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20  =pWC->nSlot ){. 
6240: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
6250: 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20  ld = pWC->a;.   
6260: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
6270: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
6280: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43 2d  se->db;.    pWC-
6290: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
62a0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
62b0: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57  of(pWC->a[0])*pW
62c0: 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20  C->nSlot*2 );.  
62d0: 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20    if( pWC->a==0 
62e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 74 46  ){.      if( wtF
62f0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41  lags & TERM_DYNA
6300: 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73  MIC ){.        s
6310: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6320: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d  (db, p);.      }
6330: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d 20  .      pWC->a = 
6340: 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74 75  pOld;.      retu
6350: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
6360: 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20 70  memcpy(pWC->a, p
6370: 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  Old, sizeof(pWC-
6380: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72  >a[0])*pWC->nTer
6390: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  m);.    if( pOld
63a0: 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29  !=pWC->aStatic )
63b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
63c0: 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64 29 3b  bFree(db, pOld);
63d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e  .    }.    pWC->
63e0: 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33 44  nSlot = sqlite3D
63f0: 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
6400: 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28 70  pWC->a)/sizeof(p
6410: 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20  WC->a[0]);.  }. 
6420: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
6430: 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72  [idx = pWC->nTer
6440: 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e 70  m++];.  pTerm->p
6450: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
6460: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 29  prSkipCollate(p)
6470: 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  ;.  pTerm->wtFla
6480: 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20  gs = wtFlags;.  
6490: 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43  pTerm->pWC = pWC
64a0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  ;.  pTerm->iPare
64b0: 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  nt = -1;.  retur
64c0: 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n idx;.}../*.** 
64d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65  This routine ide
64e0: 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72 65  ntifies subexpre
64f0: 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48  ssions in the WH
6500: 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65  ERE clause where
6510: 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70 72  .** each subexpr
6520: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
6530: 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f  ted by the AND o
6540: 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20  perator or some 
6550: 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f  other.** operato
6560: 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  r specified in t
6570: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
6580: 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73    The WhereClaus
6590: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
65a0: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f  s filled with po
65b0: 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78 70  inters to subexp
65c0: 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65  ressions.  For e
65d0: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
65e0: 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c   WHERE  a=='hell
65f0: 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28  o' AND coalesce(
6600: 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b  b,11)<10 AND (c+
6610: 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a  12!=d OR c==22).
6620: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f  **           \__
6630: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f  ______/     \___
6640: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  ____________/   
6650: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
6660: 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
6670: 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20     slot[0]      
6680: 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20        slot[1]   
6690: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
66a0: 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  [2].**.** The or
66b0: 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61  iginal WHERE cla
66c0: 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73 20  use in pExpr is 
66d0: 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20  unaltered.  All 
66e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
66f0: 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f  does is make slo
6700: 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e  t[] entries poin
6710: 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75 72  t to substructur
6720: 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a  e within pExpr..
6730: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65  **.** In the pre
6740: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61  vious sentence a
6750: 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  nd in the diagra
6760: 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65  m, "slot[]" refe
6770: 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65  rs to.** the Whe
6780: 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72  reClause.a[] arr
6790: 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d 20  ay.  The slot[] 
67a0: 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20 6e  array grows as n
67b0: 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  eeded to contain
67c0: 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  .** all terms of
67d0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
67e0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
67f0: 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68 65  d whereSplit(Whe
6800: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
6810: 78 70 72 20 2a 70 45 78 70 72 2c 20 75 38 20 6f  xpr *pExpr, u8 o
6820: 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20  p){.  pWC->op = 
6830: 6f 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  op;.  if( pExpr=
6840: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
6850: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70  f( pExpr->op!=op
6860: 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61   ){.    whereCla
6870: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
6880: 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Expr, 0);.  }els
6890: 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69  e{.    whereSpli
68a0: 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c  t(pWC, pExpr->pL
68b0: 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68  eft, op);.    wh
68c0: 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45  ereSplit(pWC, pE
68d0: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29  xpr->pRight, op)
68e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
68f0: 6e 69 74 69 61 6c 69 7a 65 20 61 20 57 68 65 72  nitialize a Wher
6900: 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 0a  eMaskSet object.
6910: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d  */.#define initM
6920: 61 73 6b 53 65 74 28 50 29 20 20 28 50 29 2d 3e  askSet(P)  (P)->
6930: 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  n=0../*.** Retur
6940: 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  n the bitmask fo
6950: 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  r the given curs
6960: 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  or number.  Retu
6970: 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73  rn 0 if.** iCurs
6980: 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  or is not in the
6990: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
69a0: 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28  Bitmask getMask(
69b0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
69c0: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
69d0: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
69e0: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
69f0: 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  t->n<=(int)sizeo
6a00: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a  f(Bitmask)*8 );.
6a10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
6a20: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
6a30: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
6a40: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
6a50: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
6a60: 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
6a70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6a80: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
6a90: 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f  te a new mask fo
6aa0: 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72  r cursor iCursor
6ab0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
6ac0: 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20   one cursor per 
6ad0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
6ae0: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e  M clause.  The n
6af0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c  umber of.** tabl
6b00: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
6b10: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
6b20: 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79   by a test early
6b30: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   in the.** sqlit
6b40: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72  e3WhereBegin() r
6b50: 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b  outine.  So we k
6b60: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61  now that the pMa
6b70: 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61  skSet->ix[].** a
6b80: 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  rray will never 
6b90: 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61  overflow..*/.sta
6ba0: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d  tic void createM
6bb0: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
6bc0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
6bd0: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
6be0: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
6bf0: 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73  < ArraySize(pMas
6c00: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
6c10: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
6c20: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
6c30: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rsor;.}../*.** T
6c40: 68 65 73 65 20 72 6f 75 74 69 6e 65 20 77 61 6c  hese routine wal
6c50: 6b 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20  k (recursively) 
6c60: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
6c70: 65 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ee and generates
6c80: 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e  .** a bitmask in
6c90: 64 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74  dicating which t
6ca0: 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69  ables are used i
6cb0: 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
6cc0: 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f 0a 73 74  n.** tree..*/.st
6cd0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
6ce0: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
6cf0: 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20 45  WhereMaskSet*, E
6d00: 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69  xprList*);.stati
6d10: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65  c Bitmask exprSe
6d20: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57  lectTableUsage(W
6d30: 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20 53 65  hereMaskSet*, Se
6d40: 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20 42  lect*);.static B
6d50: 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65  itmask exprTable
6d60: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
6d70: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78  et *pMaskSet, Ex
6d80: 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73  pr *p){.  Bitmas
6d90: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
6da0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
6db0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  0;.  if( p->op==
6dc0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
6dd0: 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28   mask = getMask(
6de0: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61  pMaskSet, p->iTa
6df0: 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ble);.    return
6e00: 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73   mask;.  }.  mas
6e10: 6b 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  k = exprTableUsa
6e20: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
6e30: 70 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20  pRight);.  mask 
6e40: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
6e50: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70  e(pMaskSet, p->p
6e60: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 45 78 70  Left);.  if( Exp
6e70: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6e80: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
6e90: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
6ea0: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
6eb0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78  e(pMaskSet, p->x
6ec0: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c  .pSelect);.  }el
6ed0: 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  se{.    mask |= 
6ee0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
6ef0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
6f00: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  x.pList);.  }.  
6f10: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73  return mask;.}.s
6f20: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
6f30: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
6f40: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
6f50: 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73  MaskSet, ExprLis
6f60: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
6f70: 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61   i;.  Bitmask ma
6f80: 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c  sk = 0;.  if( pL
6f90: 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ist ){.    for(i
6fa0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
6fb0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
6fc0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
6fd0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
6fe0: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
6ff0: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pr);.    }.  }. 
7000: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
7010: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
7020: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
7030: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
7040: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65   *pMaskSet, Sele
7050: 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61  ct *pS){.  Bitma
7060: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77  sk mask = 0;.  w
7070: 68 69 6c 65 28 20 70 53 20 29 7b 0a 20 20 20 20  hile( pS ){.    
7080: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
7090: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 6d 61  pS->pSrc;.    ma
70a0: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
70b0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
70c0: 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a  t, pS->pEList);.
70d0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
70e0: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
70f0: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72  MaskSet, pS->pGr
7100: 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b  oupBy);.    mask
7110: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
7120: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7130: 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a   pS->pOrderBy);.
7140: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
7150: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
7160: 53 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29  Set, pS->pWhere)
7170: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
7180: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
7190: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69  skSet, pS->pHavi
71a0: 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 41 4c 57  ng);.    if( ALW
71b0: 41 59 53 28 70 53 72 63 21 3d 30 29 20 29 7b 0a  AYS(pSrc!=0) ){.
71c0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
71d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
71e0: 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
71f0: 20 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20          mask |= 
7200: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
7210: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
7220: 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  Src->a[i].pSelec
7230: 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  t);.        mask
7240: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
7250: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 72  ge(pMaskSet, pSr
7260: 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20  c->a[i].pOn);.  
7270: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7280: 70 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b  pS = pS->pPrior;
7290: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61  .  }.  return ma
72a0: 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  sk;.}../*.** Ret
72b0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
72c0: 67 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69  given operator i
72d0: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65  s one of the ope
72e0: 72 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a  rators that is.*
72f0: 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e  * allowed for an
7300: 20 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45   indexable WHERE
7310: 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54   clause term.  T
7320: 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61  he allowed opera
7330: 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c  tors are.** "=",
7340: 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c   "<", ">", "<=",
7350: 20 22 3e 3d 22 2c 20 22 49 4e 22 2c 20 61 6e 64   ">=", "IN", and
7360: 20 22 49 53 20 4e 55 4c 4c 22 0a 2a 2a 0a 2a 2a   "IS NULL".**.**
7370: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
7380: 4f 46 3a 20 52 2d 35 39 39 32 36 2d 32 36 33 39  OF: R-59926-2639
7390: 33 20 54 6f 20 62 65 20 75 73 61 62 6c 65 20 62  3 To be usable b
73a0: 79 20 61 6e 20 69 6e 64 65 78 20 61 20 74 65 72  y an index a ter
73b0: 6d 20 6d 75 73 74 20 62 65 0a 2a 2a 20 6f 66 20  m must be.** of 
73c0: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
73d0: 77 69 6e 67 20 66 6f 72 6d 73 3a 20 63 6f 6c 75  wing forms: colu
73e0: 6d 6e 20 3d 20 65 78 70 72 65 73 73 69 6f 6e 20  mn = expression 
73f0: 63 6f 6c 75 6d 6e 20 3e 20 65 78 70 72 65 73 73  column > express
7400: 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 3e 3d  ion.** column >=
7410: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75   expression colu
7420: 6d 6e 20 3c 20 65 78 70 72 65 73 73 69 6f 6e 20  mn < expression 
7430: 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78 70 72 65 73  column <= expres
7440: 73 69 6f 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  sion.** expressi
7450: 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20 65 78 70 72  on = column expr
7460: 65 73 73 69 6f 6e 20 3e 20 63 6f 6c 75 6d 6e 20  ession > column 
7470: 65 78 70 72 65 73 73 69 6f 6e 20 3e 3d 20 63 6f  expression >= co
7480: 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  lumn.** expressi
7490: 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20 65 78 70 72  on < column expr
74a0: 65 73 73 69 6f 6e 20 3c 3d 20 63 6f 6c 75 6d 6e  ession <= column
74b0: 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a 2a 20 28 65   column IN.** (e
74c0: 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 29 20  xpression-list) 
74d0: 63 6f 6c 75 6d 6e 20 49 4e 20 28 73 75 62 71 75  column IN (subqu
74e0: 65 72 79 29 20 63 6f 6c 75 6d 6e 20 49 53 20 4e  ery) column IS N
74f0: 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ULL.*/.static in
7500: 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20  t allowedOp(int 
7510: 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 54  op){.  assert( T
7520: 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_GT>TK_EQ && TK
7530: 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _GT<TK_GE );.  a
7540: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f  ssert( TK_LT>TK_
7550: 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47  EQ && TK_LT<TK_G
7560: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
7570: 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_LE>TK_EQ && TK
7580: 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _LE<TK_GE );.  a
7590: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b  ssert( TK_GE==TK
75a0: 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75 72  _EQ+4 );.  retur
75b0: 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28  n op==TK_IN || (
75c0: 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c  op>=TK_EQ && op<
75d0: 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54  =TK_GE) || op==T
75e0: 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a  K_ISNULL;.}../*.
75f0: 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a 65  ** Swap two obje
7600: 63 74 73 20 6f 66 20 74 79 70 65 20 54 59 50 45  cts of type TYPE
7610: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57 41  ..*/.#define SWA
7620: 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59 50  P(TYPE,A,B) {TYP
7630: 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b  E t=A; A=B; B=t;
7640: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65  }../*.** Commute
7650: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
7660: 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73 73  erator.  Express
7670: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
7680: 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65   "X op Y".** are
7690: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
76a0: 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20  "Y op X"..**.** 
76b0: 49 66 20 6c 65 66 74 2f 72 69 67 68 74 20 70 72  If left/right pr
76c0: 65 63 65 64 65 6e 63 65 20 72 75 6c 65 73 20 63  ecedence rules c
76d0: 6f 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20 77 68  ome into play wh
76e0: 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 74  en determining t
76f0: 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20  he.** collating 
7700: 73 65 71 75 65 6e 63 65 2c 20 74 68 65 6e 20 43  sequence, then C
7710: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
7720: 20 61 72 65 20 61 64 6a 75 73 74 65 64 20 74 6f   are adjusted to
7730: 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74 20   ensure.** that 
7740: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
7750: 71 75 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20  quence does not 
7760: 63 68 61 6e 67 65 2e 20 20 46 6f 72 20 65 78 61  change.  For exa
7770: 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20 63 6f 6c 6c  mple:.** "Y coll
7780: 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 58 22  ate NOCASE op X"
7790: 20 62 65 63 6f 6d 65 73 20 22 58 20 6f 70 20 59   becomes "X op Y
77a0: 22 20 62 65 63 61 75 73 65 20 61 6e 79 20 63 6f  " because any co
77b0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
77c0: 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20   on.** the left 
77d0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 63  hand side of a c
77e0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72 69  omparison overri
77f0: 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  des any collatio
7800: 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61  n sequence .** a
7810: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 72  ttached to the r
7820: 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73 61  ight. For the sa
7830: 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45 50  me reason the EP
7840: 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a  _Collate flag.**
7850: 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64   is not commuted
7860: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7870: 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50 61 72   exprCommute(Par
7880: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
7890: 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20   *pExpr){.  u16 
78a0: 65 78 70 52 69 67 68 74 20 3d 20 28 70 45 78 70  expRight = (pExp
78b0: 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  r->pRight->flags
78c0: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a   & EP_Collate);.
78d0: 20 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d 20    u16 expLeft = 
78e0: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66  (pExpr->pLeft->f
78f0: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
7900: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c  e);.  assert( al
7910: 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f  lowedOp(pExpr->o
7920: 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21  p) && pExpr->op!
7930: 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66 28 20  =TK_IN );.  if( 
7940: 65 78 70 52 69 67 68 74 3d 3d 65 78 70 4c 65 66  expRight==expLef
7950: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  t ){.    /* Eith
7960: 65 72 20 58 20 61 6e 64 20 59 20 62 6f 74 68 20  er X and Y both 
7970: 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65  have COLLATE ope
7980: 72 61 74 6f 72 20 6f 72 20 6e 65 69 74 68 65 72  rator or neither
7990: 20 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28 20 65   do */.    if( e
79a0: 78 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  xpRight ){.     
79b0: 20 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64 20 59   /* Both X and Y
79c0: 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70   have COLLATE op
79d0: 65 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65 20 73  erators.  Make s
79e0: 75 72 65 20 58 20 69 73 20 61 6c 77 61 79 73 0a  ure X is always.
79f0: 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79        ** used by
7a00: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 45 50   clearing the EP
7a10: 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20 66 72  _Collate flag fr
7a20: 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20 20 70  om Y. */.      p
7a30: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c  Expr->pRight->fl
7a40: 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61  ags &= ~EP_Colla
7a50: 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  te;.    }else if
7a60: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  ( sqlite3ExprCol
7a70: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
7a80: 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b  pr->pLeft)!=0 ){
7a90: 0a 20 20 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  .      /* Neithe
7aa0: 72 20 58 20 6e 6f 72 20 59 20 68 61 76 65 20 43  r X nor Y have C
7ab0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
7ac0: 2c 20 62 75 74 20 58 20 68 61 73 20 61 20 6e 6f  , but X has a no
7ad0: 6e 2d 64 65 66 61 75 6c 74 0a 20 20 20 20 20 20  n-default.      
7ae0: 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ** collating seq
7af0: 75 65 6e 63 65 2e 20 20 53 6f 20 61 64 64 20 74  uence.  So add t
7b00: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 6d 61  he EP_Collate ma
7b10: 72 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63 61 75  rker on X to cau
7b20: 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 74  se.      ** it t
7b30: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 66 69  o be searched fi
7b40: 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45  rst. */.      pE
7b50: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
7b60: 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b  s |= EP_Collate;
7b70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53 57 41  .    }.  }.  SWA
7b80: 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70  P(Expr*,pExpr->p
7b90: 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65  Right,pExpr->pLe
7ba0: 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ft);.  if( pExpr
7bb0: 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op>=TK_GT ){. 
7bc0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
7bd0: 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20  ==TK_GT+2 );.   
7be0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
7bf0: 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61  TK_LE+2 );.    a
7c00: 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f  ssert( TK_GT>TK_
7c10: 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
7c20: 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b  ( TK_GT<TK_LE );
7c30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
7c40: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26  pr->op>=TK_GT &&
7c50: 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47   pExpr->op<=TK_G
7c60: 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  E );.    pExpr->
7c70: 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
7c80: 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54  -TK_GT)^2)+TK_GT
7c90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
7ca0: 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b  ranslate from TK
7cb0: 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  _xx operator to 
7cc0: 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a  WO_xx bitmask..*
7cd0: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70 65  /.static u16 ope
7ce0: 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70  ratorMask(int op
7cf0: 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61 73  ){.  u16 c;.  as
7d00: 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28  sert( allowedOp(
7d10: 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d  op) );.  if( op=
7d20: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20  =TK_IN ){.    c 
7d30: 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65  = WO_IN;.  }else
7d40: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
7d50: 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  LL ){.    c = WO
7d60: 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  _ISNULL;.  }else
7d70: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 57  {.    assert( (W
7d80: 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29  O_EQ<<(op-TK_EQ)
7d90: 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20 20  ) < 0x7fff );.  
7da0: 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f 45    c = (u16)(WO_E
7db0: 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a  Q<<(op-TK_EQ));.
7dc0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 70    }.  assert( op
7dd0: 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63  !=TK_ISNULL || c
7de0: 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==WO_ISNULL );. 
7df0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
7e00: 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29  IN || c==WO_IN )
7e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
7e20: 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45  TK_EQ || c==WO_E
7e30: 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  Q );.  assert( o
7e40: 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57  p!=TK_LT || c==W
7e50: 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_LT );.  assert
7e60: 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63  ( op!=TK_LE || c
7e70: 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73  ==WO_LE );.  ass
7e80: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c  ert( op!=TK_GT |
7e90: 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20  | c==WO_GT );.  
7ea0: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47  assert( op!=TK_G
7eb0: 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b  E || c==WO_GE );
7ec0: 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a  .  return c;.}..
7ed0: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f  /*.** Advance to
7ee0: 20 74 68 65 20 6e 65 78 74 20 57 68 65 72 65 54   the next WhereT
7ef0: 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68 65 73  erm that matches
7f00: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
7f10: 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 65 73  e criteria.** es
7f20: 74 61 62 6c 69 73 68 65 64 20 77 68 65 6e 20 74  tablished when t
7f30: 68 65 20 70 53 63 61 6e 20 6f 62 6a 65 63 74 20  he pScan object 
7f40: 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  was initialized 
7f50: 62 79 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74  by whereScanInit
7f60: 28 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55  ()..** Return NU
7f70: 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  LL if there are 
7f80: 6e 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69 6e 67  no more matching
7f90: 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a   WhereTerms..*/.
7fa0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
7fb0: 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63  ScanNext(WhereSc
7fc0: 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e  an *pScan){.  in
7fd0: 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
7fe0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
7ff0: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
8000: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  he term */.  int
8010: 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
8020: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
8030: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
8040: 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20  e term.  -1 for 
8050: 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  IPK */.  Expr *p
8060: 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  X;            /*
8070: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62   An expression b
8080: 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20  eing tested */. 
8090: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
80a0: 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61  C;    /* Shortha
80b0: 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57  nd for pScan->pW
80c0: 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  C */.  WhereTerm
80d0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54   *pTerm;    /* T
80e0: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65  he term being te
80f0: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20  sted */.  int k 
8100: 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f  = pScan->k;    /
8110: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74  * Where to start
8120: 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20   scanning */..  
8130: 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45  while( pScan->iE
8140: 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71  quiv<=pScan->nEq
8150: 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20  uiv ){.    iCur 
8160: 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  = pScan->aEquiv[
8170: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32 5d  pScan->iEquiv-2]
8180: 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20  ;.    iColumn = 
8190: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53  pScan->aEquiv[pS
81a0: 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a  can->iEquiv-1];.
81b0: 20 20 20 20 77 68 69 6c 65 28 20 28 70 57 43 20      while( (pWC 
81c0: 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d 30  = pScan->pWC)!=0
81d0: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 54   ){.      for(pT
81e0: 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c  erm=pWC->a+k; k<
81f0: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c  pWC->nTerm; k++,
8200: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
8210: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
8220: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 26  ftCursor==iCur &
8230: 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  & pTerm->u.leftC
8240: 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
8250: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
8260: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
8270: 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30  r & WO_EQUIV)!=0
8280: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
8290: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72  Scan->nEquiv<Arr
82a0: 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 45  aySize(pScan->aE
82b0: 71 75 69 76 29 0a 20 20 20 20 20 20 20 20 20 20  quiv).          
82c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
82d0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
82e0: 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78    pX = sqlite3Ex
82f0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54  prSkipCollate(pT
8300: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
8310: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
8320: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
8330: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
8340: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
8350: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
8360: 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20 20  iv; j+=2){.     
8370: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
8380: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d 70  an->aEquiv[j]==p
8390: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
83a0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
83b0: 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d  n->aEquiv[j+1]==
83c0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
83f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8400: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8410: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
8420: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
8430: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
8440: 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69  Equiv[j] = pX->i
8450: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
8460: 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75       pScan->aEqu
8470: 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43  iv[j+1] = pX->iC
8480: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
8490: 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75       pScan->nEqu
84a0: 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  iv += 2;.       
84b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
84c0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
84d0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
84e0: 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61  or & pScan->opMa
84f0: 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
8500: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
8510: 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e 64  the affinity and
8520: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
8530: 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  nce match */.   
8540: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
8550: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26  an->zCollName &&
8560: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
8570: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d  or & WO_ISNULL)=
8580: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8590: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
85a0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
85b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
85c0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
85d0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
85e0: 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d       pX = pTerm-
85f0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
8600: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
8610: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
8620: 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78  k(pX, pScan->idx
8630: 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  aff) ){.        
8640: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
8650: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8660: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
8670: 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74  assert(pX->pLeft
8680: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
8690: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
86a0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
86b0: 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20 20  lSeq(pParse,.   
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
86f0: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
8700: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
8710: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
8720: 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  0 ) pColl = pPar
8730: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
8740: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
8750: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
8760: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
8770: 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  , pScan->zCollNa
8780: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  me) ){.         
8790: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
87a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
87b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
87c0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
87d0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
87e0: 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20   & WO_EQ)!=0.   
87f0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
8800: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
8810: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
8820: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
8830: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
8840: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  le==pScan->aEqui
8850: 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[0].           
8860: 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e    && pX->iColumn
8870: 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ==pScan->aEquiv[
8880: 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  1].            )
8890: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
88a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
88b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
88c0: 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b      pScan->k = k
88d0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1;.            
88e0: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
88f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8900: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8910: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
8920: 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65  Scan->pWC->pOute
8930: 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  r;.      k = 0;.
8940: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
8950: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f  >pWC = pScan->pO
8960: 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30  rigWC;.    k = 0
8970: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71  ;.    pScan->iEq
8980: 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  uiv += 2;.  }.  
8990: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
89a0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
89b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61  WHERE clause sca
89c0: 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65  nner object.  Re
89d0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
89e0: 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  o the.** first m
89f0: 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55  atch.  Return NU
8a00: 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  LL if there are 
8a10: 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a  no matches..**.*
8a20: 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69  * The scanner wi
8a30: 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20  ll be searching 
8a40: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
8a50: 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c   pWC.  It will l
8a60: 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73  ook.** for terms
8a70: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
8a80: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
8a90: 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69  re X is column i
8aa0: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a  Column of table.
8ab0: 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f  ** iCur.  The <o
8ac0: 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p> must be one o
8ad0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
8ae0: 64 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d  described by opM
8af0: 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ask..**.** If th
8b00: 65 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20  e search is for 
8b10: 58 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20  X and the WHERE 
8b20: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
8b30: 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
8b40: 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68  form X=Y then th
8b50: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
8b60: 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72   also return ter
8b70: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ms of the form.*
8b80: 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  * "Y <op> <expr>
8b90: 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  ".  The number o
8ba0: 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e  f levels of tran
8bb0: 73 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69  sitivity is limi
8bc0: 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65  ted,.** but is e
8bd0: 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20  nough to handle 
8be0: 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63  most commonly oc
8bf0: 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74  curring SQL stat
8c00: 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ements..**.** If
8c10: 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e   X is not the IN
8c20: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8c30: 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65  Y then X must be
8c40: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
8c50: 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  .** index pIdx..
8c60: 2a 2f 0a 57 68 65 72 65 54 65 72 6d 20 2a 77 68  */.WhereTerm *wh
8c70: 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57  ereScanInit(.  W
8c80: 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c  hereScan *pScan,
8c90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
8ca0: 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62  ereScan object b
8cb0: 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64  eing initialized
8cc0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
8cd0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a  e *pWC,       /*
8ce0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
8cf0: 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  e to be scanned 
8d00: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
8d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8d20: 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66  Cursor to scan f
8d30: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  or */.  int iCol
8d40: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
8d50: 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61  /* Column to sca
8d60: 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f  n for */.  u32 o
8d70: 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20  pMask,          
8d80: 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73     /* Operator(s
8d90: 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  ) to scan for */
8da0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
8db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
8dc0: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
8dd0: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
8de0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a   */.){.  int j;.
8df0: 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63  .  /* memset(pSc
8e00: 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  an, 0, sizeof(*p
8e10: 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63  Scan)); */.  pSc
8e20: 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57  an->pOrigWC = pW
8e30: 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20  C;.  pScan->pWC 
8e40: 3d 20 70 57 43 3b 0a 20 20 69 66 28 20 70 49 64  = pWC;.  if( pId
8e50: 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20  x && iColumn>=0 
8e60: 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64  ){.    pScan->id
8e70: 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61  xaff = pIdx->pTa
8e80: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
8e90: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
8ea0: 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e   for(j=0; pIdx->
8eb0: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f  aiColumn[j]!=iCo
8ec0: 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
8ed0: 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70    if( NEVER(j>=p
8ee0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20  Idx->nColumn) ) 
8ef0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
8f00: 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c      pScan->zColl
8f10: 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Name = pIdx->azC
8f20: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b  oll[j];.  }else{
8f30: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  .    pScan->idxa
8f40: 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61  ff = 0;.    pSca
8f50: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30  n->zCollName = 0
8f60: 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f  ;.  }.  pScan->o
8f70: 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a  pMask = opMask;.
8f80: 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a    pScan->k = 0;.
8f90: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
8fa0: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
8fb0: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20 3d 20  an->aEquiv[1] = 
8fc0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e  iColumn;.  pScan
8fd0: 2d 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a 20 20  ->nEquiv = 2;.  
8fe0: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20  pScan->iEquiv = 
8ff0: 32 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72  2;.  return wher
9000: 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29  eScanNext(pScan)
9010: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
9020: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
9030: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
9040: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
9050: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
9060: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
9070: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
9080: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
9090: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
90a0: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
90b0: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
90c0: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
90d0: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
90e0: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
90f0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
9100: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
9110: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
9120: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  d..**.** The ter
9130: 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  m returned might
9140: 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20   by Y=<expr> if 
9150: 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72  there is another
9160: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a   constraint in.*
9170: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
9180: 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  se that specifie
9190: 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79  s that X=Y.  Any
91a0: 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74   such constraint
91b0: 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65  s will be.** ide
91c0: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57  ntified by the W
91d0: 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74  O_EQUIV bit in t
91e0: 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  he pTerm->eOpera
91f0: 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a  tor field.  The.
9200: 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72 61  ** aEquiv[] arra
9210: 79 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61 6c  y holds X and al
9220: 6c 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74  l its equivalent
9230: 73 2c 20 77 69 74 68 20 65 61 63 68 20 53 51 4c  s, with each SQL
9240: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61 6b   variable.** tak
9250: 69 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74 73  ing up two slots
9260: 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20 54   in aEquiv[].  T
9270: 68 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69 73  he first slot is
9280: 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20   for the cursor 
9290: 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74 68  number.** and th
92a0: 65 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72 20  e second is for 
92b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
92c0: 72 2e 20 20 54 68 65 72 65 20 61 72 65 20 32 32  r.  There are 22
92d0: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
92e0: 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d 65  [].** so that me
92f0: 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20  ans we can look 
9300: 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f  for X plus up to
9310: 20 31 30 20 6f 74 68 65 72 20 65 71 75 69 76 61   10 other equiva
9320: 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a 20  lent values..** 
9330: 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66  Hence a search f
9340: 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e  or X will return
9350: 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 20   <expr> if X=A1 
9360: 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32  and A1=A2 and A2
9370: 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20 61  =A3.** and ... a
9380: 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31  nd A9=A10 and A1
9390: 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20  0=<expr>..**.** 
93a0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  If there are mul
93b0: 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
93c0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
93d0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
93e0: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74  op> <expr>".** t
93f0: 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20  hen try for the 
9400: 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65  one with no depe
9410: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70  ndencies on <exp
9420: 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f  r> - in other wo
9430: 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78  rds where.** <ex
9440: 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  pr> is a constan
9450: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  t expression of 
9460: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79  some kind.  Only
9470: 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20   return entries 
9480: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
9490: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
94a0: 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  Y is a column in
94b0: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
94c0: 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a  f no terms of.**
94d0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
94e0: 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20  > <const-expr>" 
94f0: 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74  exist.   If no t
9500: 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73  erms with a cons
9510: 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73  tant RHS.** exis
9520: 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e  t, try to return
9530: 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65   a term that doe
9540: 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55  s not use WO_EQU
9550: 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  IV..*/.static Wh
9560: 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72  ereTerm *findTer
9570: 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m(.  WhereClause
9580: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
9590: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
95a0: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
95b0: 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
95c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
95d0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  or number of LHS
95e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
95f0: 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  n,          /* C
9600: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
9610: 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  LHS */.  Bitmask
9620: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
9630: 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f  * RHS must not o
9640: 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73  verlap with this
9650: 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f   mask */.  u32 o
9660: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
9670: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78   /* Mask of WO_x
9680: 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62  x values describ
9690: 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ing operator */.
96a0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
96b0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
96c0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
96d0: 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69  th this index, i
96e0: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
96f0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52  .  WhereTerm *pR
9700: 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57 68 65  esult = 0;.  Whe
9710: 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57 68 65  reTerm *p;.  Whe
9720: 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a 20 20  reScan scan;..  
9730: 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  p = whereScanIni
9740: 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20 69 43  t(&scan, pWC, iC
9750: 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c  ur, iColumn, op,
9760: 20 70 49 64 78 29 3b 0a 20 20 77 68 69 6c 65 28   pIdx);.  while(
9770: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70   p ){.    if( (p
9780: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
9790: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a  notReady)==0 ){.
97a0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65        if( p->pre
97b0: 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28  reqRight==0 && (
97c0: 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f  p->eOperator&WO_
97d0: 45 51 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  EQ)!=0 ){.      
97e0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20    return p;.    
97f0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52    }.      if( pR
9800: 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73 75  esult==0 ) pResu
9810: 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  lt = p;.    }.  
9820: 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 4e    p = whereScanN
9830: 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d 0a  ext(&scan);.  }.
9840: 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c 74    return pResult
9850: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
9860: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
9870: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
9880: 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 57  lyze(SrcList*, W
9890: 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74  hereClause*, int
98a0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65  );../*.** Call e
98b0: 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c  xprAnalyze on al
98c0: 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45  l terms in a WHE
98d0: 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2f 0a  RE clause.  .*/.
98e0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
98f0: 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72  AnalyzeAll(.  Sr
9900: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
9910: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
9920: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
9930: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
9940: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
9950: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
9960: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
9970: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
9980: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20  i=pWC->nTerm-1; 
9990: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
99a0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62  exprAnalyze(pTab
99b0: 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20  List, pWC, i);. 
99c0: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
99d0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
99e0: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
99f0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
9a00: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
9a10: 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45  ession is a LIKE
9a20: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
9a30: 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  r that.** can be
9a40: 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
9a50: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
9a60: 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e  traints.  Return
9a70: 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a   TRUE if it is.*
9a80: 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69  * so and false i
9a90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  f not..**.** In 
9aa0: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70  order for the op
9ab0: 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74  erator to be opt
9ac0: 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48  imizible, the RH
9ad0: 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69  S must be a stri
9ae0: 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68  ng.** literal th
9af0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  at does not begi
9b00: 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72  n with a wildcar
9b10: 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  d.  .*/.static i
9b20: 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  nt isLikeOrGlob(
9b30: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9b40: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
9b50: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
9b60: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9b70: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
9b80: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
9b90: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
9ba0: 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c  Expr **ppPrefix,
9bb0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9bc0: 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73  TK_STRING expres
9bd0: 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72  sion with patter
9be0: 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e  n prefix */.  in
9bf0: 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20  t *pisComplete, 
9c00: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f  /* True if the o
9c10: 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20  nly wildcard is 
9c20: 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68  % in the last ch
9c30: 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74  aracter */.  int
9c40: 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f   *pnoCase      /
9c50: 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63  * True if upperc
9c60: 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ase is equivalen
9c70: 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a  t to lowercase *
9c80: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
9c90: 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20  r *z = 0;       
9ca0: 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52    /* String on R
9cb0: 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61  HS of LIKE opera
9cc0: 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  tor */.  Expr *p
9cd0: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20  Right, *pLeft;  
9ce0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64      /* Right and
9cf0: 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49   left size of LI
9d00: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
9d10: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9d20: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
9d30: 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20  ist of operands 
9d40: 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  to the LIKE oper
9d50: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b  ator */.  int c;
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d70: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72       /* One char
9d80: 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a  acter in z[] */.
9d90: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9db0: 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69  Number of non-wi
9dc0: 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68  ldcard prefix ch
9dd0: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68  aracters */.  ch
9de0: 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20  ar wc[3];       
9df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64           /* Wild
9e00: 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20  card characters 
9e10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
9e20: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
9e30: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
9e40: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ection */.  sqli
9e50: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
9e60: 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20  = 0;.  int op;  
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e80: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70    /* Opcode of p
9e90: 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20  Right */..  if( 
9ea0: 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75  !sqlite3IsLikeFu
9eb0: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72  nction(db, pExpr
9ec0: 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29  , pnoCase, wc) )
9ed0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
9ee0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
9ef0: 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a  E_EBCDIC.  if( *
9f00: 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e  pnoCase ) return
9f10: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69   0;.#endif.  pLi
9f20: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
9f30: 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70  ist;.  pLeft = p
9f40: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
9f50: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  ;.  if( pLeft->o
9f60: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20  p!=TK_COLUMN .  
9f70: 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41   || sqlite3ExprA
9f80: 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d  ffinity(pLeft)!=
9f90: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
9fa0: 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  .   || IsVirtual
9fb0: 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20 20  (pLeft->pTab).  
9fc0: 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ){.    /* IMP: R
9fd0: 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54 68 65  -02065-49465 The
9fe0: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
9ff0: 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47  of the LIKE or G
a000: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73  LOB operator mus
a010: 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
a020: 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78  name of an index
a030: 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54  ed column with T
a040: 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f  EXT affinity. */
a050: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a060: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65   }.  assert( pLe
a070: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31  ft->iColumn!=(-1
a080: 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  ) ); /* Because 
a090: 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46  IPK never has AF
a0a0: 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69  F_TEXT */..  pRi
a0b0: 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  ght = pList->a[0
a0c0: 5d 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20  ].pExpr;.  op = 
a0d0: 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66  pRight->op;.  if
a0e0: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
a0f0: 52 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52  R ){.    op = pR
a100: 69 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20  ight->op2;.  }. 
a110: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49   if( op==TK_VARI
a120: 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65  ABLE ){.    Vdbe
a130: 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20 70   *pReprepare = p
a140: 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72  Parse->pReprepar
a150: 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  e;.    int iCol 
a160: 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d  = pRight->iColum
a170: 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71  n;.    pVal = sq
a180: 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75  lite3VdbeGetValu
a190: 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69 43  e(pReprepare, iC
a1a0: 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ol, SQLITE_AFF_N
a1b0: 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56  ONE);.    if( pV
a1c0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61  al && sqlite3_va
a1d0: 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d  lue_type(pVal)==
a1e0: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
a1f0: 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a       z = (char *
a200: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
a210: 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d  ext(pVal);.    }
a220: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a230: 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73  SetVarmask(pPars
a240: 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b  e->pVdbe, iCol);
a250: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69  .    assert( pRi
a260: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  ght->op==TK_VARI
a270: 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e  ABLE || pRight->
a280: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
a290: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  );.  }else if( o
a2a0: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p==TK_STRING ){.
a2b0: 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e      z = pRight->
a2c0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20  u.zToken;.  }.  
a2d0: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74  if( z ){.    cnt
a2e0: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
a2f0: 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26   (c=z[cnt])!=0 &
a300: 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21  & c!=wc[0] && c!
a310: 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b  =wc[1] && c!=wc[
a320: 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  2] ){.      cnt+
a330: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
a340: 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d   cnt!=0 && 255!=
a350: 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a  (u8)z[cnt-1] ){.
a360: 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72 65        Expr *pPre
a370: 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43  fix;.      *pisC
a380: 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b  omplete = c==wc[
a390: 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d  0] && z[cnt+1]==
a3a0: 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69 78  0;.      pPrefix
a3b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
a3c0: 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29  b, TK_STRING, z)
a3d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
a3e0: 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75  fix ) pPrefix->u
a3f0: 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30  .zToken[cnt] = 0
a400: 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66 69  ;.      *ppPrefi
a410: 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20  x = pPrefix;.   
a420: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41     if( op==TK_VA
a430: 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20  RIABLE ){.      
a440: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a450: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20  se->pVdbe;.     
a460: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
a470: 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67  tVarmask(v, pRig
a480: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ht->iColumn);.  
a490: 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f        if( *pisCo
a4a0: 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68 74  mplete && pRight
a4b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b  ->u.zToken[1] ){
a4c0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
a4d0: 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65 20   the rhs of the 
a4e0: 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20  LIKE expression 
a4f0: 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61  is a variable, a
a500: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  nd the current. 
a510: 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
a520: 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c  e of the variabl
a530: 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73  e means there is
a540: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f   no need to invo
a550: 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20  ke the LIKE.    
a560: 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
a570: 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61  n, then no OP_Va
a580: 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61  riable will be a
a590: 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67  dded to the prog
a5a0: 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ram..          *
a5b0: 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70 72  * This causes pr
a5c0: 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73  oblems for the s
a5d0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
a5e0: 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20  meter_name().   
a5f0: 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54         ** API. T
a600: 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65  o workaround the
a610: 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f  m, add a dummy O
a620: 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e  P_Variable here.
a630: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20  .          */ . 
a640: 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
a650: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
a660: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
a670: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
a680: 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
a690: 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29  rse, pRight, r1)
a6a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
a6b0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
a6c0: 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
a6d0: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20  rrentAddr(v)-1, 
a6e0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
a6f0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a700: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
a710: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a720: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
a730: 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d      z = 0;.    }
a740: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
a750: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
a760: 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b    return (z!=0);
a770: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
a780: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
a790: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a  TIMIZATION */...
a7a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a7b0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
a7c0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
a7d0: 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  see if the given
a7e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
a7f0: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
a800: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
a810: 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a  MATCH expr.**.**
a820: 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 72   If it is then r
a830: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20  eturn TRUE.  If 
a840: 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  not, return FALS
a850: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
a860: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
a870: 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  (.  Expr *pExpr 
a880: 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69       /* Test thi
a890: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
a8a0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
a8b0: 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78  List;..  if( pEx
a8c0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54  pr->op!=TK_FUNCT
a8d0: 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ION ){.    retur
a8e0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
a8f0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
a900: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d  xpr->u.zToken,"m
a910: 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20  atch")!=0 ){.   
a920: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a930: 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
a940: 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  x.pList;.  if( p
a950: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29  List->nExpr!=2 )
a960: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a970: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
a980: 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[1].pExpr->op 
a990: 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  != TK_COLUMN ){.
a9a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a9b0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
a9c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
a9d0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
a9e0: 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  LE */../*.** If 
a9f0: 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65 73  the pBase expres
aa00: 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20  sion originated 
aa10: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
aa20: 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20  NG clause of.** 
aa30: 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61  a join, then tra
aa40: 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f 70  nsfer the approp
aa50: 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f  riate markings o
aa60: 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a  ver to derived..
aa70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
aa80: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
aa90: 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69 76  ngs(Expr *pDeriv
aaa0: 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29  ed, Expr *pBase)
aab0: 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c  {.  pDerived->fl
aac0: 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c  ags |= pBase->fl
aad0: 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69  ags & EP_FromJoi
aae0: 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69  n;.  pDerived->i
aaf0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
ab00: 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f   pBase->iRightJo
ab10: 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20  inTable;.}..#if 
ab20: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
ab30: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
ab40: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
ab50: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
ab60: 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e  BQUERY)./*.** An
ab70: 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61  alyze a term tha
ab80: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77  t consists of tw
ab90: 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e  o or more OR-con
aba0: 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72  nected.** subter
abb0: 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a  ms.  So in:.**.*
abc0: 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20  *     ... WHERE 
abd0: 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20   (a=5) AND (b=7 
abe0: 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20  OR c=9 OR d=13) 
abf0: 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20  AND (d=13).**   
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac10: 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e         ^^^^^^^^^
ac20: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a  ^^^^^^^^^^^.**.*
ac30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
ac40: 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75  nalyzes terms su
ac50: 63 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65  ch as the middle
ac60: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f   term in the abo
ac70: 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41  ve example..** A
ac80: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
ac90: 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ect is computed 
aca0: 61 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f 20  and attached to 
acb0: 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a  the term under.*
acc0: 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61  * analysis, rega
acd0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75  rdless of the ou
ace0: 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61  tcome of the ana
acf0: 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a  lysis.  Hence:.*
ad00: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  *.**     WhereTe
ad10: 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20  rm.wtFlags   |= 
ad20: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20   TERM_ORINFO.** 
ad30: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
ad40: 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79  pOrInfo  =  a dy
ad50: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
ad60: 74 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20  ted WhereOrTerm 
ad70: 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65  object.**.** The
ad80: 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c   term being anal
ad90: 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20 74  yzed must have t
ada0: 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52  wo or more of OR
adb0: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65  -connected subte
adc0: 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  rms..** A single
add0: 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62   subterm might b
ade0: 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63  e a set of AND-c
adf0: 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62  onnected sub-sub
ae00: 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c  terms..** Exampl
ae10: 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65  es of terms unde
ae20: 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a  r analysis:.**.*
ae30: 2a 20 20 20 20 20 28 41 29 20 20 20 20 20 74 31  *     (A)     t1
ae40: 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d  .x=t2.y OR t1.x=
ae50: 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20  t2.z OR t1.y=15 
ae60: 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a  OR t1.z=t3.a+5.*
ae70: 2a 20 20 20 20 20 28 42 29 20 20 20 20 20 78 3d  *     (B)     x=
ae80: 65 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78  expr1 OR expr2=x
ae90: 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20   OR x=expr3.**  
aea0: 20 20 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d     (C)     t1.x=
aeb0: 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32  t2.y OR (t1.x=t2
aec0: 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a  .z AND t1.y=15).
aed0: 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20 20 78  **     (D)     x
aee0: 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20  =expr1 OR (y>11 
aef0: 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c  AND y<22 AND z L
af00: 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a  IKE '*hello*').*
af10: 2a 20 20 20 20 20 28 45 29 20 20 20 20 20 28 70  *     (E)     (p
af20: 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41  .a=1 AND q.b=2 A
af30: 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e  ND r.c=3) OR (p.
af40: 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e  x=4 AND q.y=5 AN
af50: 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43  D r.z=6).**.** C
af60: 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  ASE 1:.**.** If 
af70: 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65  all subterms are
af80: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43   of the form T.C
af90: 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73  =expr for some s
afa0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
afb0: 43 20 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c  C and.** a singl
afc0: 65 20 74 61 62 6c 65 20 54 20 28 61 73 20 73 68  e table T (as sh
afd0: 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42  own in example B
afe0: 20 61 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65   above) then cre
aff0: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
b000: 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69  l.** term that i
b010: 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  s an equivalent 
b020: 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  IN expression.  
b030: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
b040: 69 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62  if the term.** b
b050: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73  eing analyzed is
b060: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d  :.**.**      x =
b070: 20 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72   expr1  OR  expr
b080: 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65  2 = x  OR  x = e
b090: 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  xpr3.**.** then 
b0a0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
b0b0: 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74  tual term like t
b0c0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
b0d0: 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72  x IN (expr1,expr
b0e0: 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43  2,expr3).**.** C
b0f0: 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  ASE 2:.**.** If 
b100: 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65  all subterms are
b110: 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20   indexable by a 
b120: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20  single table T, 
b130: 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20  then set.**.**  
b140: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70     WhereTerm.eOp
b150: 65 72 61 74 6f 72 20 20 20 20 20 20 20 20 20 20  erator          
b160: 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20      =  WO_OR.** 
b170: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
b180: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
b190: 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73  le  |=  the curs
b1a0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
b1b0: 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75  ble T.**.** A su
b1c0: 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61  bterm is "indexa
b1d0: 62 6c 65 22 20 69 66 20 69 74 20 69 73 20 6f 66  ble" if it is of
b1e0: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e   the form.** "T.
b1f0: 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  C <op> <expr>" w
b200: 68 65 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f  here C is any co
b210: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20  lumn of table T 
b220: 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20  and .** <op> is 
b230: 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c  one of "=", "<",
b240: 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22   "<=", ">", ">="
b250: 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20  , "IS NULL", or 
b260: 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65  "IN"..** A subte
b270: 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78  rm is also index
b280: 61 62 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e  able if it is an
b290: 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d   AND of two or m
b2a0: 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72  ore.** subsubter
b2b0: 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ms at least one 
b2c0: 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e 64 65  of which is inde
b2d0: 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c  xable.  Indexabl
b2e0: 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72  e AND .** subter
b2f0: 6d 73 20 68 61 76 65 20 74 68 65 69 72 20 65 4f  ms have their eO
b300: 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57  perator set to W
b310: 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68  O_AND and they h
b320: 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66  ave.** u.pAndInf
b330: 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d  o set to a dynam
b340: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
b350: 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62   WhereAndTerm ob
b360: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d  ject..**.** From
b370: 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f   another point o
b380: 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62  f view, "indexab
b390: 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74  le" means that t
b3a0: 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64  he subterm could
b3b0: 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  .** potentially 
b3c0: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
b3d0: 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70 70 72  index if an appr
b3e0: 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20 65 78  opriate index ex
b3f0: 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e  ists..** This an
b400: 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20  alysis does not 
b410: 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68 65 72  consider whether
b420: 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65   or not the inde
b430: 78 20 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a  x exists; that.*
b440: 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74  * is something t
b450: 68 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 72  he bestIndex() r
b460: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 65 74 65  outine will dete
b470: 72 6d 69 6e 65 2e 20 20 54 68 69 73 20 61 6e 61  rmine.  This ana
b480: 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f  lysis.** only lo
b490: 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72 20 73  oks at whether s
b4a0: 75 62 74 65 72 6d 73 20 61 70 70 72 6f 70 72 69  ubterms appropri
b4b0: 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  ate for indexing
b4c0: 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c   exist..**.** Al
b4d0: 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72  l examples A thr
b4e0: 6f 75 67 68 20 45 20 61 62 6f 76 65 20 61 6c 6c  ough E above all
b4f0: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e   satisfy case 2.
b500: 20 20 42 75 74 20 69 66 20 61 20 74 65 72 6d 0a    But if a term.
b510: 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69 73 66 69  ** also statisfi
b520: 65 73 20 63 61 73 65 20 31 20 28 73 75 63 68 20  es case 1 (such 
b530: 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74 68  as B) we know th
b540: 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72  at the optimizer
b550: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20   will.** always 
b560: 70 72 65 66 65 72 20 63 61 73 65 20 31 2c 20 73  prefer case 1, s
b570: 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 77  o in that case w
b580: 65 20 70 72 65 74 65 6e 64 20 74 68 61 74 20 63  e pretend that c
b590: 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20  ase 2 is not.** 
b5a0: 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  satisfied..**.**
b5b0: 20 49 74 20 6d 69 67 68 74 20 62 65 20 74 68 65   It might be the
b5c0: 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74 69   case that multi
b5d0: 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20 69  ple tables are i
b5e0: 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20 65  ndexable.  For e
b5f0: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61  xample,.** (E) a
b600: 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62 6c  bove is indexabl
b610: 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20 51  e on tables P, Q
b620: 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54  , and R..**.** T
b630: 65 72 6d 73 20 74 68 61 74 20 73 61 74 69 73 66  erms that satisf
b640: 79 20 63 61 73 65 20 32 20 61 72 65 20 63 61 6e  y case 2 are can
b650: 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b  didates for look
b660: 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73  up by using.** s
b670: 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 20  eparate indices 
b680: 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20 66  to find rowids f
b690: 6f 72 20 65 61 63 68 20 73 75 62 74 65 72 6d 20  or each subterm 
b6a0: 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a  and composing.**
b6b0: 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c   the union of al
b6c0: 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20 61  l rowids using a
b6d0: 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e 20   RowSet object. 
b6e0: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
b6f0: 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20 69  .** to "bitmap i
b700: 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65 72  ndices" in other
b710: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
b720: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49  s..**.** OTHERWI
b730: 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  SE:.**.** If nei
b740: 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72 20  ther case 1 nor 
b750: 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74 68  case 2 apply, th
b760: 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f 70  en leave the eOp
b770: 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a  erator set to.**
b780: 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65 72   zero.  This ter
b790: 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20  m is not useful 
b7a0: 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73  for search..*/.s
b7b0: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
b7c0: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20  nalyzeOrTerm(.  
b7d0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
b7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
b7f0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
b800: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
b810: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  WC,         /* t
b820: 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52  he complete WHER
b830: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
b840: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
b850: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
b860: 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d 20   of the OR-term 
b870: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
b880: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
b890: 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e   *pWInfo = pWC->
b8a0: 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 2f  pWInfo;        /
b8b0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  * WHERE clause p
b8c0: 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78  rocessing contex
b8d0: 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
b8e0: 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
b8f0: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 2f  Parse;         /
b900: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
b910: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
b920: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b940: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
b950: 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
b960: 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57  erm *pTerm = &pW
b970: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20  C->a[idxTerm];  
b980: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f    /* The term to
b990: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
b9a0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
b9b0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20  pTerm->pExpr;   
b9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b9d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74   expression of t
b9e0: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  he term */.  int
b9f0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba10: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
ba20: 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
ba30: 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20  Clause *pOrWc;  
ba40: 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70 20       /* Breakup 
ba50: 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73 75  of pTerm into su
ba60: 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72  bterms */.  Wher
ba70: 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20  eTerm *pOrTerm; 
ba80: 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d 74        /* A Sub-t
ba90: 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70  erm within the p
baa0: 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f  OrWc */.  WhereO
bab0: 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20  rInfo *pOrInfo; 
bac0: 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61      /* Additiona
bad0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73  l information as
bae0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
baf0: 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  erm */.  Bitmask
bb00: 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20   chngToIN;      
bb10: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
bb20: 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20  t might satisfy 
bb30: 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d  case 1 */.  Bitm
bb40: 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20  ask indexable;  
bb50: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
bb60: 74 68 61 74 20 61 72 65 20 69 6e 64 65 78 61 62  that are indexab
bb70: 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20 63  le, satisfying c
bb80: 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  ase 2 */..  /*. 
bb90: 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f 52   ** Break the OR
bba0: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74 73   clause into its
bbb0: 20 73 65 70 61 72 61 74 65 20 73 75 62 74 65 72   separate subter
bbc0: 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65 72 6d  ms.  The subterm
bbd0: 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65  s are.  ** store
bbe0: 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75  d in a WhereClau
bbf0: 73 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  se structure con
bc00: 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20 74  taining within t
bc10: 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20  he WhereOrInfo. 
bc20: 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20   ** object that 
bc30: 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  is attached to t
bc40: 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63  he original OR c
bc50: 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f  lause term..  */
bc60: 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72  .  assert( (pTer
bc70: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
bc80: 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f  RM_DYNAMIC|TERM_
bc90: 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49  ORINFO|TERM_ANDI
bca0: 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  NFO))==0 );.  as
bcb0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
bcc0: 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72  =TK_OR );.  pTer
bcd0: 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70  m->u.pOrInfo = p
bce0: 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  OrInfo = sqlite3
bcf0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
bd00: 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f   sizeof(*pOrInfo
bd10: 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e 66  ));.  if( pOrInf
bd20: 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  o==0 ) return;. 
bd30: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
bd40: 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a  |= TERM_ORINFO;.
bd50: 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e    pOrWc = &pOrIn
bd60: 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65 43  fo->wc;.  whereC
bd70: 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c  lauseInit(pOrWc,
bd80: 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65 72   pWInfo);.  wher
bd90: 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70 45  eSplit(pOrWc, pE
bda0: 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65  xpr, TK_OR);.  e
bdb0: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53  xprAnalyzeAll(pS
bdc0: 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66  rc, pOrWc);.  if
bdd0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
bde0: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  ed ) return;.  a
bdf0: 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54  ssert( pOrWc->nT
be00: 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a  erm>=2 );..  /*.
be10: 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    ** Compute the
be20: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
be30: 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66  hat might satisf
be40: 79 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e 0a  y cases 1 or 2..
be50: 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65    */.  indexable
be60: 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
be70: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42    chngToIN = ~(B
be80: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28  itmask)0;.  for(
be90: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
bea0: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
beb0: 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65  >a; i>=0 && inde
bec0: 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54  xable; i--, pOrT
bed0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
bee0: 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
bef0: 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29  tor & WO_SINGLE)
bf00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  ==0 ){.      Whe
bf10: 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49  reAndInfo *pAndI
bf20: 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nfo;.      asser
bf30: 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46  t( (pOrTerm->wtF
bf40: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44  lags & (TERM_AND
bf50: 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f  INFO|TERM_ORINFO
bf60: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  ))==0 );.      c
bf70: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
bf80: 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71     pAndInfo = sq
bf90: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
bfa0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e  (db, sizeof(*pAn
bfb0: 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69  dInfo));.      i
bfc0: 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20  f( pAndInfo ){. 
bfd0: 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
bfe0: 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20  se *pAndWC;.    
bff0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
c000: 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  AndTerm;.       
c010: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
c020: 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20  Bitmask b = 0;. 
c030: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
c040: 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e  u.pAndInfo = pAn
c050: 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70  dInfo;.        p
c060: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
c070: 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b  |= TERM_ANDINFO;
c080: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
c090: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
c0a0: 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41  _AND;.        pA
c0b0: 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f  ndWC = &pAndInfo
c0c0: 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68  ->wc;.        wh
c0d0: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41  ereClauseInit(pA
c0e0: 6e 64 57 43 2c 20 70 57 43 2d 3e 70 57 49 6e 66  ndWC, pWC->pWInf
c0f0: 6f 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  o);.        wher
c100: 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c 20 70  eSplit(pAndWC, p
c110: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54  OrTerm->pExpr, T
c120: 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20 20 20  K_AND);.        
c130: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
c140: 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20  Src, pAndWC);.  
c150: 20 20 20 20 20 20 70 41 6e 64 57 43 2d 3e 70 4f        pAndWC->pO
c160: 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20  uter = pWC;.    
c170: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62      testcase( db
c180: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c190: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64  ;.        if( !d
c1a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c1b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
c1c0: 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70  (j=0, pAndTerm=p
c1d0: 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64  AndWC->a; j<pAnd
c1e0: 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
c1f0: 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  pAndTerm++){.   
c200: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
c210: 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72   pAndTerm->pExpr
c220: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
c230: 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41  if( allowedOp(pA
c240: 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f  ndTerm->pExpr->o
c250: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  p) ){.          
c260: 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b      b |= getMask
c270: 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
c280: 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65  et, pAndTerm->le
c290: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
c2a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c2b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
c2c0: 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65         indexable
c2d0: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20   &= b;.      }. 
c2e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
c2f0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
c300: 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20  TERM_COPIED ){. 
c310: 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69       /* Skip thi
c320: 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20  s term for now. 
c330: 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20 77   We revisit it w
c340: 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74  hen we process t
c350: 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  he.      ** corr
c360: 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56  esponding TERM_V
c370: 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20  IRTUAL term */. 
c380: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c390: 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20  Bitmask b;.     
c3a0: 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57   b = getMask(&pW
c3b0: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
c3c0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
c3d0: 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sor);.      if( 
c3e0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
c3f0: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
c400: 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
c410: 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26  Term *pOther = &
c420: 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d  pOrWc->a[pOrTerm
c430: 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
c440: 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b      b |= getMask
c450: 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
c460: 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74  et, pOther->left
c470: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
c480: 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65  .      indexable
c490: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28   &= b;.      if(
c4a0: 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
c4b0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30  ator & WO_EQ)==0
c4c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67   ){.        chng
c4d0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
c4e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
c4f0: 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20  hngToIN &= b;.  
c500: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c510: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72  .  /*.  ** Recor
c520: 64 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  d the set of tab
c530: 6c 65 73 20 74 68 61 74 20 73 61 74 69 73 66 79  les that satisfy
c540: 20 63 61 73 65 20 32 2e 20 20 54 68 65 20 73 65   case 2.  The se
c550: 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20  t might be.  ** 
c560: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f  empty..  */.  pO
c570: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
c580: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20   = indexable;.  
c590: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
c5a0: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20   = indexable==0 
c5b0: 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20  ? 0 : WO_OR;..  
c5c0: 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e  /*.  ** chngToIN
c5d0: 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20   holds a set of 
c5e0: 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67  tables that *mig
c5f0: 68 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65  ht* satisfy case
c600: 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65   1.  But.  ** we
c610: 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
c620: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63   additional chec
c630: 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63  king to see if c
c640: 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a  ase 1 really.  *
c650: 2a 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a  * is satisfied..
c660: 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    **.  ** chngTo
c670: 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74  IN will hold eit
c680: 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62  her 0, 1, or 2 b
c690: 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20  its.  The 0-bit 
c6a0: 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  case means.  ** 
c6b0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
c6c0: 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20   possibility of 
c6d0: 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
c6e0: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
c6f0: 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61  an.  ** IN opera
c700: 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  tor because one 
c710: 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e  or more terms in
c720: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63   the OR clause c
c730: 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ontain.  ** some
c740: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
c750: 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   == on a column 
c760: 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61  in the single ta
c770: 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a  ble.  The 1-bit.
c780: 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20    ** case means 
c790: 74 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20  that every term 
c7a0: 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  of the OR clause
c7b0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
c7c0: 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75    ** "table.colu
c7d0: 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d  mn=expr" for som
c7e0: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
c7f0: 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61   The one bit tha
c800: 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69  t is set.  ** wi
c810: 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ll correspond to
c820: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c   the common tabl
c830: 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65  e.  We still nee
c840: 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61  d to check to ma
c850: 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65  ke.  ** sure the
c860: 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20   same column is 
c870: 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  used on all term
c880: 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61  s.  The 2-bit ca
c890: 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20  se is when.  ** 
c8a0: 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72  the all terms ar
c8b0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  e of the form "t
c8c0: 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62  able1.column=tab
c8d0: 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74  le2.column".  It
c8e0: 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70  .  ** might be p
c8f0: 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20  ossible to form 
c900: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  an IN operator w
c910: 69 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65  ith either table
c920: 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72  1.column.  ** or
c930: 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61   table2.column a
c940: 73 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74  s the LHS if eit
c950: 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  her is common to
c960: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20   every term of. 
c970: 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73   ** the OR claus
c980: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  e..  **.  ** Not
c990: 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20  e that terms of 
c9a0: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e  the form "table.
c9b0: 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f  column1=table.co
c9c0: 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a  lumn2" (the.  **
c9d0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62   same table on b
c9e0: 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65  oth sizes of the
c9f0: 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f   ==) cannot be o
ca00: 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  ptimized..  */. 
ca10: 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b   if( chngToIN ){
ca20: 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e  .    int okToChn
ca30: 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f  gToIN = 0;     /
ca40: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f  * True if the co
ca50: 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69  nversion to IN i
ca60: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69  s valid */.    i
ca70: 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  nt iColumn = -1;
ca80: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
ca90: 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20  mn index on lhs 
caa0: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
cab0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f  /.    int iCurso
cac0: 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  r = -1;         
cad0: 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20  /* Table cursor 
cae0: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65  common to all te
caf0: 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  rms */.    int j
cb00: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
cb10: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
cb20: 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  nter */..    /* 
cb30: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62  Search for a tab
cb40: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68  le and column th
cb50: 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e  at appears on on
cb60: 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20  e side or the.  
cb70: 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68    ** other of th
cb80: 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e  e == operator in
cb90: 20 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20   every subterm. 
cba0: 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   That table and 
cbb0: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69  column.    ** wi
cbc0: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69  ll be recorded i
cbd0: 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43  n iCursor and iC
cbe0: 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69  olumn.  There mi
cbf0: 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20  ght not be any. 
cc00: 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65     ** such table
cc10: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65   and column.  Se
cc20: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  t okToChngToIN i
cc30: 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  f an appropriate
cc40: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e   table.    ** an
cc50: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e  d column is foun
cc60: 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f  d but leave okTo
cc70: 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69  ChngToIN false i
cc80: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20  f not found..   
cc90: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
cca0: 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e   j<2 && !okToChn
ccb0: 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  gToIN; j++){.   
ccc0: 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72     pOrTerm = pOr
ccd0: 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  Wc->a;.      for
cce0: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
ccf0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  1; i>=0; i--, pO
cd00: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
cd10: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
cd20: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
cd30: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
cd40: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
cd50: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
cd60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
cd70: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
cd80: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
cd90: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
cda0: 73 20 74 68 65 20 32 2d 62 69 74 20 63 61 73 65  s the 2-bit case
cdb0: 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74   and we are on t
cdc0: 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74  he second iterat
cdd0: 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
cde0: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72    ** current ter
cdf0: 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69  m is from the fi
ce00: 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20  rst iteration.  
ce10: 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65 72  So skip this ter
ce20: 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  m. */.          
ce30: 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a  assert( j==1 );.
ce40: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
ce50: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
ce60: 20 20 20 20 20 20 69 66 28 20 28 63 68 6e 67 54        if( (chngT
ce70: 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 26 70  oIN & getMask(&p
ce80: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
ce90: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
cea0: 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20  rsor))==0 ){.   
ceb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74         /* This t
cec0: 65 72 6d 20 6d 75 73 74 20 62 65 20 6f 66 20 74  erm must be of t
ced0: 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32  he form t1.a==t2
cee0: 2e 62 20 77 68 65 72 65 20 74 32 20 69 73 20 69  .b where t2 is i
cef0: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
cf00: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65 74 20  ** chngToIN set 
cf10: 62 75 74 20 74 31 20 69 73 20 6e 6f 74 2e 20 20  but t1 is not.  
cf20: 54 68 69 73 20 74 65 72 6d 20 77 69 6c 6c 20 62  This term will b
cf30: 65 20 65 69 74 68 65 72 20 70 72 65 63 65 65 64  e either preceed
cf40: 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
cf50: 6f 72 20 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e  or follwed by an
cf60: 20 69 6e 76 65 72 74 65 64 20 63 6f 70 79 20 28   inverted copy (
cf70: 74 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b  t2.b==t1.a).  Sk
cf80: 69 70 20 74 68 69 73 20 74 65 72 6d 20 0a 20 20  ip this term .  
cf90: 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 75          ** and u
cfa0: 73 65 20 69 74 73 20 69 6e 76 65 72 73 69 6f 6e  se its inversion
cfb0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  . */.          t
cfc0: 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d  estcase( pOrTerm
cfd0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
cfe0: 5f 43 4f 50 49 45 44 20 29 3b 0a 20 20 20 20 20  _COPIED );.     
cff0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
d000: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
d010: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
d020: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
d030: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  rt( pOrTerm->wtF
d040: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 50  lags & (TERM_COP
d050: 49 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c  IED|TERM_VIRTUAL
d060: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ) );.          c
d070: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
d080: 20 7d 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75   }.        iColu
d090: 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e  mn = pOrTerm->u.
d0a0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
d0b0: 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f      iCursor = pO
d0c0: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
d0d0: 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  r;.        break
d0e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d0f0: 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20  if( i<0 ){.     
d100: 20 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61     /* No candida
d110: 74 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20  te table+column 
d120: 77 61 73 20 66 6f 75 6e 64 2e 20 20 54 68 69 73  was found.  This
d130: 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a   can only occur.
d140: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68          ** on th
d150: 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69  e second iterati
d160: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  on */.        as
d170: 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20  sert( j==1 );.  
d180: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
d190: 50 6f 77 65 72 4f 66 54 77 6f 28 63 68 6e 67 54  PowerOfTwo(chngT
d1a0: 6f 49 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20  oIN) );.        
d1b0: 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e  assert( chngToIN
d1c0: 3d 3d 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  ==getMask(&pWInf
d1d0: 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75  o->sMaskSet, iCu
d1e0: 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20  rsor) );.       
d1f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d200: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
d210: 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f  j==1 );..      /
d220: 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20  * We have found 
d230: 61 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c  a candidate tabl
d240: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43  e and column.  C
d250: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
d260: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  hat.      ** tab
d270: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  le and column is
d280: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79   common to every
d290: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20   term in the OR 
d2a0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
d2b0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31  okToChngToIN = 1
d2c0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e  ;.      for(; i>
d2d0: 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f  =0 && okToChngTo
d2e0: 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  IN; i--, pOrTerm
d2f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
d300: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
d310: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
d320: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
d330: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
d340: 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or!=iCursor ){. 
d350: 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d           pOrTerm
d360: 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45  ->wtFlags &= ~TE
d370: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
d380: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
d390: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
d3a0: 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n!=iColumn ){.  
d3b0: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
d3c0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
d3d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d3e0: 20 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20     int affLeft, 
d3f0: 61 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20  affRight;.      
d400: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69      /* If the ri
d410: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
d420: 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20   also a column, 
d430: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
d440: 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ies.          **
d450: 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61   of both right a
d460: 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75  nd left sides mu
d470: 73 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20  st be such that 
d480: 6e 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20  no type.        
d490: 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
d4a0: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
d4b0: 20 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69   the right.  (Ti
d4c0: 63 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20  cket #2249).    
d4d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
d4e0: 20 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71     affRight = sq
d4f0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
d500: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
d510: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
d520: 20 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73       affLeft = s
d530: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
d540: 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  ty(pOrTerm->pExp
d550: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
d560: 20 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68       if( affRigh
d570: 74 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74  t!=0 && affRight
d580: 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20  !=affLeft ){.   
d590: 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e           okToChn
d5a0: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
d5b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d5c0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
d5d0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
d5e0: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
d5f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
d600: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
d610: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
d620: 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  t, okToChngToIN 
d630: 69 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69  is true if origi
d640: 6e 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66  nal pTerm satisf
d650: 69 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  ies.    ** case 
d660: 31 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  1.  In that case
d670: 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  , construct a ne
d680: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74  w virtual term t
d690: 68 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70  hat is .    ** p
d6a0: 54 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69  Term converted i
d6b0: 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  nto an IN operat
d6c0: 6f 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  or..    **.    *
d6d0: 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d 31 35  * EV: R-00211-15
d6e0: 31 30 30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  100.    */.    i
d6f0: 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  f( okToChngToIN 
d700: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
d710: 44 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Dup;            
d720: 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64  /* A transient d
d730: 75 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73  uplicate express
d740: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
d750: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30  rList *pList = 0
d760: 3b 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f  ;   /* The RHS o
d770: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
d780: 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
d790: 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20  *pLeft = 0;     
d7a0: 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20    /* The LHS of 
d7b0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
d7c0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
d7d0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
d7e0: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
d7f0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a  IN operator */..
d800: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57        for(i=pOrW
d810: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
d820: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
d830: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
d840: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
d850: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
d860: 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29  gs & TERM_OR_OK)
d870: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
d880: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d890: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
d8a0: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
d8b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
d8c0: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
d8d0: 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20  r==iCursor );.  
d8e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
d8f0: 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  rTerm->u.leftCol
d900: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a  umn==iColumn );.
d910: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
d920: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
d930: 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  , pOrTerm->pExpr
d940: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
d950: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71        pList = sq
d960: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
d970: 65 6e 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  end(pWInfo->pPar
d980: 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29  se, pList, pDup)
d990: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20  ;.        pLeft 
d9a0: 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  = pOrTerm->pExpr
d9b0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d  ->pLeft;.      }
d9c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d9d0: 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
d9e0: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
d9f0: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
da00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
da10: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
da20: 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70  pParse, TK_IN, p
da30: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
da40: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
da50: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
da60: 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73 66  ;.        transf
da70: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
da80: 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
da90: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
daa0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
dab0: 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  ew, EP_xIsSelect
dac0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
dad0: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
dae0: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e  st;.        idxN
daf0: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
db00: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
db10: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
db20: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
db30: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
db40: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
db50: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
db60: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
db70: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ew);.        pTe
db80: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
db90: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
dba0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50  WC->a[idxNew].iP
dbb0: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
dbc0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
dbd0: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
dbe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dbf0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
dc00: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
dc10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
dc20: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
dc30: 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a  r = WO_NOOP;  /*
dc40: 20 63 61 73 65 20 31 20 74 72 75 6d 70 73 20 63   case 1 trumps c
dc50: 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d 0a 20  ase 2 */.    }. 
dc60: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
dc70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
dc80: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21  PTIMIZATION && !
dc90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
dca0: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  UERY */../*.** T
dcb0: 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73  he input to this
dcc0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57   routine is an W
dcd0: 68 65 72 65 54 65 72 6d 20 73 74 72 75 63 74 75  hereTerm structu
dce0: 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65  re with only the
dcf0: 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69 65 6c  .** "pExpr" fiel
dd00: 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68  d filled in.  Th
dd10: 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
dd20: 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c  utine is to anal
dd30: 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62 65 78  yze the.** subex
dd40: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70  pression and pop
dd50: 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20 6f 74  ulate all the ot
dd60: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 74 68  her fields of th
dd70: 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73  e WhereTerm.** s
dd80: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
dd90: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
dda0: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
ddb0: 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22   "<expr> <op> X"
ddc0: 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75 74 65   it gets commute
ddd0: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 6e  d.** to the stan
dde0: 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22 58 20  dard form of "X 
ddf0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a  <op> <expr>"..**
de00: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
de10: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
de20: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
de30: 77 68 65 72 65 20 62 6f 74 68 20 58 20 61 6e 64  where both X and
de40: 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e   Y are.** column
de50: 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  s, then the orig
de60: 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20  inal expression 
de70: 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
de80: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
de90: 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  * term of the fo
dea0: 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20 69 73  rm "Y <op> X" is
deb0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 57 48   added to the WH
dec0: 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a  ERE clause and.*
ded0: 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70 61 72  * analyzed separ
dee0: 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72 69 67  ately.  The orig
def0: 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d 61 72  inal term is mar
df00: 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 43 4f  ked with TERM_CO
df10: 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20  PIED.** and the 
df20: 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61 72 6b  new term is mark
df30: 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44 59 4e  ed with TERM_DYN
df40: 41 4d 49 43 20 28 62 65 63 61 75 73 65 20 69 74  AMIC (because it
df50: 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64  's pExpr.** need
df60: 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 69  s to be freed wi
df70: 74 68 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  th the WhereClau
df80: 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56 49 52  se) and TERM_VIR
df90: 54 55 41 4c 20 28 62 65 63 61 75 73 65 20 69 74  TUAL (because it
dfa0: 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75 74 65  .** is a commute
dfb0: 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72 69 6f  d copy of a prio
dfc0: 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20 6f 72  r term.)  The or
dfd0: 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61 73 20  iginal term has 
dfe0: 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20  nChild=1.** and 
dff0: 74 68 65 20 63 6f 70 79 20 68 61 73 20 69 64 78  the copy has idx
e000: 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20 74 68  Parent set to th
e010: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6f  e index of the o
e020: 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f  riginal term..*/
e030: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
e040: 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c  rAnalyze(.  SrcL
e050: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
e060: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
e070: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
e080: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
e090: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
e0a0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
e0b0: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
e0c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
e0d0: 64 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20  dex of the term 
e0e0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
e0f0: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
e100: 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e   *pWInfo = pWC->
e110: 70 57 49 6e 66 6f 3b 20 2f 2a 20 57 48 45 52 45  pWInfo; /* WHERE
e120: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
e130: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e140: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
e150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e160: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20   /* The term to 
e170: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  be analyzed */. 
e180: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
e190: 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20 20  MaskSet;        
e1a0: 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62 6c    /* Set of tabl
e1b0: 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f  e index masks */
e1c0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20  .  Expr *pExpr; 
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
e1f0: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c  ssion to be anal
e200: 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73  yzed */.  Bitmas
e210: 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20  k prereqLeft;   
e220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
e230: 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 74  erequesites of t
e240: 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  he pExpr->pLeft 
e250: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
e260: 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  reqAll;         
e270: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
e280: 65 73 69 74 65 73 20 6f 66 20 70 45 78 70 72 20  esites of pExpr 
e290: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74  */.  Bitmask ext
e2a0: 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20 20 20  raRight = 0;    
e2b0: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 64        /* Extra d
e2c0: 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c  ependencies on L
e2d0: 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78  EFT JOIN */.  Ex
e2e0: 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b 20 20  pr *pStr1 = 0;  
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e300: 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  * RHS of LIKE/GL
e310: 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  OB operator */. 
e320: 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 20   int isComplete 
e330: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e340: 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45    /* RHS of LIKE
e350: 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74 68 20  /GLOB ends with 
e360: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e  wildcard */.  in
e370: 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20 20  t noCase = 0;   
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e390: 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74  * LIKE/GLOB dist
e3a0: 69 6e 67 75 69 73 68 65 73 20 63 61 73 65 20 2a  inguishes case *
e3b0: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3d0: 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65       /* Top-leve
e3e0: 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78  l operator.  pEx
e3f0: 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73  pr->op */.  Pars
e400: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
e410: 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20  fo->pParse;  /* 
e420: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
e430: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
e440: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
e450: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
e460: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
e470: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
e480: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
e490: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65  eturn;.  }.  pTe
e4a0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
e4b0: 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65  Term];.  pMaskSe
e4c0: 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  t = &pWInfo->sMa
e4d0: 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d  skSet;.  pExpr =
e4e0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
e4f0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
e500: 6f 70 21 3d 54 4b 5f 41 53 20 26 26 20 70 45 78  op!=TK_AS && pEx
e510: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41  pr->op!=TK_COLLA
e520: 54 45 20 29 3b 0a 20 20 70 72 65 72 65 71 4c 65  TE );.  prereqLe
e530: 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ft = exprTableUs
e540: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
e550: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f  xpr->pLeft);.  o
e560: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
e570: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
e580: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
e590: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
e5a0: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
e5b0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
e5c0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
e5d0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
e5e0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
e5f0: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
e600: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
e610: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
e620: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e630: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
e640: 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ht = exprListTab
e650: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
e660: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
e670: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
e680: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
e690: 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  LL ){.    pTerm-
e6a0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
e6b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
e6c0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
e6d0: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
e6e0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
e6f0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  pr->pRight);.  }
e700: 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65  .  prereqAll = e
e710: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
e720: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a  askSet, pExpr);.
e730: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
e740: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
e750: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
e760: 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74   Bitmask x = get
e770: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
e780: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
e790: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72  Table);.    prer
e7a0: 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20  eqAll |= x;.    
e7b0: 65 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31  extraRight = x-1
e7c0: 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20  ;  /* ON clause 
e7d0: 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65  terms may not be
e7e0: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
e7f0: 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20  dex.            
e800: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
e810: 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61   left table of a
e820: 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63   LEFT JOIN.  Tic
e830: 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d  ket #3015 */.  }
e840: 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  .  pTerm->prereq
e850: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
e860: 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  .  pTerm->leftCu
e870: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rsor = -1;.  pTe
e880: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
e890: 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  ;.  pTerm->eOper
e8a0: 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ator = 0;.  if( 
e8b0: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b  allowedOp(op) ){
e8c0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
e8d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
e8e0: 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d  ipCollate(pExpr-
e8f0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 45 78 70  >pLeft);.    Exp
e900: 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r *pRight = sqli
e910: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
e920: 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  te(pExpr->pRight
e930: 29 3b 0a 20 20 20 20 75 31 36 20 6f 70 4d 61 73  );.    u16 opMas
e940: 6b 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  k = (pTerm->prer
e950: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
e960: 4c 65 66 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c  Left)==0 ? WO_AL
e970: 4c 20 3a 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20  L : WO_EQUIV;.  
e980: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
e990: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
e9a0: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
e9b0: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
e9c0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65  Table;.      pTe
e9d0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
e9e0: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
e9f0: 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  n;.      pTerm->
ea00: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
ea10: 61 74 6f 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f  atorMask(op) & o
ea20: 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  pMask;.    }.   
ea30: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70   if( pRight && p
ea40: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
ea50: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68  LUMN ){.      Wh
ea60: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20  ereTerm *pNew;. 
ea70: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
ea80: 0a 20 20 20 20 20 20 75 31 36 20 65 45 78 74 72  .      u16 eExtr
ea90: 61 4f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  aOp = 0;        
eaa0: 2f 2a 20 45 78 74 72 61 20 62 69 74 73 20 66 6f  /* Extra bits fo
eab0: 72 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f  r pNew->eOperato
eac0: 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  r */.      if( p
ead0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
eae0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
eaf0: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
eb00: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
eb10: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
eb20: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
eb30: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
eb40: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
eb50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
eb60: 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20  ete(db, pDup);. 
eb70: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
eb80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
eb90: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
eba0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
ebb0: 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49  C, pDup, TERM_VI
ebc0: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
ebd0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IC);.        if(
ebe0: 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74   idxNew==0 ) ret
ebf0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  urn;.        pNe
ec00: 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  w = &pWC->a[idxN
ec10: 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ew];.        pNe
ec20: 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w->iParent = idx
ec30: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
ec40: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
ec50: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
ec60: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
ec70: 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  1;.        pTerm
ec80: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
ec90: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
eca0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
ecb0: 3d 54 4b 5f 45 51 0a 20 20 20 20 20 20 20 20 20  =TK_EQ.         
ecc0: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
ecd0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
ece0: 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
ecf0: 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
ed00: 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
ed10: 54 45 5f 54 72 61 6e 73 69 74 69 76 65 29 0a 20  TE_Transitive). 
ed20: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
ed30: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
ed40: 61 74 6f 72 20 7c 3d 20 57 4f 5f 45 51 55 49 56  ator |= WO_EQUIV
ed50: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 45 78 74  ;.          eExt
ed60: 72 61 4f 70 20 3d 20 57 4f 5f 45 51 55 49 56 3b  raOp = WO_EQUIV;
ed70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ed80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ed90: 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20  pDup = pExpr;.  
eda0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65        pNew = pTe
edb0: 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
edc0: 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50    exprCommute(pP
edd0: 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20  arse, pDup);.   
ede0: 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
edf0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
ee00: 65 28 70 44 75 70 2d 3e 70 4c 65 66 74 29 3b 0a  e(pDup->pLeft);.
ee10: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74        pNew->left
ee20: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
ee30: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
ee40: 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  ew->u.leftColumn
ee50: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
ee60: 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  n;.      testcas
ee70: 65 28 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c  e( (prereqLeft |
ee80: 20 65 78 74 72 61 52 69 67 68 74 29 20 21 3d 20   extraRight) != 
ee90: 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20  prereqLeft );.  
eea0: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
eeb0: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65  Right = prereqLe
eec0: 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b  ft | extraRight;
eed0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
eee0: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
eef0: 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ll;.      pNew->
ef00: 65 4f 70 65 72 61 74 6f 72 20 3d 20 28 6f 70 65  eOperator = (ope
ef10: 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e  ratorMask(pDup->
ef20: 6f 70 29 20 2b 20 65 45 78 74 72 61 4f 70 29 20  op) + eExtraOp) 
ef30: 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  & opMask;.    }.
ef40: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
ef50: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
ef60: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
ef70: 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20  /* If a term is 
ef80: 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72  the BETWEEN oper
ef90: 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f  ator, create two
efa0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
efb0: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66  ms.  ** that def
efc0: 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68  ine the range th
efd0: 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  at the BETWEEN i
efe0: 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20  mplements.  For 
eff0: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
f000: 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45 45  **      a BETWEE
f010: 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20  N b AND c.  **. 
f020: 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64   ** is converted
f030: 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
f040: 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45 4e        (a BETWEEN
f050: 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61   b AND c) AND (a
f060: 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a  >=b) AND (a<=c).
f070: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77    **.  ** The tw
f080: 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  o new terms are 
f090: 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  added onto the e
f0a0: 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65 43  nd of the WhereC
f0b0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20  lause object..  
f0c0: 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73  ** The new terms
f0d0: 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61   are "dynamic" a
f0e0: 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20  nd are children 
f0f0: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
f100: 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72  BETWEEN.  ** ter
f110: 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  m.  That means t
f120: 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57 45  hat if the BETWE
f130: 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64  EN term is coded
f140: 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  , the children a
f150: 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e  re.  ** skipped.
f160: 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69    Or, if the chi
f170: 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73 66  ldren are satisf
f180: 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c  ied by an index,
f190: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
f1a0: 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  ** BETWEEN term 
f1b0: 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  is skipped..  */
f1c0: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
f1d0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45  r->op==TK_BETWEE
f1e0: 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  N && pWC->op==TK
f1f0: 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72  _AND ){.    Expr
f200: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
f210: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
f220: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61    int i;.    sta
f230: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73  tic const u8 ops
f240: 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f  [] = {TK_GE, TK_
f250: 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  LE};.    assert(
f260: 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20   pList!=0 );.   
f270: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
f280: 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20  nExpr==2 );.    
f290: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
f2a0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
f2b0: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
f2c0: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
f2d0: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
f2e0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
f2f0: 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20  , ops[i], .     
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
f320: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
f330: 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20  ->pLeft, 0),.   
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f350: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f360: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69  3ExprDup(db, pLi
f370: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
f380: 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  0), 0);.      id
f390: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
f3a0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
f3b0: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
f3c0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
f3d0: 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
f3e0: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
f3f0: 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79  .      exprAnaly
f400: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
f410: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65  xNew);.      pTe
f420: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
f430: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43  Term];.      pWC
f440: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
f450: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
f460: 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e     }.    pTerm->
f470: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a  nChild = 2;.  }.
f480: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f490: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
f4a0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
f4b0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
f4c0: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
f4d0: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
f4e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f4f0: 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20  _SUBQUERY).  /* 
f500: 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74  Analyze a term t
f510: 68 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20  hat is composed 
f520: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
f530: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
f540: 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20  d by.  ** an OR 
f550: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
f560: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
f570: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20  >op==TK_OR ){.  
f580: 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f    assert( pWC->o
f590: 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
f5a0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
f5b0: 72 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  rm(pSrc, pWC, id
f5c0: 78 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72  xTerm);.    pTer
f5d0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
f5e0: 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  erm];.  }.#endif
f5f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
f600: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
f610: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
f620: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
f630: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41  IMIZATION.  /* A
f640: 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  dd constraints t
f650: 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61  o reduce the sea
f660: 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c  rch space on a L
f670: 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a  IKE or GLOB.  **
f680: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a   operator..  **.
f690: 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74    ** A like patt
f6a0: 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ern of the form 
f6b0: 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20  "x LIKE 'abc%'" 
f6c0: 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20  is changed into 
f6d0: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
f6e0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78  .  **          x
f6f0: 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61  >='abc' AND x<'a
f700: 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27  bd' AND x LIKE '
f710: 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20  abc%'.  **.  ** 
f720: 54 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  The last charact
f730: 65 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  er of the prefix
f740: 20 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d   "abc" is increm
f750: 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68  ented to form th
f760: 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69  e.  ** terminati
f770: 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62  on condition "ab
f780: 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d"..  */.  if( p
f790: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a  WC->op==TK_AND .
f7a0: 20 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c     && isLikeOrGl
f7b0: 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ob(pParse, pExpr
f7c0: 2c 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d  , &pStr1, &isCom
f7d0: 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a  plete, &noCase).
f7e0: 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70    ){.    Expr *p
f7f0: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Left;       /* L
f800: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
f810: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
f820: 45 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20  Expr *pStr2;    
f830: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53     /* Copy of pS
f840: 74 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b  tr1 - RHS of LIK
f850: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
f860: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  */.    Expr *pNe
f870: 77 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72  wExpr1;.    Expr
f880: 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20   *pNewExpr2;.   
f890: 20 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20   int idxNew1;.  
f8a0: 20 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20    int idxNew2;. 
f8b0: 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65     Token sCollSe
f8c0: 71 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  qName;  /* Name 
f8d0: 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  of collating seq
f8e0: 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 70 4c  uence */..    pL
f8f0: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  eft = pExpr->x.p
f900: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
f910: 3b 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71  ;.    pStr2 = sq
f920: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
f930: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
f940: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
f950: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75  ailed ){.      u
f960: 38 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20  8 c, *pC;       
f970: 2f 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74 65  /* Last characte
f980: 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
f990: 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20  st wildcard */. 
f9a0: 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26       pC = (u8*)&
f9b0: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pStr2->u.zToken[
f9c0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
f9d0: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pStr2->u.zToken)
f9e0: 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  -1];.      c = *
f9f0: 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f  pC;.      if( no
fa00: 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Case ){.        
fa10: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20  /* The point is 
fa20: 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
fa30: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
fa40: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
fa50: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64  .        ** wild
fa60: 63 61 72 64 2e 20 20 42 75 74 20 69 66 20 77 65  card.  But if we
fa70: 20 69 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20   increment '@', 
fa80: 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69  that will push i
fa90: 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  t into the.     
faa0: 20 20 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63     ** alphabetic
fab0: 20 72 61 6e 67 65 20 77 68 65 72 65 20 63 61 73   range where cas
fac0: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69  e conversions wi
fad0: 6c 6c 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a  ll mess up the .
fae0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75          ** inequ
faf0: 61 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64  ality.  To avoid
fb00: 20 74 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65   this, make sure
fb10: 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65   to also run the
fb20: 20 66 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   full.        **
fb30: 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e   LIKE on all can
fb40: 64 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f  didate expressio
fb50: 6e 73 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ns by clearing t
fb60: 68 65 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c  he isComplete fl
fb70: 61 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ag.        */.  
fb80: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27        if( c=='A'
fb90: 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20  -1 ) isComplete 
fba0: 3d 20 30 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d  = 0;   /* EV: R-
fbb0: 36 34 33 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a  64339-08207 */..
fbc0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c  .        c = sql
fbd0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
fbe0: 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [c];.      }.   
fbf0: 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a     *pC = c + 1;.
fc00: 20 20 20 20 7d 0a 20 20 20 20 73 43 6f 6c 6c 53      }.    sCollS
fc10: 65 71 4e 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73  eqName.z = noCas
fc20: 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20 22  e ? "NOCASE" : "
fc30: 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 73 43 6f  BINARY";.    sCo
fc40: 6c 6c 53 65 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b  llSeqName.n = 6;
fc50: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d  .    pNewExpr1 =
fc60: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
fc70: 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20  db, pLeft, 0);. 
fc80: 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73     pNewExpr1 = s
fc90: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
fca0: 73 65 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20  se, TK_GE, .    
fcb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
fcc0: 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
fcd0: 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70  n(pParse,pNewExp
fce0: 72 31 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  r1,&sCollSeqName
fcf0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ),.           pS
fd00: 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 64 78  tr1, 0);.    idx
fd10: 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75  New1 = whereClau
fd20: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
fd30: 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49  ewExpr1, TERM_VI
fd40: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
fd50: 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  IC);.    testcas
fd60: 65 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b  e( idxNew1==0 );
fd70: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
fd80: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
fd90: 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  ew1);.    pNewEx
fda0: 70 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pr2 = sqlite3Exp
fdb0: 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20  rDup(db, pLeft, 
fdc0: 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  0);.    pNewExpr
fdd0: 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  2 = sqlite3PExpr
fde0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a  (pParse, TK_LT,.
fdf0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
fe00: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
fe10: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e 65  Token(pParse,pNe
fe20: 77 45 78 70 72 32 2c 26 73 43 6f 6c 6c 53 65 71  wExpr2,&sCollSeq
fe30: 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Name),.         
fe40: 20 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20    pStr2, 0);.   
fe50: 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65   idxNew2 = where
fe60: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
fe70: 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52  , pNewExpr2, TER
fe80: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
fe90: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
fea0: 74 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d  tcase( idxNew2==
feb0: 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
fec0: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
fed0: 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54  idxNew2);.    pT
fee0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
fef0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20  xTerm];.    if( 
ff00: 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  isComplete ){.  
ff10: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
ff20: 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  w1].iParent = id
ff30: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43  xTerm;.      pWC
ff40: 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61  ->a[idxNew2].iPa
ff50: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
ff60: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
ff70: 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  ild = 2;.    }. 
ff80: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
ff90: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
ffa0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
ffb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ffc0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
ffd0: 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41    /* Add a WO_MA
ffe0: 54 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65  TCH auxiliary te
fff0: 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72  rm to the constr
10000 61 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a  aint set if the.
10010 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70    ** current exp
10020 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
10030 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20  e form:  column 
10040 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a  MATCH expr..  **
10050 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
10060 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
10070 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
10080 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74  ods of.  ** virt
10090 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65  ual tables.  The
100a0 20 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70   native query op
100b0 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74  timizer does not
100c0 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f   attempt.  ** to
100d0 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74   do anything wit
100e0 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e  h MATCH function
100f0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  s..  */.  if( is
10100 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45  MatchOfColumn(pE
10110 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  xpr) ){.    int 
10120 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72  idxNew;.    Expr
10130 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74   *pRight, *pLeft
10140 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
10150 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42  *pNewTerm;.    B
10160 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c  itmask prereqCol
10170 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b  umn, prereqExpr;
10180 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70  ..    pRight = p
10190 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
101a0 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [0].pExpr;.    p
101b0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Left = pExpr->x.
101c0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
101d0 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70  r;.    prereqExp
101e0 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  r = exprTableUsa
101f0 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69  ge(pMaskSet, pRi
10200 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ght);.    prereq
10210 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62  Column = exprTab
10220 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
10230 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
10240 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20  ( (prereqExpr & 
10250 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30  prereqColumn)==0
10260 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
10270 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
10280 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
10290 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
102a0 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20  TK_MATCH, .     
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69           0, sqli
102d0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
102e0 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20  Right, 0), 0);. 
102f0 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
10300 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
10310 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
10320 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
10330 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
10340 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
10350 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  w==0 );.      pN
10360 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  ewTerm = &pWC->a
10370 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
10380 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
10390 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78  Right = prereqEx
103a0 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  pr;.      pNewTe
103b0 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
103c0 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
103d0 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
103e0 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
103f0 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
10400 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65       pNewTerm->e
10410 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41  Operator = WO_MA
10420 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  TCH;.      pNewT
10430 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
10440 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
10450 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
10460 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
10470 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
10480 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
10490 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
104a0 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
104b0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
104c0 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
104d0 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
104e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
104f0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10500 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
10510 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
10520 20 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65    /* When sqlite
10530 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d  _stat3 histogram
10540 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62   data is availab
10550 6c 65 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f  le an operator o
10560 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20  f the.  ** form 
10570 22 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20  "x IS NOT NULL" 
10580 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65  can sometimes be
10590 20 65 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20   evaluated more 
105a0 65 66 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a  efficiently.  **
105b0 20 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20   as "x>NULL" if 
105c0 78 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  x is not an INTE
105d0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
105e0 20 20 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61    So construct a
105f0 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65  .  ** virtual te
10600 72 6d 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e  rm of that form.
10610 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
10620 74 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c  that the virtual
10630 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61   term must be ta
10640 67 67 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56  gged with TERM_V
10650 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a  NULL.  This.  **
10660 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20   TERM_VNULL tag 
10670 77 69 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68  will suppress th
10680 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b  e not-null check
10690 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
106a0 67 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f  g.  ** of the lo
106b0 6f 70 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65  op.  Without the
106c0 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67   TERM_VNULL flag
106d0 2c 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63  , the not-null c
106e0 68 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65  heck at.  ** the
106f0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f   start of the lo
10700 6f 70 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20  op will prevent 
10710 61 6e 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  any results from
10720 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e   being returned.
10730 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
10740 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op==TK_NOTNUL
10750 4c 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70  L.   && pExpr->p
10760 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Left->op==TK_COL
10770 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d  UMN.   && pExpr-
10780 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e  >pLeft->iColumn>
10790 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
107a0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
107b0 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29 0a 20   SQLITE_Stat3). 
107c0 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
107d0 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  ewExpr;.    Expr
107e0 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
107f0 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20  >pLeft;.    int 
10800 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72  idxNew;.    Wher
10810 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b  eTerm *pNewTerm;
10820 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d  ..    pNewExpr =
10830 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
10840 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20  arse, TK_GT,.   
10850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10860 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10870 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
10880 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
10890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108a0 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28     sqlite3PExpr(
108b0 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c  pParse, TK_NULL,
108c0 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a   0, 0, 0), 0);..
108d0 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
108e0 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
108f0 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20  WC, pNewExpr,.  
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10910 20 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d              TERM
10920 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
10930 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c  NAMIC|TERM_VNULL
10940 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65  );.    if( idxNe
10950 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54  w ){.      pNewT
10960 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
10970 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65  xNew];.      pNe
10980 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  wTerm->prereqRig
10990 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  ht = 0;.      pN
109a0 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ewTerm->leftCurs
109b0 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
109c0 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  le;.      pNewTe
109d0 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
109e0 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
109f0 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  n;.      pNewTer
10a00 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
10a10 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77  O_GT;.      pNew
10a20 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
10a30 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
10a40 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
10a50 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
10a60 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
10a70 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
10a80 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
10a90 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65  OPIED;.      pNe
10aa0 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  wTerm->prereqAll
10ab0 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   = pTerm->prereq
10ac0 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  All;.    }.  }.#
10ad0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10ae0 45 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a  ENABLE_STAT */..
10af0 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20    /* Prevent ON 
10b00 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20  clause terms of 
10b10 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d  a LEFT JOIN from
10b20 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64   being used to d
10b30 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  rive.  ** an ind
10b40 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f  ex for tables to
10b50 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
10b60 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54   join..  */.  pT
10b70 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
10b80 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a   |= extraRight;.
10b90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
10ba0 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20  nction searches 
10bb0 70 4c 69 73 74 20 66 6f 72 20 61 20 65 6e 74 72  pList for a entr
10bc0 79 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74  y that matches t
10bd0 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
10be0 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70 49  n.** of index pI
10bf0 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  dx..**.** If suc
10c00 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  h an expression 
10c10 69 73 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e  is found, its in
10c20 64 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b  dex in pList->a[
10c30 5d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  ] is returned. I
10c40 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69  f.** no expressi
10c50 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20  on is found, -1 
10c60 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
10c70 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49  static int findI
10c80 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65  ndexCol(.  Parse
10c90 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
10cb0 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
10cc0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
10cd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10ce0 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c   /* Expression l
10cf0 69 73 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  ist to search */
10d00 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20  .  int iBase,   
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72     /* Cursor for
10d30 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
10d40 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20  d with pIdx */. 
10d50 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d70 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74   /* Index to mat
10d80 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a  ch column of */.
10d90 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20    int iCol      
10da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10db0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69    /* Column of i
10dc0 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f  ndex to match */
10dd0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  .){.  int i;.  c
10de0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
10df0 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
10e00 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d  iCol];..  for(i=
10e10 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
10e20 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
10e30 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78  r *p = sqlite3Ex
10e40 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c  prSkipCollate(pL
10e50 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
10e60 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
10e70 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20  =TK_COLUMN.     
10e80 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  && p->iColumn==p
10e90 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43  Idx->aiColumn[iC
10ea0 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69  ol].     && p->i
10eb0 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20  Table==iBase.   
10ec0 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
10ed0 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
10ee0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
10ef0 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  arse, pList->a[i
10f00 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
10f10 69 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c  if( ALWAYS(pColl
10f20 29 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  ) && 0==sqlite3S
10f30 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
10f40 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  ame, zColl) ){. 
10f50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b         return i;
10f60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10f70 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b   }..  return -1;
10f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10f90 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53   true if the DIS
10fa0 54 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e  TINCT expression
10fb0 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20  -list passed as 
10fc0 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
10fd0 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61  nt.** is redunda
10fe0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54  nt..**.** A DIST
10ff0 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65 64  INCT list is red
11000 75 6e 64 61 6e 74 20 69 66 20 74 68 65 20 64 61  undant if the da
11010 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20  tabase contains 
11020 73 6f 6d 65 20 73 75 62 73 65 74 20 6f 66 0a 2a  some subset of.*
11030 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  * columns that a
11040 72 65 20 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f  re unique and no
11050 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  n-null..*/.stati
11060 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74  c int isDistinct
11070 52 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72  Redundant(.  Par
11080 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11090 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
110a0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
110b0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
110c0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
110d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
110e0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
110f0 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  C,         /* Th
11100 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
11110 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44  /.  ExprList *pD
11120 69 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a  istinct       /*
11130 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
11140 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
11150 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a   DISTINCT */.){.
11160 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
11170 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
11180 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111a0 0a 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20  .  int iBase;.. 
111b0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
111c0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61  more than one ta
111d0 62 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63  ble or sub-selec
111e0 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  t in the FROM cl
111f0 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ause of.  ** thi
11200 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74  s query, then it
11210 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73   will not be pos
11220 73 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68  sible to show th
11230 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  at the DISTINCT 
11240 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  .  ** clause is 
11250 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20  redundant. */.  
11260 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
11270 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
11280 3b 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61 62  ;.  iBase = pTab
11290 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
112a0 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61  or;.  pTab = pTa
112b0 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62  bList->a[0].pTab
112c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f  ;..  /* If any o
112d0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
112e0 73 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75  s is an IPK colu
112f0 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73  mn on table iBas
11300 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
11310 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a    ** true. Note:
11320 20 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d   The (p->iTable=
11330 3d 69 42 61 73 65 29 20 70 61 72 74 20 6f 66 20  =iBase) part of 
11340 74 68 69 73 20 74 65 73 74 20 6d 61 79 20 62 65  this test may be
11350 20 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20   false if the.  
11360 2a 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  ** current SELEC
11370 54 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  T is a correlate
11380 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a  d sub-query..  *
11390 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
113a0 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b  Distinct->nExpr;
113b0 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
113c0 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  *p = sqlite3Expr
113d0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73  SkipCollate(pDis
113e0 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  tinct->a[i].pExp
113f0 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  r);.    if( p->o
11400 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
11410 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
11420 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30   && p->iColumn<0
11430 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
11440 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
11450 75 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ugh all indices 
11460 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68  on the table, ch
11470 65 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73  ecking each to s
11480 65 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20  ee if it makes. 
11490 20 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54   ** the DISTINCT
114a0 20 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e   qualifier redun
114b0 64 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f  dant. It does so
114c0 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   if:.  **.  **  
114d0 20 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73   1. The index is
114e0 20 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20   itself UNIQUE, 
114f0 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  and.  **.  **   
11500 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f  2. All of the co
11510 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
11520 65 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61  ex are either pa
11530 72 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69  rt of the pDisti
11540 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69  nct.  **      li
11550 73 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20  st, or else the 
11560 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
11570 74 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20  tains a term of 
11580 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22  the form "col=X"
11590 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72  ,.  **      wher
115a0 65 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  e X is a constan
115b0 74 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c  t value. The col
115c0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
115d0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20   of the.  **    
115e0 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64    comparison and
115f0 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70   select-list exp
11600 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61  ressions must ma
11610 74 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65  tch those of the
11620 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
11630 2a 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68  *   3. All of th
11640 6f 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  ose index column
11650 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  s for which the 
11660 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65  WHERE clause doe
11670 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20  s not.  **      
11680 63 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58  contain a "col=X
11690 22 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65  " term are subje
116a0 63 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c  ct to a NOT NULL
116b0 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a   constraint..  *
116c0 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  /.  for(pIdx=pTa
116d0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
116e0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
116f0 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78  t){.    if( pIdx
11700 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f  ->onError==OE_No
11710 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
11720 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
11730 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
11740 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
11750 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
11760 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  mn[i];.      if(
11770 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43   0==findTerm(pWC
11780 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e  , iBase, iCol, ~
11790 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45  (Bitmask)0, WO_E
117a0 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20  Q, pIdx) ){.    
117b0 20 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20      int iIdxCol 
117c0 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70  = findIndexCol(p
117d0 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74  Parse, pDistinct
117e0 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69  , iBase, pIdx, i
117f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
11800 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62  IdxCol<0 || pTab
11810 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  ->aCol[pIdx->aiC
11820 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c  olumn[i]].notNul
11830 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
11840 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11850 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
11860 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78  .    if( i==pIdx
11870 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
11880 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
11890 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
118a0 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
118b0 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e  fier is redundan
118c0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
118d0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
118e0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
118f0 2f 2a 20 0a 2a 2a 20 54 68 65 20 28 61 6e 20 61  /* .** The (an a
11900 70 70 72 6f 78 69 6d 61 74 65 29 20 73 75 6d 20  pproximate) sum 
11910 6f 66 20 74 77 6f 20 57 68 65 72 65 43 6f 73 74  of two WhereCost
11920 73 2e 20 20 54 68 69 73 20 63 6f 6d 70 75 74 61  s.  This computa
11930 74 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 61  tion is.** not a
11940 20 73 69 6d 70 6c 65 20 22 2b 22 20 6f 70 65 72   simple "+" oper
11950 61 74 6f 72 20 62 65 63 61 75 73 65 20 57 68 65  ator because Whe
11960 72 65 43 6f 73 74 20 69 73 20 73 74 6f 72 65 64  reCost is stored
11970 20 61 73 20 61 20 6c 6f 67 61 72 69 74 68 6d 69   as a logarithmi
11980 63 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 20 0a  c.** value..** .
11990 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43  */.static WhereC
119a0 6f 73 74 20 77 68 65 72 65 43 6f 73 74 41 64 64  ost whereCostAdd
119b0 28 57 68 65 72 65 43 6f 73 74 20 61 2c 20 57 68  (WhereCost a, Wh
119c0 65 72 65 43 6f 73 74 20 62 29 7b 0a 20 20 73 74  ereCost b){.  st
119d0 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
119e0 6e 65 64 20 63 68 61 72 20 78 5b 5d 20 3d 20 7b  ned char x[] = {
119f0 0a 20 20 20 20 20 31 30 2c 20 31 30 2c 20 20 20  .     10, 10,   
11a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a10 20 20 20 20 20 20 2f 2a 20 30 2c 31 20 2a 2f 0a        /* 0,1 */.
11a20 20 20 20 20 20 20 39 2c 20 39 2c 20 20 20 20 20        9, 9,     
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a40 20 20 20 20 20 2f 2a 20 32 2c 33 20 2a 2f 0a 20       /* 2,3 */. 
11a50 20 20 20 20 20 38 2c 20 38 2c 20 20 20 20 20 20       8, 8,      
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a70 20 20 20 20 2f 2a 20 34 2c 35 20 2a 2f 0a 20 20      /* 4,5 */.  
11a80 20 20 20 20 37 2c 20 37 2c 20 37 2c 20 20 20 20      7, 7, 7,    
11a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11aa0 20 20 20 2f 2a 20 36 2c 37 2c 38 20 2a 2f 0a 20     /* 6,7,8 */. 
11ab0 20 20 20 20 20 36 2c 20 36 2c 20 36 2c 20 20 20       6, 6, 6,   
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ad0 20 20 20 20 2f 2a 20 39 2c 31 30 2c 31 31 20 2a      /* 9,10,11 *
11ae0 2f 0a 20 20 20 20 20 20 35 2c 20 35 2c 20 35 2c  /.      5, 5, 5,
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 20 20 20 20 20 20 2f 2a 20 31 32 2d 31 34 20         /* 12-14 
11b10 2a 2f 0a 20 20 20 20 20 20 34 2c 20 34 2c 20 34  */.      4, 4, 4
11b20 2c 20 34 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 4,            
11b30 20 20 20 20 20 20 20 20 2f 2a 20 31 35 2d 31 38          /* 15-18
11b40 20 2a 2f 0a 20 20 20 20 20 20 33 2c 20 33 2c 20   */.      3, 3, 
11b50 33 2c 20 33 2c 20 33 2c 20 33 2c 20 20 20 20 20  3, 3, 3, 3,     
11b60 20 20 20 20 20 20 20 20 20 2f 2a 20 31 39 2d 32           /* 19-2
11b70 34 20 2a 2f 0a 20 20 20 20 20 20 32 2c 20 32 2c  4 */.      2, 2,
11b80 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20   2, 2, 2, 2, 2, 
11b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 35 2d            /* 25-
11ba0 33 31 20 2a 2f 0a 20 20 7d 3b 0a 20 20 69 66 28  31 */.  };.  if(
11bb0 20 61 3e 3d 62 20 29 7b 0a 20 20 20 20 69 66 28   a>=b ){.    if(
11bc0 20 61 3e 62 2b 34 39 20 29 20 72 65 74 75 72 6e   a>b+49 ) return
11bd0 20 61 3b 0a 20 20 20 20 69 66 28 20 61 3e 62 2b   a;.    if( a>b+
11be0 33 31 20 29 20 72 65 74 75 72 6e 20 61 2b 31 3b  31 ) return a+1;
11bf0 0a 20 20 20 20 72 65 74 75 72 6e 20 61 2b 78 5b  .    return a+x[
11c00 61 2d 62 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  a-b];.  }else{. 
11c10 20 20 20 69 66 28 20 62 3e 61 2b 34 39 20 29 20     if( b>a+49 ) 
11c20 72 65 74 75 72 6e 20 62 3b 0a 20 20 20 20 69 66  return b;.    if
11c30 28 20 62 3e 61 2b 33 31 20 29 20 72 65 74 75 72  ( b>a+31 ) retur
11c40 6e 20 62 2b 31 3b 0a 20 20 20 20 72 65 74 75 72  n b+1;.    retur
11c50 6e 20 62 2b 78 5b 62 2d 61 5d 3b 0a 20 20 7d 0a  n b+x[b-a];.  }.
11c60 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
11c70 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f   an integer into
11c80 20 61 20 57 68 65 72 65 43 6f 73 74 2e 20 20 49   a WhereCost.  I
11c90 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 63  n other words, c
11ca0 6f 6d 70 75 74 65 20 61 0a 2a 2a 20 67 6f 6f 64  ompute a.** good
11cb0 20 61 70 70 72 6f 78 69 6d 61 74 61 74 69 6f 6e   approximatation
11cc0 20 66 6f 72 20 31 30 2a 6c 6f 67 32 28 78 29 2e   for 10*log2(x).
11cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
11ce0 43 6f 73 74 20 77 68 65 72 65 43 6f 73 74 28 74  Cost whereCost(t
11cf0 52 6f 77 63 6e 74 20 78 29 7b 0a 20 20 73 74 61  Rowcnt x){.  sta
11d00 74 69 63 20 57 68 65 72 65 43 6f 73 74 20 61 5b  tic WhereCost a[
11d10 5d 20 3d 20 7b 20 30 2c 20 32 2c 20 33 2c 20 35  ] = { 0, 2, 3, 5
11d20 2c 20 36 2c 20 37 2c 20 38 2c 20 39 20 7d 3b 0a  , 6, 7, 8, 9 };.
11d30 20 20 57 68 65 72 65 43 6f 73 74 20 79 20 3d 20    WhereCost y = 
11d40 34 30 3b 0a 20 20 69 66 28 20 78 3c 38 20 29 7b  40;.  if( x<8 ){
11d50 0a 20 20 20 20 69 66 28 20 78 3c 32 20 29 20 72  .    if( x<2 ) r
11d60 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69  eturn 0;.    whi
11d70 6c 65 28 20 78 3c 38 20 29 7b 20 20 79 20 2d 3d  le( x<8 ){  y -=
11d80 20 31 30 3b 20 78 20 3c 3c 3d 20 31 3b 20 7d 0a   10; x <<= 1; }.
11d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
11da0 6c 65 28 20 78 3e 32 35 35 20 29 7b 20 79 20 2b  le( x>255 ){ y +
11db0 3d 20 34 30 3b 20 78 20 3e 3e 3d 20 34 3b 20 7d  = 40; x >>= 4; }
11dc0 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3e 31 35  .    while( x>15
11dd0 20 29 7b 20 20 79 20 2b 3d 20 31 30 3b 20 78 20   ){  y += 10; x 
11de0 3e 3e 3d 20 31 3b 20 7d 0a 20 20 7d 0a 20 20 72  >>= 1; }.  }.  r
11df0 65 74 75 72 6e 20 61 5b 78 26 37 5d 20 2b 20 79  eturn a[x&7] + y
11e00 20 2d 20 31 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65   - 10;.}..#ifnde
11e10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
11e20 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
11e30 20 43 6f 6e 76 65 72 74 20 61 20 64 6f 75 62 6c   Convert a doubl
11e40 65 20 28 61 73 20 72 65 63 65 69 76 65 64 20 66  e (as received f
11e50 72 6f 6d 20 78 42 65 73 74 49 6e 64 65 78 20 6f  rom xBestIndex o
11e60 66 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  f a virtual tabl
11e70 65 29 0a 2a 2a 20 69 6e 74 6f 20 61 20 57 68 65  e).** into a Whe
11e80 72 65 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65  reCost.  In othe
11e90 72 20 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65  r words, compute
11ea0 20 61 6e 20 61 70 70 72 6f 78 69 6d 61 74 69 6f   an approximatio
11eb0 6e 20 66 6f 72 0a 2a 2a 20 31 30 2a 6c 6f 67 32  n for.** 10*log2
11ec0 28 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  (x)..*/.static W
11ed0 68 65 72 65 43 6f 73 74 20 77 68 65 72 65 43 6f  hereCost whereCo
11ee0 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 64 6f 75  stFromDouble(dou
11ef0 62 6c 65 20 78 29 7b 0a 20 20 75 36 34 20 61 3b  ble x){.  u64 a;
11f00 0a 20 20 57 68 65 72 65 43 6f 73 74 20 65 3b 0a  .  WhereCost e;.
11f10 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
11f20 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66  (x)==8 && sizeof
11f30 28 61 29 3d 3d 38 20 29 3b 0a 20 20 69 66 28 20  (a)==8 );.  if( 
11f40 78 3c 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  x<=1 ) return 0;
11f50 0a 20 20 69 66 28 20 78 3c 3d 32 30 30 30 30 30  .  if( x<=200000
11f60 30 30 30 30 20 29 20 72 65 74 75 72 6e 20 77 68  0000 ) return wh
11f70 65 72 65 43 6f 73 74 28 28 74 52 6f 77 63 6e 74  ereCost((tRowcnt
11f80 29 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61  )x);.  memcpy(&a
11f90 2c 20 26 78 2c 20 38 29 3b 0a 20 20 65 20 3d 20  , &x, 8);.  e = 
11fa0 28 61 3e 3e 35 32 29 20 2d 20 31 30 32 32 3b 0a  (a>>52) - 1022;.
11fb0 20 20 72 65 74 75 72 6e 20 65 2a 31 30 3b 0a 7d    return e*10;.}
11fc0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11fd0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11fe0 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 73  BLE */../*.** Es
11ff0 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72  timate the logar
12000 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75  ithm of the inpu
12010 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20  t value to base 
12020 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  2..*/.static Whe
12030 72 65 43 6f 73 74 20 65 73 74 4c 6f 67 28 57 68  reCost estLog(Wh
12040 65 72 65 43 6f 73 74 20 4e 29 7b 0a 20 20 57 68  ereCost N){.  Wh
12050 65 72 65 43 6f 73 74 20 78 20 3d 20 77 68 65 72  ereCost x = wher
12060 65 43 6f 73 74 28 4e 29 3b 0a 20 20 72 65 74 75  eCost(N);.  retu
12070 72 6e 20 78 3e 33 33 20 3f 20 78 20 2d 20 33 33  rn x>33 ? x - 33
12080 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   : 0;.}../*.** T
12090 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  wo routines for 
120a0 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e  printing the con
120b0 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74  tent of an sqlit
120c0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a  e3_index_info.**
120d0 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65   structure.  Use
120e0 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
120f0 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
12100 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  .  If neither.**
12110 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20   SQLITE_TEST or 
12120 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65  SQLITE_DEBUG are
12130 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
12140 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a  hese routines.**
12150 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a   are no-ops..*/.
12160 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
12170 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
12180 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
12190 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
121a0 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69  BLED).static voi
121b0 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  d TRACE_IDX_INPU
121c0 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
121d0 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
121e0 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
121f0 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
12200 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
12210 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
12220 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
12230 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12240 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25  ("  constraint[%
12250 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69  d]: col=%d termi
12260 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c  d=%d op=%d usabl
12270 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ed=%d\n",.      
12280 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
12290 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f  onstraint[i].iCo
122a0 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
122b0 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
122c0 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20  TermOffset,.    
122d0 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
122e0 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20  t[i].op,.       
122f0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
12300 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20  ].usable);.  }. 
12310 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
12320 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
12330 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
12340 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79  rintf("  orderby
12350 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73  [%d]: col=%d des
12360 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
12370 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  i,.       p->aOr
12380 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
12390 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
123a0 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20  erBy[i].desc);. 
123b0 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
123c0 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
123d0 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
123e0 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
123f0 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
12400 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
12410 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
12420 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
12430 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
12440 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12450 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61  ("  usage[%d]: a
12460 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25  rgvIdx=%d omit=%
12470 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
12480 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
12490 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
124a0 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  gvIndex,.       
124b0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
124c0 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20  age[i].omit);.  
124d0 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
124e0 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d  Printf("  idxNum
124f0 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75  =%d\n", p->idxNu
12500 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
12510 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53  ugPrintf("  idxS
12520 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78  tr=%s\n", p->idx
12530 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
12540 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
12550 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64  derByConsumed=%d
12560 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43  \n", p->orderByC
12570 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69  onsumed);.  sqli
12580 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12590 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d    estimatedCost=
125a0 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61  %g\n", p->estima
125b0 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73  tedCost);.}.#els
125c0 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  e.#define TRACE_
125d0 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64  IDX_INPUTS(A).#d
125e0 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
125f0 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69  OUTPUTS(A).#endi
12600 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
12610 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
12620 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74  _INDEX./*.** Ret
12630 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
12640 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
12650 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20  m pTerm is of a 
12660 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a  form where it.**
12670 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77   could be used w
12680 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ith an index to 
12690 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73  access pSrc, ass
126a0 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72  uming an appropr
126b0 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78  iate.** index ex
126c0 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  isted..*/.static
126d0 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76   int termCanDriv
126e0 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54  eIndex(.  WhereT
126f0 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20  erm *pTerm,     
12700 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
12710 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  E clause term to
12720 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75   check */.  stru
12730 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
12740 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61  *pSrc,     /* Ta
12750 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e  ble we are tryin
12760 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20  g to access */. 
12770 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
12780 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
12790 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74  /* Tables in out
127a0 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20  er loops of the 
127b0 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  join */.){.  cha
127c0 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65  r aff;.  if( pTe
127d0 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
127e0 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
127f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
12800 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
12810 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20  r & WO_EQ)==0 ) 
12820 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
12830 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
12840 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21  ght & notReady)!
12850 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
12860 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65   if( pTerm->u.le
12870 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  ftColumn<0 ) ret
12880 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70  urn 0;.  aff = p
12890 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  Src->pTab->aCol[
128a0 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
128b0 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  umn].affinity;. 
128c0 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
128d0 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65  exAffinityOk(pTe
128e0 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20  rm->pExpr, aff) 
128f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
12900 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
12910 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
12920 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
12930 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e  _INDEX./*.** Gen
12940 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f  erate code to co
12950 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
12960 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20  x object for an 
12970 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a  automatic index.
12980 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70  ** and to set up
12990 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20   the WhereLevel 
129a0 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f  object pLevel so
129b0 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67   that the code g
129c0 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65  enerator.** make
129d0 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74  s use of the aut
129e0 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f  omatic index..*/
129f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
12a00 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
12a10 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
12a20 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
12a30 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
12a40 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
12a50 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
12a60 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
12a70 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
12a80 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
12a90 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
12aa0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
12ab0 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20  use term to get 
12ac0 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a  the next index *
12ad0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
12ae0 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
12af0 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
12b00 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
12b10 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57  available */.  W
12b20 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
12b30 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
12b40 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65  ite new index he
12b50 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
12b60 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
12b70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12b80 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
12b90 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  he constructed i
12ba0 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54  ndex */.  WhereT
12bb0 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
12bc0 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
12bd0 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
12be0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
12bf0 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
12c00 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  d;          /* E
12c10 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a  nd of pWC->a[] *
12c20 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
12c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c40 2f 2a 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72  /* Byte of memor
12c50 79 20 6e 65 65 64 65 64 20 66 6f 72 20 70 49 64  y needed for pId
12c60 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
12c70 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
12c80 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
12c90 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
12ca0 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
12cb0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12cd0 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
12ce0 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
12cf0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
12d00 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
12d10 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
12d20 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
12d30 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
12d40 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
12d50 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
12d60 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
12d70 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
12d80 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
12d90 65 79 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyinfo;         
12da0 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
12db0 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ion for the inde
12dc0 78 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64  x */   .  int ad
12dd0 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
12de0 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
12df0 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
12e00 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
12e10 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
12e20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
12e30 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
12e40 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
12e50 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
12e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
12e70 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
12e80 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
12e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ea0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
12eb0 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12ed0 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
12ee0 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
12ef0 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
12f00 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
12f10 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
12f20 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
12f30 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
12f40 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
12f50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
12f60 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
12f70 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b  Bitmask idxCols;
12f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
12f90 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73  itmap of columns
12fa0 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69   used for indexi
12fb0 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
12fc0 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20  extraCols;      
12fd0 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
12fe0 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
12ff0 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74  mns */.  u8 sent
13000 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20  Warning = 0;    
13010 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
13020 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62  a warnning has b
13030 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 0a 20  een issued */.. 
13040 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
13050 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
13060 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
13070 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
13080 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
13090 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
130a0 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
130b0 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
130c0 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
130d0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
130e0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
130f0 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20  );.  addrInit = 
13100 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
13110 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 43  pParse);..  /* C
13120 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
13130 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
13140 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
13150 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
13160 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
13170 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
13180 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
13190 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70  nColumn = 0;.  p
131a0 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
131b0 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
131c0 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
131d0 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  m];.  pLoop = pL
131e0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
131f0 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
13200 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
13210 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
13220 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
13230 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
13240 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
13250 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
13260 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
13270 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
13280 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
13290 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
132a0 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
132b0 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
132c0 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ol);.      testc
132d0 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
132e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
132f0 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
13300 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e 74  .      if( !sent
13310 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20  Warning ){.     
13320 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
13330 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55  QLITE_WARNING_AU
13340 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20 20  TOINDEX,.       
13350 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63 20       "automatic 
13360 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29 22  index on %s(%s)"
13370 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
13380 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61  .            pTa
13390 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  ble->aCol[iCol].
133a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
133b0 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b  sentWarning = 1;
133c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
133d0 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
133e0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
133f0 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
13400 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64  Resize(pParse->d
13410 62 2c 20 70 4c 6f 6f 70 2c 20 6e 43 6f 6c 75 6d  b, pLoop, nColum
13420 6e 2b 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  n+1) ) return;. 
13430 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
13440 54 65 72 6d 5b 6e 43 6f 6c 75 6d 6e 2b 2b 5d 20  Term[nColumn++] 
13450 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
13460 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
13470 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
13480 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
13490 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c  Column>0 );.  pL
134a0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
134b0 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
134c0 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 4c   = nColumn;.  pL
134d0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
134e0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
134f0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
13500 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a  | WHERE_INDEXED.
13510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13520 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54       | WHERE_AUT
13530 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43  O_INDEX;..  /* C
13540 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
13550 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
13560 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
13570 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
13580 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
13590 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
135a0 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
135b0 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
135c0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
135d0 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
135e0 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
135f0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
13600 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
13610 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
13620 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
13630 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
13640 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
13650 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
13660 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
13670 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
13680 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
13690 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
136a0 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
136b0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
136c0 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
136d0 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
136e0 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
136f0 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
13700 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
13710 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
13720 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54  dxCols | MASKBIT
13730 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69  (BMS-1));.  mxBi
13740 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e  tCol = (pTable->
13750 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f  nCol >= BMS-1) ?
13760 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d   BMS-1 : pTable-
13770 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73  >nCol;.  testcas
13780 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  e( pTable->nCol=
13790 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74  =BMS-1 );.  test
137a0 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
137b0 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66  ol==BMS-2 );.  f
137c0 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43  or(i=0; i<mxBitC
137d0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
137e0 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41  ( extraCols & MA
137f0 53 4b 42 49 54 28 69 29 20 29 20 6e 43 6f 6c 75  SKBIT(i) ) nColu
13800 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  mn++;.  }.  if( 
13810 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
13820 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
13830 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d  {.    nColumn +=
13840 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20   pTable->nCol - 
13850 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70  BMS + 1;.  }.  p
13860 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
13870 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
13880 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   | WHERE_IDX_ONL
13890 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75  Y;..  /* Constru
138a0 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
138b0 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  ect to describe 
138c0 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
138d0 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49  nByte = sizeof(I
138e0 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65 20 2b  ndex);.  nByte +
138f0 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
13900 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49 6e  (int);     /* In
13910 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a  dex.aiColumn */.
13920 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
13930 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  mn*sizeof(char*)
13940 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43  ;   /* Index.azC
13950 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  oll */.  nByte +
13960 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  = nColumn;      
13970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
13980 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
13990 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74  /.  pIdx = sqlit
139a0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
139b0 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65  Parse->db, nByte
139c0 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
139d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f   ) return;.  pLo
139e0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
139f0 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64  ex = pIdx;.  pId
13a00 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
13a10 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20  r**)&pIdx[1];.  
13a20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  pIdx->aiColumn =
13a30 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a   (int*)&pIdx->az
13a40 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20  Coll[nColumn];. 
13a50 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
13a60 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d 3e  r = (u8*)&pIdx->
13a70 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e  aiColumn[nColumn
13a80 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  ];.  pIdx->zName
13a90 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
13aa0 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .  pIdx->nColumn
13ab0 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49   = nColumn;.  pI
13ac0 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  dx->pTable = pTa
13ad0 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  ble;.  n = 0;.  
13ae0 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
13af0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
13b00 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
13b10 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
13b20 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
13b30 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
13b40 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
13b50 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
13b60 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
13b70 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
13b80 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
13b90 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
13ba0 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
13bb0 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ol);.      testc
13bc0 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
13bd0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13be0 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b  se( iCol==BMS );
13bf0 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
13c00 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
13c10 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
13c20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
13c30 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  pr;.        idxC
13c40 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
13c50 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
13c60 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d  lumn[n] = pTerm-
13c70 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
13c80 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
13c90 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
13ca0 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
13cb0 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
13cc0 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
13cd0 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
13ce0 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c  n] = ALWAYS(pCol
13cf0 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  l) ? pColl->zNam
13d00 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  e : "BINARY";.  
13d10 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
13d20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
13d30 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70  ssert( (u32)n==p
13d40 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
13d50 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61  q );..  /* Add a
13d60 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
13d70 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65  s needed to make
13d80 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
13d90 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  ndex into.  ** a
13da0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
13db0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
13dc0 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
13dd0 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
13de0 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29  s & MASKBIT(i) )
13df0 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
13e00 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
13e10 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
13e20 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[n] = "BINARY";
13e30 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
13e40 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  }.  }.  if( pSrc
13e50 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
13e60 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20  BIT(BMS-1) ){.  
13e70 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69    for(i=BMS-1; i
13e80 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
13e90 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ++){.      pIdx-
13ea0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
13eb0 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
13ec0 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
13ed0 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
13ee0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
13ef0 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b  t( n==nColumn );
13f00 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
13f10 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
13f20 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20  x */.  pKeyinfo 
13f30 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
13f40 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
13f50 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dx);.  assert( p
13f60 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d  Level->iIdxCur>=
13f70 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69  0 );.  pLevel->i
13f80 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  IdxCur = pParse-
13f90 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74  >nTab++;.  sqlit
13fa0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
13fb0 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78  OP_OpenAutoindex
13fc0 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
13fd0 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c  r, nColumn+1, 0,
13fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13ff0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
14000 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  info, P4_KEYINFO
14010 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62  _HANDOFF);.  Vdb
14020 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f  eComment((v, "fo
14030 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  r %s", pTable->z
14040 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69  Name));..  /* Fi
14050 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ll the automatic
14060 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74   index with cont
14070 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  ent */.  addrTop
14080 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14090 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
140a0 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  d, pLevel->iTabC
140b0 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64  ur);.  regRecord
140c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
140d0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
140e0 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
140f0 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
14100 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  pIdx, pLevel->iT
14110 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  abCur, regRecord
14120 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 1);.  sqlite3V
14130 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14140 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65  IdxInsert, pLeve
14150 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52  l->iIdxCur, regR
14160 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
14170 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
14180 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
14190 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65  ESULT);.  sqlite
141a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
141b0 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e  P_Next, pLevel->
141c0 69 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70  iTabCur, addrTop
141d0 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
141e0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
141f0 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
14200 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71  AUTOINDEX);.  sq
14210 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14220 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  e(v, addrTop);. 
14230 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
14240 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
14250 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20  egRecord);.  .  
14260 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65  /* Jump here whe
14270 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  n skipping the i
14280 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
14290 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
142a0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
142b0 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  it);.}.#endif /*
142c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
142d0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
142e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
142f0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
14300 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  E./*.** Allocate
14310 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
14320 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14330 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49  nfo structure. I
14340 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
14350 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
14360 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
14370 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
14380 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
14390 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
143a0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
143b0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
143c0 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  n to sqlite3_fre
143d0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  e()..*/.static s
143e0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
143f0 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  o *allocateIndex
14400 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70  Info(.  Parse *p
14410 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c  Parse,.  WhereCl
14420 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72  ause *pWC,.  str
14430 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
14440 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69   *pSrc,.  ExprLi
14450 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a  st *pOrderBy.){.
14460 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
14470 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63  t nTerm;.  struc
14480 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
14490 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
144a0 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
144b0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
144c0 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42  erby *pIdxOrderB
144d0 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  y;.  struct sqli
144e0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
144f0 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
14500 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
14510 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f  *pTerm;.  int nO
14520 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65  rderBy;.  sqlite
14530 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
14540 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f  dxInfo;..  /* Co
14550 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
14560 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45  f possible WHERE
14570 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
14580 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20  nts referring.  
14590 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75  ** to this virtu
145a0 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  al table */.  fo
145b0 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65  r(i=nTerm=0, pTe
145c0 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
145d0 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
145e0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
145f0 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
14600 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
14610 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
14620 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
14630 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65  erOfTwo(pTerm->e
14640 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45  Operator & ~WO_E
14650 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73  QUIV) );.    tes
14660 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
14670 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
14680 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
14690 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
146a0 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
146b0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
146c0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
146d0 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e  ISNULL) ) contin
146e0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
146f0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
14700 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
14710 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b  ue;.    nTerm++;
14720 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
14730 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
14740 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
14750 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
14760 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72  urrent .  ** vir
14770 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20  tual table then 
14780 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
14790 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20  or the aOrderBy 
147a0 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65  part of.  ** the
147b0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
147c0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20  nfo structure.. 
147d0 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   */.  nOrderBy =
147e0 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   0;.  if( pOrder
147f0 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  By ){.    int n 
14800 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
14810 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
14820 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
14830 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
14840 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
14850 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
14860 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
14870 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  UMN || pExpr->iT
14880 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
14890 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
148a0 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29   }.    if( i==n)
148b0 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79  {.      nOrderBy
148c0 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
148d0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
148e0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
148f0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  _info structure.
14900 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20    */.  pIdxInfo 
14910 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
14920 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
14930 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e  , sizeof(*pIdxIn
14940 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo).            
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
14960 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f   (sizeof(*pIdxCo
14970 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55  ns) + sizeof(*pU
14980 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20  sage))*nTerm.   
14990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149a0 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
149b0 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e  (*pIdxOrderBy)*n
149c0 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28  OrderBy );.  if(
149d0 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
149e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
149f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74  Msg(pParse, "out
14a00 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
14a10 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
14a20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
14a30 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
14a40 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
14a50 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
14a60 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20  e contains.  ** 
14a70 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74  many fields that
14a80 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63   are declared "c
14a90 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74  onst" to prevent
14aa0 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d   xBestIndex from
14ab0 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  .  ** changing t
14ac0 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f  hem.  We have to
14ad0 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63   do some funky c
14ae0 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20  asting in order 
14af0 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  to.  ** initiali
14b00 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e  ze those fields.
14b10 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73  .  */.  pIdxCons
14b20 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
14b30 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
14b40 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31  int*)&pIdxInfo[1
14b50 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79  ];.  pIdxOrderBy
14b60 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
14b70 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
14b80 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72  *)&pIdxCons[nTer
14b90 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28  m];.  pUsage = (
14ba0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
14bb0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
14bc0 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65  usage*)&pIdxOrde
14bd0 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20  rBy[nOrderBy];. 
14be0 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
14bf0 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->nConstraint =
14c00 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a   nTerm;.  *(int*
14c10 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  )&pIdxInfo->nOrd
14c20 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b  erBy = nOrderBy;
14c30 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
14c40 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
14c50 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
14c60 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->aConstraint = 
14c70 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74  pIdxCons;.  *(st
14c80 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14c90 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49  ex_orderby**)&pI
14ca0 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79  dxInfo->aOrderBy
14cb0 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a   = pIdxOrderBy;.
14cc0 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
14cd0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
14ce0 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64  int_usage**)&pId
14cf0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
14d00 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20  ntUsage =.      
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55 73               pUs
14d50 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d  age;..  for(i=j=
14d60 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
14d70 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
14d80 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
14d90 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66 28    u8 op;.    if(
14da0 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
14db0 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
14dc0 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
14dd0 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
14de0 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
14df0 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
14e00 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
14e10 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
14e20 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
14e30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
14e40 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
14e50 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
14e60 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
14e70 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
14e80 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69  _ISNULL) ) conti
14e90 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
14ea0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
14eb0 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
14ec0 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  nue;.    pIdxCon
14ed0 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  s[j].iColumn = p
14ee0 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
14ef0 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  mn;.    pIdxCons
14f00 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20  [j].iTermOffset 
14f10 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75  = i;.    op = (u
14f20 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  8)pTerm->eOperat
14f30 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20  or & WO_ALL;.   
14f40 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29   if( op==WO_IN )
14f50 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20   op = WO_EQ;.   
14f60 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
14f70 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65  = op;.    /* The
14f80 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65   direct assignme
14f90 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  nt in the previo
14fa0 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69  us line is possi
14fb0 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65  ble only because
14fc0 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20  .    ** the WO_ 
14fd0 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
14fe0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
14ff0 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
15000 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f  .  The.    ** fo
15010 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
15020 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
15030 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
15040 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
15050 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
15060 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
15070 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
15080 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
15090 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LT );.    asser
150a0 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
150b0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
150c0 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LE );.    asse
150d0 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
150e0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
150f0 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_GT );.    ass
15100 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49  ert( WO_GE==SQLI
15110 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
15120 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73  INT_GE );.    as
15130 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d  sert( WO_MATCH==
15140 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
15150 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b  STRAINT_MATCH );
15160 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
15170 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
15180 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f  (WO_IN|WO_EQ|WO_
15190 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
151a0 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
151b0 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
151c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
151d0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
151e0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
151f0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
15200 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  pr;.    pIdxOrde
15210 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
15220 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
15230 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
15240 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
15250 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
15260 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
15270 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a  rn pIdxInfo;.}..
15280 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
15290 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65  object reference
152a0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
152b0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
152c0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
152d0 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e  ** must represen
152e0 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
152f0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
15300 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65   invokes the xBe
15310 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74  stIndex().** met
15320 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
15330 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  al table with th
15340 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
15350 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  info object that
15360 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20  .** comes in as 
15370 74 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74  the 3rd argument
15380 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
15390 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  n..**.** If an e
153a0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61  rror occurs, pPa
153b0 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  rse is populated
153c0 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
153d0 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20  essage and a.** 
153e0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
153f0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
15400 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
15410 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74  rned and the out
15420 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74  put.** part of t
15430 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
15440 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
15450 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65  is left populate
15460 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
15470 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   or not an error
15480 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
15490 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
154a0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
154b0 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
154c0 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64  ually free p->id
154d0 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54  xStr if p->needT
154e0 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69  oFreeIdxStr indi
154f0 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  cates.** that th
15500 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  is is required..
15510 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
15520 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73  abBestIndex(Pars
15530 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
15540 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f   *pTab, sqlite3_
15550 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
15560 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
15570 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
15580 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d  etVTable(pParse-
15590 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61  >db, pTab)->pVta
155a0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
155b0 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49  t rc;..  TRACE_I
155c0 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
155d0 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
155e0 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
155f0 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
15600 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
15610 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
15620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
15630 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
15640 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MEM ){.      pPa
15650 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
15660 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
15670 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
15680 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
15690 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
156a0 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
156b0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
156c0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
156d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
156e0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
156f0 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
15700 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
15710 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
15720 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
15730 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
15740 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
15750 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
15760 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
15770 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
15780 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
15790 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
157a0 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
157b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
157c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
157d0 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
157e0 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
157f0 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
15800 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
15810 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
15820 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
15830 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23  Parse->nErr;.}.#
15840 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
15850 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
15860 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
15870 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15880 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a  NABLE_STAT3./*.*
15890 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
158a0 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72  ocation of a par
158b0 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e  ticular key amon
158c0 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e  g all keys in an
158d0 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72  .** index.  Stor
158e0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
158f0 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77   aStat as follow
15900 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61  s:.**.**    aSta
15910 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[0]      Est. n
15920 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65  umber of rows le
15930 73 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a 2a 20  ss than pVal.** 
15940 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20     aStat[1]     
15950 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
15960 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 56  rows equal to pV
15970 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  al.**.** Return 
15980 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
15990 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
159a0 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61 74  int whereKeyStat
159b0 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
159c0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
159d0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
159e0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  nection */.  Ind
159f0 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
15a00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
15a10 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f  x to consider do
15a20 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73 71 6c  main of */.  sql
15a30 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
15a40 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ,        /* Valu
15a50 65 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f  e to consider */
15a60 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20  .  int roundUp, 
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15a80 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72  * Round up if tr
15a90 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20  ue.  Round down 
15aa0 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52  if false */.  tR
15ab0 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20  owcnt *aStat    
15ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
15ad0 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20  : stats written 
15ae0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 74 52 6f  here */.){.  tRo
15af0 77 63 6e 74 20 6e 3b 0a 20 20 49 6e 64 65 78 53  wcnt n;.  IndexS
15b00 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 3b 0a  ample *aSample;.
15b10 20 20 69 6e 74 20 69 2c 20 65 54 79 70 65 3b 0a    int i, eType;.
15b20 20 20 69 6e 74 20 69 73 45 71 20 3d 20 30 3b 0a    int isEq = 0;.
15b30 20 20 69 36 34 20 76 3b 0a 20 20 64 6f 75 62 6c    i64 v;.  doubl
15b40 65 20 72 2c 20 72 53 3b 0a 0a 20 20 61 73 73 65  e r, rS;..  asse
15b50 72 74 28 20 72 6f 75 6e 64 55 70 3d 3d 30 20 7c  rt( roundUp==0 |
15b60 7c 20 72 6f 75 6e 64 55 70 3d 3d 31 20 29 3b 0a  | roundUp==1 );.
15b70 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
15b80 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 69  nSample>0 );.  i
15b90 66 28 20 70 56 61 6c 3d 3d 30 20 29 20 72 65 74  f( pVal==0 ) ret
15ba0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
15bb0 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e 61 69  ;.  n = pIdx->ai
15bc0 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 61 53 61  RowEst[0];.  aSa
15bd0 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61  mple = pIdx->aSa
15be0 6d 70 6c 65 3b 0a 20 20 65 54 79 70 65 20 3d 20  mple;.  eType = 
15bf0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
15c00 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28  pe(pVal);..  if(
15c10 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49   eType==SQLITE_I
15c20 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 76 20  NTEGER ){.    v 
15c30 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
15c40 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a 20 20 20  int64(pVal);.   
15c50 20 72 20 3d 20 28 69 36 34 29 76 3b 0a 20 20 20   r = (i64)v;.   
15c60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
15c70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
15c80 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
15c90 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
15ca0 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  ITE_NULL ) conti
15cb0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61  nue;.      if( a
15cc0 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e  Sample[i].eType>
15cd0 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62  =SQLITE_TEXT ) b
15ce0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
15cf0 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
15d00 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
15d10 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
15d20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3e 3d  aSample[i].u.i>=
15d30 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  v ){.          i
15d40 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  sEq = aSample[i]
15d50 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20 20 20 20 20  .u.i==v;.       
15d60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
15d70 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
15d80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15d90 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
15da0 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20  e==SQLITE_FLOAT 
15db0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
15dc0 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 3d 72  Sample[i].u.r>=r
15dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
15de0 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  Eq = aSample[i].
15df0 75 2e 72 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20  u.r==r;.        
15e00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15e10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
15e20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54 79  .  }else if( eTy
15e30 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54  pe==SQLITE_FLOAT
15e40 20 29 7b 0a 20 20 20 20 72 20 3d 20 73 71 6c 69   ){.    r = sqli
15e50 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
15e60 28 70 56 61 6c 29 3b 0a 20 20 20 20 66 6f 72 28  (pVal);.    for(
15e70 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61  i=0; i<pIdx->nSa
15e80 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
15e90 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
15ea0 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e  .eType==SQLITE_N
15eb0 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
15ec0 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
15ed0 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49  e[i].eType>=SQLI
15ee0 54 45 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b  TE_TEXT ) break;
15ef0 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
15f00 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
15f10 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  ITE_FLOAT ){.   
15f20 20 20 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c       rS = aSampl
15f30 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20 20 20 20  e[i].u.r;.      
15f40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
15f50 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  S = aSample[i].u
15f60 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  .i;.      }.    
15f70 20 20 69 66 28 20 72 53 3e 3d 72 20 29 7b 0a 20    if( rS>=r ){. 
15f80 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 72 53         isEq = rS
15f90 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ==r;.        bre
15fa0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
15fb0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54  }.  }else if( eT
15fc0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ype==SQLITE_NULL
15fd0 20 29 7b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20   ){.    i = 0;. 
15fe0 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 30     if( aSample[0
15ff0 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ].eType==SQLITE_
16000 4e 55 4c 4c 20 29 20 69 73 45 71 20 3d 20 31 3b  NULL ) isEq = 1;
16010 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
16020 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
16030 49 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79 70  ITE_TEXT || eTyp
16040 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
16050 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
16060 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
16070 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
16080 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
16090 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c  ==SQLITE_TEXT ||
160a0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
160b0 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
160c0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
160d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
160e0 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e     if( i<pIdx->n
160f0 53 61 6d 70 6c 65 20 29 7b 20 20 20 20 20 20 0a  Sample ){      .
16100 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
16110 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
16120 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
16130 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 73  Coll;.      cons
16140 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 20 69  t u8 *z;.      i
16150 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
16160 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20  _BLOB ){.       
16170 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a   z = (const u8 *
16180 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
16190 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20 20 20  lob(pVal);.     
161a0 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70     pColl = db->p
161b0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
161c0 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 2d    assert( pColl-
161d0 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
161e0 38 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  8 );.      }else
161f0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
16200 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
16210 53 65 71 28 70 50 61 72 73 65 2c 20 53 51 4c 49  Seq(pParse, SQLI
16220 54 45 5f 55 54 46 38 2c 20 30 2c 20 2a 70 49 64  TE_UTF8, 0, *pId
16230 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  x->azColl);.    
16240 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
16250 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
16260 20 77 61 73 20 75 6e 61 76 61 69 6c 61 62 6c 65   was unavailable
16270 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65  , we should have
16280 20 66 61 69 6c 65 64 0a 20 20 20 20 20 20 20 20   failed.        
16290 2a 2a 20 6c 6f 6e 67 20 61 67 6f 20 61 6e 64 20  ** long ago and 
162a0 6e 65 76 65 72 20 72 65 61 63 68 65 64 20 74 68  never reached th
162b0 69 73 20 70 6f 69 6e 74 2e 20 20 42 75 74 20 77  is point.  But w
162c0 65 27 6c 6c 20 63 68 65 63 6b 20 6a 75 73 74 20  e'll check just 
162d0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  to.        ** be
162e0 20 64 6f 75 62 6c 79 20 73 75 72 65 2e 20 2a 2f   doubly sure. */
162f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56  .        if( NEV
16300 45 52 28 70 43 6f 6c 6c 3d 3d 30 29 20 29 20 72  ER(pColl==0) ) r
16310 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
16320 4f 52 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20  OR;.        z = 
16330 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69  (const u8 *)sqli
16340 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
16350 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  l, pColl->enc);.
16360 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 20 29          if( !z )
16370 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
16380 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
16390 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
163a0 20 20 20 61 73 73 65 72 74 28 20 7a 20 26 26 20     assert( z && 
163b0 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e  pColl && pColl->
163c0 78 43 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d 0a  xCmp );.      }.
163d0 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
163e0 33 56 61 6c 75 65 42 79 74 65 73 28 70 56 61 6c  3ValueBytes(pVal
163f0 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
16400 20 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3c   .      for(; i<
16410 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69  pIdx->nSample; i
16420 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
16430 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   c;.        int 
16440 65 53 61 6d 70 6c 65 74 79 70 65 20 3d 20 61 53  eSampletype = aS
16450 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3b 0a  ample[i].eType;.
16460 20 20 20 20 20 20 20 20 69 66 28 20 65 53 61 6d          if( eSam
16470 70 6c 65 74 79 70 65 3c 65 54 79 70 65 20 29 20  pletype<eType ) 
16480 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
16490 20 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79 70    if( eSampletyp
164a0 65 21 3d 65 54 79 70 65 20 29 20 62 72 65 61 6b  e!=eType ) break
164b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
164c0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
164d0 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 2d 3e 65      if( pColl->e
164e0 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc!=SQLITE_UTF8 
164f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
16500 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20   nSample;.      
16510 20 20 20 20 63 68 61 72 20 2a 7a 53 61 6d 70 6c      char *zSampl
16520 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 74  e = sqlite3Utf8t
16530 6f 31 36 28 0a 20 20 20 20 20 20 20 20 20 20 20  o16(.           
16540 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e     db, pColl->en
16550 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  c, aSample[i].u.
16560 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42  z, aSample[i].nB
16570 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65 0a 20 20  yte, &nSample.  
16580 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
16590 20 20 20 20 20 69 66 28 20 21 7a 53 61 6d 70 6c       if( !zSampl
165a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
165b0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
165c0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
165d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
165e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
165f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16600 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78      c = pColl->x
16610 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
16620 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53 61 6d 70  , nSample, zSamp
16630 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20  le, n, z);.     
16640 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
16650 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c 65 29 3b  ee(db, zSample);
16660 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
16670 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
16680 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43            c = pC
16690 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
166a0 3e 70 55 73 65 72 2c 20 61 53 61 6d 70 6c 65 5b  >pUser, aSample[
166b0 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61 6d 70 6c  i].nByte, aSampl
166c0 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b  e[i].u.z, n, z);
166d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
166e0 20 20 20 69 66 28 20 63 3e 3d 30 20 29 7b 0a 20     if( c>=0 ){. 
166f0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
16700 30 20 29 20 69 73 45 71 20 3d 20 31 3b 0a 20 20  0 ) isEq = 1;.  
16710 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16730 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16740 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
16750 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68  aSample[i] is th
16760 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74  e first sample t
16770 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
16780 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61  han.  ** or equa
16790 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69  l to pVal.  Or i
167a0 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  f i==pIdx->nSamp
167b0 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d  le, then all sam
167c0 70 6c 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20  ples are less.  
167d0 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49  ** than pVal.  I
167e0 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56  f aSample[i]==pV
167f0 61 6c 2c 20 74 68 65 6e 20 69 73 45 71 3d 3d 31  al, then isEq==1
16800 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45  ..  */.  if( isE
16810 71 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  q ){.    assert(
16820 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
16830 20 29 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d   );.    aStat[0]
16840 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c   = aSample[i].nL
16850 74 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  t;.    aStat[1] 
16860 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 45 71  = aSample[i].nEq
16870 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
16880 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69  Rowcnt iLower, i
16890 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20  Upper, iGap;.   
168a0 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
168b0 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     iLower = 0;. 
168c0 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 53       iUpper = aS
168d0 61 6d 70 6c 65 5b 30 5d 2e 6e 4c 74 3b 0a 20 20  ample[0].nLt;.  
168e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
168f0 55 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d  Upper = i>=pIdx-
16900 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 20 3a 20 61  >nSample ? n : a
16910 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20  Sample[i].nLt;. 
16920 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53       iLower = aS
16930 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 45 71 20 2b  ample[i-1].nEq +
16940 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 4c   aSample[i-1].nL
16950 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74  t;.    }.    aSt
16960 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 76  at[1] = pIdx->av
16970 67 45 71 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f  gEq;.    if( iLo
16980 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20  wer>=iUpper ){. 
16990 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20       iGap = 0;. 
169a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
169b0 69 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20  iGap = iUpper - 
169c0 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20  iLower;.    }.  
169d0 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b    if( roundUp ){
169e0 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 28 69  .      iGap = (i
169f0 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65  Gap*2)/3;.    }e
16a00 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
16a10 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a  = iGap/3;.    }.
16a20 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69      aStat[0] = i
16a30 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20  Lower + iGap;.  
16a40 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
16a50 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
16a60 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
16a70 53 54 41 54 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT3 */../*.** 
16a80 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  If expression pE
16a90 78 70 72 20 72 65 70 72 65 73 65 6e 74 73 20 61  xpr represents a
16aa0 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 2c 20   literal value, 
16ab0 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74  set *pp to point
16ac0 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74 65   to.** an sqlite
16ad0 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
16ae0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
16af0 20 73 61 6d 65 20 76 61 6c 75 65 2c 20 77 69 74   same value, wit
16b00 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 66  h affinity.** af
16b10 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c  f applied to it,
16b20 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
16b30 67 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  g. It is the res
16b40 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
16b50 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  he .** caller to
16b60 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
16b70 61 73 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ase this structu
16b80 72 65 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  re by passing it
16b90 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
16ba0 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a  alueFree()..**.*
16bb0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
16bc0 20 70 61 72 73 65 20 69 73 20 61 20 72 65 63 6f   parse is a reco
16bd0 6d 70 69 6c 65 20 28 73 71 6c 69 74 65 33 52 65  mpile (sqlite3Re
16be0 70 72 65 70 61 72 65 28 29 29 20 61 6e 64 20 70  prepare()) and p
16bf0 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53 51  Expr.** is an SQ
16c00 4c 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20  L variable that 
16c10 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 20  currently has a 
16c20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 62  non-NULL value b
16c30 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20 63  ound to it,.** c
16c40 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33  reate an sqlite3
16c50 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
16c60 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
16c70 20 76 61 6c 75 65 2c 20 61 67 61 69 6e 20 77 69   value, again wi
16c80 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 61  th.** affinity a
16c90 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74  ff applied to it
16ca0 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  , instead..**.**
16cb0 20 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20 74   If neither of t
16cc0 68 65 20 61 62 6f 76 65 20 61 70 70 6c 79 2c 20  he above apply, 
16cd0 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e  set *pp to NULL.
16ce0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
16cf0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
16d00 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
16d10 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
16d20 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66  TE_OK..*/.#ifdef
16d30 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
16d40 54 41 54 33 0a 73 74 61 74 69 63 20 69 6e 74 20  TAT3.static int 
16d50 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a 20  valueFromExpr(. 
16d60 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
16d70 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
16d80 0a 20 20 75 38 20 61 66 66 2c 20 0a 20 20 73 71  .  u8 aff, .  sq
16d90 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70  lite3_value **pp
16da0 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  .){.  if( pExpr-
16db0 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45  >op==TK_VARIABLE
16dc0 0a 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f  .   || (pExpr->o
16dd0 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
16de0 26 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b  & pExpr->op2==TK
16df0 5f 56 41 52 49 41 42 4c 45 29 0a 20 20 29 7b 0a  _VARIABLE).  ){.
16e00 20 20 20 20 69 6e 74 20 69 56 61 72 20 3d 20 70      int iVar = p
16e10 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
16e20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
16e30 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d  tVarmask(pParse-
16e40 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20  >pVdbe, iVar);. 
16e50 20 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33     *pp = sqlite3
16e60 56 64 62 65 47 65 74 56 61 6c 75 65 28 70 50 61  VdbeGetValue(pPa
16e70 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c  rse->pReprepare,
16e80 20 69 56 61 72 2c 20 61 66 66 29 3b 0a 20 20 20   iVar, aff);.   
16e90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16ea0 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
16eb0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d  sqlite3ValueFrom
16ec0 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
16ed0 20 70 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55   pExpr, SQLITE_U
16ee0 54 46 38 2c 20 61 66 66 2c 20 70 70 29 3b 0a 7d  TF8, aff, pp);.}
16ef0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
16f00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16f10 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65  used to estimate
16f20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16f30 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
16f40 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73   visited.** by s
16f50 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78  canning an index
16f60 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20   for a range of 
16f70 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67  values. The rang
16f80 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70  e may have an up
16f90 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20  per.** bound, a 
16fa0 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20  lower bound, or 
16fb0 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20  both. The WHERE 
16fc0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
16fd0 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a  t set the upper.
16fe0 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75  ** and lower bou
16ff0 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e  nds are represen
17000 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e  ted by pLower an
17010 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
17020 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78  ively. For.** ex
17030 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20  ample, assuming 
17040 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20  that index p is 
17050 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20  on t1(a):.**.** 
17060 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
17070 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20  ERE a > ? AND a 
17080 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  < ? ....**      
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f                |_
170a0 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a  ____|   |_____|.
170b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
170c0 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
170d0 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
170e0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77              pLow
170f0 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a  er    pUpper.**.
17100 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  ** If either of 
17110 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77  the upper or low
17120 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20  er bound is not 
17130 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55  present, then NU
17140 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a  LL is passed in.
17150 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  ** place of the 
17160 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
17170 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54  ereTerm..**.** T
17180 68 65 20 6e 45 71 20 70 61 72 61 6d 65 74 65 72  he nEq parameter
17190 20 69 73 20 70 61 73 73 65 64 20 74 68 65 20 69   is passed the i
171a0 6e 64 65 78 20 6f 66 20 74 68 65 20 69 6e 64 65  ndex of the inde
171b0 78 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74  x column subject
171c0 20 74 6f 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65   to the.** range
171d0 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c   constraint. Or,
171e0 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74   equivalently, t
171f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 71 75  he number of equ
17200 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
17210 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 20 62  s.** optimized b
17220 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69  y the proposed i
17230 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65  ndex scan. For e
17240 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67  xample, assuming
17250 20 69 6e 64 65 78 20 70 20 69 73 0a 2a 2a 20 6f   index p is.** o
17260 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20  n t1(a, b), and 
17270 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 73  the SQL query is
17280 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
17290 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20  OM t1 WHERE a = 
172a0 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20  ? AND b > ? AND 
172b0 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  b < ? ....**.** 
172c0 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20  then nEq should 
172d0 62 65 20 70 61 73 73 65 64 20 74 68 65 20 76 61  be passed the va
172e0 6c 75 65 20 31 20 28 61 73 20 74 68 65 20 72 61  lue 1 (as the ra
172f0 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20 63  nge restricted c
17300 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20  olumn,.** b, is 
17310 74 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d  the second left-
17320 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  most column of t
17330 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69  he index). Or, i
17340 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a  f the query is:.
17350 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
17360 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
17370 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
17380 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f  .** then nEq sho
17390 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 30 2e  uld be passed 0.
173a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
173b0 6e 65 64 20 76 61 6c 75 65 20 69 73 20 61 6e 20  ned value is an 
173c0 69 6e 74 65 67 65 72 20 64 69 76 69 73 6f 72 20  integer divisor 
173d0 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 65 73  to reduce the es
173e0 74 69 6d 61 74 65 64 0a 2a 2a 20 73 65 61 72 63  timated.** searc
173f0 68 20 73 70 61 63 65 2e 20 20 41 20 72 65 74 75  h space.  A retu
17400 72 6e 20 76 61 6c 75 65 20 6f 66 20 31 20 6d 65  rn value of 1 me
17410 61 6e 73 20 74 68 61 74 20 72 61 6e 67 65 20 63  ans that range c
17420 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 2a  onstraints are.*
17430 2a 20 6e 6f 20 68 65 6c 70 20 61 74 20 61 6c 6c  * no help at all
17440 2e 20 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75  .  A return valu
17450 65 20 6f 66 20 32 20 6d 65 61 6e 73 20 72 61 6e  e of 2 means ran
17460 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ge constraints a
17470 72 65 0a 2a 2a 20 65 78 70 65 63 74 65 64 20 74  re.** expected t
17480 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61  o reduce the sea
17490 72 63 68 20 73 70 61 63 65 20 62 79 20 68 61 6c  rch space by hal
174a0 66 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  f.  And so forth
174b0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ....**.** In the
174c0 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69   absence of sqli
174d0 74 65 5f 73 74 61 74 33 20 41 4e 41 4c 59 5a 45  te_stat3 ANALYZE
174e0 20 64 61 74 61 2c 20 65 61 63 68 20 72 61 6e 67   data, each rang
174f0 65 20 69 6e 65 71 75 61 6c 69 74 79 0a 2a 2a 20  e inequality.** 
17500 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
17510 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61  ch space by a fa
17520 63 74 6f 72 20 6f 66 20 34 2e 20 20 48 65 6e 63  ctor of 4.  Henc
17530 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  e a single const
17540 72 61 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20 72  raint (x>?).** r
17550 65 73 75 6c 74 73 20 69 6e 20 61 20 72 65 74 75  esults in a retu
17560 72 6e 20 6f 66 20 34 20 61 6e 64 20 61 20 72 61  rn of 4 and a ra
17570 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  nge constraint (
17580 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 73  x>? AND x<?) res
17590 75 6c 74 73 0a 2a 2a 20 69 6e 20 61 20 72 65 74  ults.** in a ret
175a0 75 72 6e 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74  urn of 16..*/.st
175b0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61  atic int whereRa
175c0 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61  ngeScanEst(.  Pa
175d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
175e0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
175f0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
17600 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
17610 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
17620 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 63    /* The index c
17630 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 61  ontaining the ra
17640 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c  nge-compared col
17650 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20 20 69 6e  umn; "x" */.  in
17660 74 20 6e 45 71 2c 20 20 20 20 20 20 20 20 20 20  t nEq,          
17670 20 20 20 2f 2a 20 69 6e 64 65 78 20 69 6e 74 6f     /* index into
17680 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74 68   p->aCol[] of th
17690 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64  e range-compared
176a0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65   column */.  Whe
176b0 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20  reTerm *pLower, 
176c0 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64    /* Lower bound
176d0 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
176e0 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74  x: "x>123" Might
176f0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
17700 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c  ereTerm *pUpper,
17710 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e     /* Upper boun
17720 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
17730 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68  ex: "x<455" Migh
17740 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
17750 68 65 72 65 43 6f 73 74 20 2a 70 52 61 6e 67 65  hereCost *pRange
17760 44 69 76 20 2f 2a 20 4f 55 54 3a 20 52 65 64 75  Div /* OUT: Redu
17770 63 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  ce search space 
17780 62 79 20 74 68 69 73 20 64 69 76 69 73 6f 72 20  by this divisor 
17790 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
177a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66   SQLITE_OK;..#if
177b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
177c0 45 5f 53 54 41 54 33 0a 0a 20 20 69 66 28 20 6e  E_STAT3..  if( n
177d0 45 71 3d 3d 30 20 26 26 20 70 2d 3e 6e 53 61 6d  Eq==0 && p->nSam
177e0 70 6c 65 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  ple && Optimizat
177f0 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73  ionEnabled(pPars
17800 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 53 74  e->db, SQLITE_St
17810 61 74 33 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  at3) ){.    sqli
17820 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 61 6e 67  te3_value *pRang
17830 65 56 61 6c 3b 0a 20 20 20 20 74 52 6f 77 63 6e  eVal;.    tRowcn
17840 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20  t iLower = 0;.  
17850 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72    tRowcnt iUpper
17860 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30   = p->aiRowEst[0
17870 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 61  ];.    tRowcnt a
17880 5b 32 5d 3b 0a 20 20 20 20 75 38 20 61 66 66 20  [2];.    u8 aff 
17890 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  = p->pTable->aCo
178a0 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  l[p->aiColumn[0]
178b0 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 0a 20 20 20  ].affinity;..   
178c0 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
178d0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
178e0 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72   = pLower->pExpr
178f0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
17900 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78  rc = valueFromEx
17910 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  pr(pParse, pExpr
17920 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56 61  , aff, &pRangeVa
17930 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
17940 28 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72  ( (pLower->eOper
17950 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f  ator & (WO_GT|WO
17960 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  _GE))!=0 );.    
17970 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17980 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77 68  _OK.       && wh
17990 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
179a0 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61 6c  se, p, pRangeVal
179b0 2c 20 30 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f  , 0, a)==SQLITE_
179c0 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  OK.      ){.    
179d0 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30      iLower = a[0
179e0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ];.        if( (
179f0 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
17a00 72 20 26 20 57 4f 5f 47 54 29 21 3d 30 20 29 20  r & WO_GT)!=0 ) 
17a10 69 4c 6f 77 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a  iLower += a[1];.
17a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
17a30 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
17a40 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d  RangeVal);.    }
17a50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17a60 49 54 45 5f 4f 4b 20 26 26 20 70 55 70 70 65 72  ITE_OK && pUpper
17a70 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
17a80 70 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e  pExpr = pUpper->
17a90 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
17aa0 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46       rc = valueF
17ab0 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20  romExpr(pParse, 
17ac0 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 52 61  pExpr, aff, &pRa
17ad0 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 20 20 61  ngeVal);.      a
17ae0 73 73 65 72 74 28 20 28 70 55 70 70 65 72 2d 3e  ssert( (pUpper->
17af0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
17b00 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b  LT|WO_LE))!=0 );
17b10 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
17b20 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
17b30 26 26 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  && whereKeyStats
17b40 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 61 6e  (pParse, p, pRan
17b50 67 65 56 61 6c 2c 20 31 2c 20 61 29 3d 3d 53 51  geVal, 1, a)==SQ
17b60 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29 7b  LITE_OK.      ){
17b70 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
17b80 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  = a[0];.        
17b90 69 66 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70  if( (pUpper->eOp
17ba0 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21  erator & WO_LE)!
17bb0 3d 30 20 29 20 69 55 70 70 65 72 20 2b 3d 20 61  =0 ) iUpper += a
17bc0 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [1];.      }.   
17bd0 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
17be0 72 65 65 28 70 52 61 6e 67 65 56 61 6c 29 3b 0a  ree(pRangeVal);.
17bf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
17c00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17c10 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 69       WhereCost i
17c20 42 61 73 65 20 3d 20 77 68 65 72 65 43 6f 73 74  Base = whereCost
17c30 28 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29  (p->aiRowEst[0])
17c40 3b 0a 20 20 20 20 20 20 69 66 28 20 69 55 70 70  ;.      if( iUpp
17c50 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20  er>iLower ){.   
17c60 20 20 20 20 20 69 42 61 73 65 20 2d 3d 20 77 68       iBase -= wh
17c70 65 72 65 43 6f 73 74 28 69 55 70 70 65 72 20 2d  ereCost(iUpper -
17c80 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20   iLower);.      
17c90 7d 0a 20 20 20 20 20 20 2a 70 52 61 6e 67 65 44  }.      *pRangeD
17ca0 69 76 20 3d 20 69 42 61 73 65 3b 0a 20 20 20 20  iv = iBase;.    
17cb0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
17cc0 30 30 2c 20 28 22 72 61 6e 67 65 20 73 63 61 6e  00, ("range scan
17cd0 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75   regions: %u..%u
17ce0 20 20 64 69 76 3d 25 64 5c 6e 22 2c 0a 20 20 20    div=%d\n",.   
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d00 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65        (u32)iLowe
17d10 72 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20  r, (u32)iUpper, 
17d20 2a 70 52 61 6e 67 65 44 69 76 29 29 3b 0a 20 20  *pRangeDiv));.  
17d30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17d40 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
17d50 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
17d60 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
17d70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
17d80 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45  ETER(p);.  UNUSE
17d90 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 45 71 29  D_PARAMETER(nEq)
17da0 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
17db0 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
17dc0 70 65 72 20 29 3b 0a 20 20 2a 70 52 61 6e 67 65  per );.  *pRange
17dd0 44 69 76 20 3d 20 30 3b 0a 20 20 2f 2a 20 54 55  Div = 0;.  /* TU
17de0 4e 49 4e 47 3a 20 20 45 61 63 68 20 69 6e 65 71  NING:  Each ineq
17df0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
17e00 74 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  t reduces the se
17e10 61 72 63 68 20 73 70 61 63 65 20 34 2d 66 6f 6c  arch space 4-fol
17e20 64 2e 0a 20 20 2a 2a 20 41 20 42 45 54 57 45 45  d..  ** A BETWEE
17e30 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 72  N operator, ther
17e40 65 66 6f 72 65 2c 20 72 65 64 75 63 65 73 20 74  efore, reduces t
17e50 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
17e60 31 36 2d 66 6f 6c 64 20 2a 2f 0a 20 20 69 66 28  16-fold */.  if(
17e70 20 70 4c 6f 77 65 72 20 26 26 20 28 70 4c 6f 77   pLower && (pLow
17e80 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  er->wtFlags & TE
17e90 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  RM_VNULL)==0 ){.
17ea0 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 2b      *pRangeDiv +
17eb0 3d 20 32 30 3b 20 20 61 73 73 65 72 74 28 20 32  = 20;  assert( 2
17ec0 30 3d 3d 77 68 65 72 65 43 6f 73 74 28 34 29 20  0==whereCost(4) 
17ed0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70  );.  }.  if( pUp
17ee0 70 65 72 20 29 7b 0a 20 20 20 20 2a 70 52 61 6e  per ){.    *pRan
17ef0 67 65 44 69 76 20 2b 3d 20 32 30 3b 20 20 61 73  geDiv += 20;  as
17f00 73 65 72 74 28 20 32 30 3d 3d 77 68 65 72 65 43  sert( 20==whereC
17f10 6f 73 74 28 34 29 20 29 3b 0a 20 20 7d 0a 20 20  ost(4) );.  }.  
17f20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
17f30 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
17f40 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45  LE_STAT3./*.** E
17f50 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
17f60 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
17f70 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
17f80 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
17f90 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
17fa0 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20  int x=VALUE and 
17fb0 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45  where that VALUE
17fc0 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68   occurs in.** th
17fd0 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  e histogram data
17fe0 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72  .  This only wor
17ff0 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65  ks when x is the
18000 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f   left-most.** co
18010 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78  lumn of an index
18020 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74   and sqlite_stat
18030 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
18040 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   is available.**
18050 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e   for that index.
18060 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55    When pExpr==NU
18070 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  LL that means th
18080 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a  e constraint is.
18090 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69  ** "x IS NULL" i
180a0 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c  nstead of "x=VAL
180b0 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  UE"..**.** Write
180c0 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72   the estimated r
180d0 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70  ow count into *p
180e0 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20  nRow and return 
180f0 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49  SQLITE_OK. .** I
18100 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  f unable to make
18110 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65   an estimate, le
18120 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61  ave *pnRow uncha
18130 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  nged and return.
18140 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  ** non-zero..**.
18150 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18160 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69  can fail if it i
18170 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64  s unable to load
18180 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
18190 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65  uence.** require
181a0 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d  d for string com
181b0 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75  parison, or if u
181c0 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
181d0 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20  e memory.** for 
181e0 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e  a UTF conversion
181f0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
18200 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65  mparison.  The e
18210 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a  rror is stored.*
18220 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  * in the pParse 
18230 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
18240 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71  atic int whereEq
18250 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61  ualScanEst(.  Pa
18260 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
18270 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
18280 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
18290 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
182a0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
182b0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
182c0 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63  hose left-most c
182d0 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a  olumn is pTerm *
182e0 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
182f0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
18300 65 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45  ession for VALUE
18310 20 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20   in the x=VALUE 
18320 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
18330 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20  tRowcnt *pnRow  
18340 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
18350 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73  e revised row es
18360 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29  timate here */.)
18370 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  {.  sqlite3_valu
18380 65 20 2a 70 52 68 73 20 3d 20 30 3b 20 20 2f 2a  e *pRhs = 0;  /*
18390 20 56 41 4c 55 45 20 6f 6e 20 72 69 67 68 74 2d   VALUE on right-
183a0 68 61 6e 64 20 73 69 64 65 20 6f 66 20 70 54 65  hand side of pTe
183b0 72 6d 20 2a 2f 0a 20 20 75 38 20 61 66 66 3b 20  rm */.  u8 aff; 
183c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183d0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69    /* Column affi
183e0 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nity */.  int rc
183f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18400 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
18410 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
18420 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d  /.  tRowcnt a[2]
18430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18440 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 0a   Statistics */..
18450 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
18460 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  mple!=0 );.  ass
18470 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e  ert( p->nSample>
18480 30 20 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d 3e  0 );.  aff = p->
18490 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e  pTable->aCol[p->
184a0 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66  aiColumn[0]].aff
184b0 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 70 45 78  inity;.  if( pEx
184c0 70 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 76  pr ){.    rc = v
184d0 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
184e0 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  rse, pExpr, aff,
184f0 20 26 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28   &pRhs);.    if(
18500 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65   rc ) goto where
18510 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e  EqualScanEst_can
18520 63 65 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cel;.  }else{.  
18530 20 20 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33    pRhs = sqlite3
18540 56 61 6c 75 65 4e 65 77 28 70 50 61 72 73 65 2d  ValueNew(pParse-
18550 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >db);.  }.  if( 
18560 70 52 68 73 3d 3d 30 20 29 20 72 65 74 75 72 6e  pRhs==0 ) return
18570 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
18580 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4b 65  ;.  rc = whereKe
18590 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
185a0 2c 20 70 52 68 73 2c 20 30 2c 20 61 29 3b 0a 20  , pRhs, 0, a);. 
185b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
185c0 4f 4b 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54  OK ){.    WHERET
185d0 52 41 43 45 28 30 78 31 30 30 2c 28 22 65 71 75  RACE(0x100,("equ
185e0 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f  ality scan regio
185f0 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29  ns: %d\n", (int)
18600 61 5b 31 5d 29 29 3b 0a 20 20 20 20 2a 70 6e 52  a[1]));.    *pnR
18610 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 7d 0a 77  ow = a[1];.  }.w
18620 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
18630 5f 63 61 6e 63 65 6c 3a 0a 20 20 73 71 6c 69 74  _cancel:.  sqlit
18640 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 68 73  e3ValueFree(pRhs
18650 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18660 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
18670 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
18680 45 5f 53 54 41 54 33 29 20 2a 2f 0a 0a 23 69 66  E_STAT3) */..#if
18690 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
186a0 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73  E_STAT3./*.** Es
186b0 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
186c0 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
186d0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
186e0 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49  based on.** an I
186f0 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65  N constraint whe
18700 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  re the right-han
18710 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
18720 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
18730 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  a list of values
18740 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
18750 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20 78  *        WHERE x
18760 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a   IN (1,2,3,4).**
18770 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73  .** Write the es
18780 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e  timated row coun
18790 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e  t into *pnRow an
187a0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
187b0 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c  OK. .** If unabl
187c0 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74  e to make an est
187d0 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e  imate, leave *pn
187e0 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  Row unchanged an
187f0 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
18800 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  zero..**.** This
18810 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69   routine can fai
18820 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c  l if it is unabl
18830 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c  e to load a coll
18840 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a  ating sequence.*
18850 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  * required for s
18860 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e  tring comparison
18870 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74  , or if unable t
18880 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
18890 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63  y.** for a UTF c
188a0 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72  onversion requir
188b0 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ed for compariso
188c0 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73  n.  The error is
188d0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
188e0 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
188f0 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
18900 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74  t whereInScanEst
18910 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
18920 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
18930 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
18940 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
18950 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  .  Index *p,    
18960 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
18970 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66 74 2d  ndex whose left-
18980 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70  most column is p
18990 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 4c 69  Term */.  ExprLi
189a0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
189b0 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74  * The value list
189c0 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22   on the RHS of "
189d0 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e  x IN (v1,v2,v3,.
189e0 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  ..)" */.  tRowcn
189f0 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
18a00 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
18a10 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
18a20 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
18a30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18a40 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63  ;     /* Subfunc
18a50 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65  tion return code
18a60 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45   */.  tRowcnt nE
18a70 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
18a80 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
18a90 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72  for a single ter
18aa0 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  m */.  tRowcnt n
18ab0 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f  RowEst = 0;    /
18ac0 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f  * New estimate o
18ad0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
18ae0 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rows */.  int i;
18af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b00 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
18b10 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
18b20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b  p->aSample!=0 );
18b30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
18b40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
18b50 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
18b60 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70 2d  ){.    nEst = p-
18b70 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20  >aiRowEst[0];.  
18b80 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
18b90 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
18ba0 20 70 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e   p, pList->a[i].
18bb0 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20  pExpr, &nEst);. 
18bc0 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45     nRowEst += nE
18bd0 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  st;.  }.  if( rc
18be0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18bf0 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e     if( nRowEst >
18c00 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20   p->aiRowEst[0] 
18c10 29 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61  ) nRowEst = p->a
18c20 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20  iRowEst[0];.    
18c30 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74  *pnRow = nRowEst
18c40 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
18c50 28 30 78 31 30 30 2c 28 22 49 4e 20 72 6f 77 20  (0x100,("IN row 
18c60 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 67  estimate: est=%g
18c70 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a  \n", nRowEst));.
18c80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18c90 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  .}.#endif /* def
18ca0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
18cb0 4c 45 5f 53 54 41 54 33 29 20 2a 2f 0a 0a 2f 2a  LE_STAT3) */../*
18cc0 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65  .** Disable a te
18cd0 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
18ce0 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c  clause.  Except,
18cf0 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20   do not disable 
18d00 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69  the term.** if i
18d10 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46  t controls a LEF
18d20 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64  T OUTER JOIN and
18d30 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67   it did not orig
18d40 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a  inate in the ON.
18d50 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ** or USING clau
18d60 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e  se of that join.
18d70 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20  .**.** Consider 
18d80 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f  the term t2.z='o
18d90 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  k' in the follow
18da0 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a  ing queries:.**.
18db0 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54  **   (1)  SELECT
18dc0 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
18dd0 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
18de0 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d  t2.x WHERE t2.z=
18df0 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53  'ok'.**   (2)  S
18e00 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
18e10 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
18e20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
18e30 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29  .z='ok'.**   (3)
18e40 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
18e50 74 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e  t1, t2 WHERE t1.
18e60 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
18e70 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  'ok'.**.** The t
18e80 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61  2.z='ok' is disa
18e90 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28  bled in the in (
18ea0 32 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72  2) because it or
18eb0 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74  iginates.** in t
18ec0 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54  he ON clause.  T
18ed0 68 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62  he term is disab
18ee0 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75  led in (3) becau
18ef0 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72  se it is not par
18f00 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f  t.** of a LEFT O
18f10 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28  UTER JOIN.  In (
18f20 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20  1), the term is 
18f30 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a  not disabled..**
18f40 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49  .** IMPLEMENTATI
18f50 4f 4e 2d 4f 46 3a 20 52 2d 32 34 35 39 37 2d 35  ON-OF: R-24597-5
18f60 38 36 35 35 20 4e 6f 20 74 65 73 74 73 20 61 72  8655 No tests ar
18f70 65 20 64 6f 6e 65 20 66 6f 72 20 74 65 72 6d 73  e done for terms
18f80 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 6f 6d   that are.** com
18f90 70 6c 65 74 65 6c 79 20 73 61 74 69 73 66 69 65  pletely satisfie
18fa0 64 20 62 79 20 69 6e 64 69 63 65 73 2e 0a 2a 2a  d by indices..**
18fb0 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20  .** Disabling a 
18fc0 74 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74  term causes that
18fd0 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20   term to not be 
18fe0 74 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e  tested in the in
18ff0 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74  ner loop.** of t
19000 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c  he join.  Disabl
19010 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ing is an optimi
19020 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65  zation.  When te
19030 72 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65  rms are satisfie
19040 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c  d.** by indices,
19050 20 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d   we disable them
19060 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75   to prevent redu
19070 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74  ndant tests in t
19080 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70  he inner.** loop
19090 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20  .  We would get 
190a0 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75  the correct resu
190b0 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77  lts if nothing w
190c0 65 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65  ere ever disable
190d0 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20  d,.** but joins 
190e0 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74  might run a litt
190f0 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20  le slower.  The 
19100 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61  trick is to disa
19110 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61  ble as much.** a
19120 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74  s we can without
19130 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d   disabling too m
19140 75 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61  uch.  If we disa
19150 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27  bled in (1), we'
19160 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f  d get.** the wro
19170 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20  ng answer.  See 
19180 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a  ticket #813..*/.
19190 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61  static void disa
191a0 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76  bleTerm(WhereLev
191b0 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72  el *pLevel, Wher
191c0 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20  eTerm *pTerm){. 
191d0 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20   if( pTerm.     
191e0 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c   && (pTerm->wtFl
191f0 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
19200 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70  )==0.      && (p
19210 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
19220 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72  ==0 || ExprHasPr
19230 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
19240 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
19250 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72  )).  ){.    pTer
19260 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
19270 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66  RM_CODED;.    if
19280 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  ( pTerm->iParent
19290 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=0 ){.      Whe
192a0 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d  reTerm *pOther =
192b0 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b   &pTerm->pWC->a[
192c0 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  pTerm->iParent];
192d0 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f  .      if( (--pO
192e0 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30  ther->nChild)==0
192f0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
19300 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
19310 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d  pOther);.      }
19320 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
19330 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41  .** Code an OP_A
19340 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 74  ffinity opcode t
19350 6f 20 61 70 70 6c 79 20 74 68 65 20 63 6f 6c 75  o apply the colu
19360 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
19370 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68  ng zAff.** to th
19380 65 20 6e 20 72 65 67 69 73 74 65 72 73 20 73 74  e n registers st
19390 61 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e 20  arting at base. 
193a0 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74  .**.** As an opt
193b0 69 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54  imization, SQLIT
193c0 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69  E_AFF_NONE entri
193d0 65 73 20 28 77 68 69 63 68 20 61 72 65 20 6e 6f  es (which are no
193e0 2d 6f 70 73 29 20 61 74 20 74 68 65 0a 2a 2a 20  -ops) at the.** 
193f0 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e  beginning and en
19400 64 20 6f 66 20 7a 41 66 66 20 61 72 65 20 69 67  d of zAff are ig
19410 6e 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c 20 65  nored.  If all e
19420 6e 74 72 69 65 73 20 69 6e 20 7a 41 66 66 20 61  ntries in zAff a
19430 72 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  re.** SQLITE_AFF
19440 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63  _NONE, then no c
19450 6f 64 65 20 67 65 74 73 20 67 65 6e 65 72 61 74  ode gets generat
19460 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
19470 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 73  outine makes its
19480 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66   own copy of zAf
19490 66 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  f so that the ca
194a0 6c 6c 65 72 20 69 73 20 66 72 65 65 0a 2a 2a 20  ller is free.** 
194b0 74 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66 20 61  to modify zAff a
194c0 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
194d0 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74  e returns..*/.st
194e0 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70  atic void codeAp
194f0 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72 73  plyAffinity(Pars
19500 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62  e *pParse, int b
19510 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72  ase, int n, char
19520 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62 65 20   *zAff){.  Vdbe 
19530 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
19540 62 65 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d  be;.  if( zAff==
19550 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
19560 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
19570 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
19580 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
19590 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a  ssert( v!=0 );..
195a0 20 20 2f 2a 20 41 64 6a 75 73 74 20 62 61 73 65    /* Adjust base
195b0 20 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f   and n to skip o
195c0 76 65 72 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ver SQLITE_AFF_N
195d0 4f 4e 45 20 65 6e 74 72 69 65 73 20 61 74 20 74  ONE entries at t
195e0 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a  he beginning.  *
195f0 2a 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65  * and end of the
19600 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
19610 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
19620 6e 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d  n>0 && zAff[0]==
19630 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
19640 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20  ){.    n--;.    
19650 62 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66  base++;.    zAff
19660 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  ++;.  }.  while(
19670 20 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31   n>1 && zAff[n-1
19680 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ]==SQLITE_AFF_NO
19690 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20  NE ){.    n--;. 
196a0 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68   }..  /* Code th
196b0 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70  e OP_Affinity op
196c0 63 6f 64 65 20 69 66 20 74 68 65 72 65 20 69 73  code if there is
196d0 20 61 6e 79 74 68 69 6e 67 20 6c 65 66 74 20 74   anything left t
196e0 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  o do. */.  if( n
196f0 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
19700 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19710 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65  P_Affinity, base
19720 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , n);.    sqlite
19730 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
19740 20 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20   -1, zAff, n);. 
19750 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
19760 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
19770 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  e(pParse, base, 
19780 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  n);.  }.}.../*.*
19790 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
197a0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75  for a single equ
197b0 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68  ality term of th
197c0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
197d0 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20   An equality.** 
197e0 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68  term can be eith
197f0 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49  er X=expr or X I
19800 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d  N (...).   pTerm
19810 20 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20   is the term to 
19820 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a  be .** coded..**
19830 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20  .** The current 
19840 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f  value for the co
19850 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74  nstraint is left
19860 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
19870 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63  g..**.** For a c
19880 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65  onstraint of the
19890 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68   form X=expr, th
198a0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
198b0 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74  evaluated and it
198c0 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c  s.** result is l
198d0 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  eft on the stack
198e0 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e  .  For constrain
198f0 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  ts of the form X
19900 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69   IN (...).** thi
19910 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
19920 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  p a loop that wi
19930 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ll iterate over 
19940 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e  all values of X.
19950 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
19960 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
19970 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
19980 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
19990 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
199a0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
199b0 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65  erm,   /* The te
199c0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
199d0 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64  clause to be cod
199e0 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  ed */.  WhereLev
199f0 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54  el *pLevel, /* T
19a00 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  he level of the 
19a10 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61  FROM clause we a
19a20 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
19a30 0a 20 20 69 6e 74 20 69 45 71 2c 20 20 20 20 20  .  int iEq,     
19a40 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
19a50 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  of the equality 
19a60 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 69 73  term within this
19a70 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20   level */.  int 
19a80 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  bRev,           
19a90 2f 2a 20 54 72 75 65 20 66 6f 72 20 72 65 76 65  /* True for reve
19aa0 72 73 65 2d 6f 72 64 65 72 20 49 4e 20 6f 70 65  rse-order IN ope
19ab0 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  rations */.  int
19ac0 20 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20   iTarget        
19ad0 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c   /* Attempt to l
19ae0 65 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20  eave results in 
19af0 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
19b00 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d  .){.  Expr *pX =
19b10 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
19b20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
19b30 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
19b40 69 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iReg;           
19b50 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
19b60 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  er holding resul
19b70 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ts */..  assert(
19b80 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20   iTarget>0 );.  
19b90 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45  if( pX->op==TK_E
19ba0 51 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20  Q ){.    iReg = 
19bb0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
19bc0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 58  arget(pParse, pX
19bd0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65  ->pRight, iTarge
19be0 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
19bf0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  pX->op==TK_ISNUL
19c00 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20  L ){.    iReg = 
19c10 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71 6c  iTarget;.    sql
19c20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19c30 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52  , OP_Null, 0, iR
19c40 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eg);.#ifndef SQL
19c50 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19c60 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  Y.  }else{.    i
19c70 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e  nt eType;.    in
19c80 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75  t iTab;.    stru
19c90 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
19ca0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
19cb0 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
19cc0 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 69 66 28 20  WLoop;..    if( 
19cd0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
19ce0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
19cf0 41 42 4c 45 29 3d 3d 30 0a 20 20 20 20 20 20 26  ABLE)==0.      &
19d00 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  & pLoop->u.btree
19d10 2e 70 49 6e 64 65 78 21 3d 30 0a 20 20 20 20 20  .pIndex!=0.     
19d20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72   && pLoop->u.btr
19d30 65 65 2e 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  ee.pIndex->aSort
19d40 4f 72 64 65 72 5b 69 45 71 5d 0a 20 20 20 20 29  Order[iEq].    )
19d50 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
19d60 28 20 69 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20  ( iEq==0 );.    
19d70 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76    testcase( bRev
19d80 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d   );.      bRev =
19d90 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20   !bRev;.    }.  
19da0 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
19db0 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69  ==TK_IN );.    i
19dc0 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20  Reg = iTarget;. 
19dd0 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74     eType = sqlit
19de0 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
19df0 61 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20  arse, pX, 0);.  
19e00 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
19e10 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
19e20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
19e30 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20  se( bRev );.    
19e40 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a    bRev = !bRev;.
19e50 20 20 20 20 7d 0a 20 20 20 20 69 54 61 62 20 3d      }.    iTab =
19e60 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20   pX->iTable;.   
19e70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19e80 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
19e90 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
19ea0 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
19eb0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
19ec0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
19ed0 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a  MULTI_OR)==0 );.
19ee0 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
19ef0 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41  gs |= WHERE_IN_A
19f00 42 4c 45 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  BLE;.    if( pLe
19f10 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30  vel->u.in.nIn==0
19f20 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
19f30 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
19f40 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
19f50 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (v);.    }.    p
19f60 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b  Level->u.in.nIn+
19f70 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  +;.    pLevel->u
19f80 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20  .in.aInLoop =.  
19f90 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
19fa0 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72  allocOrFree(pPar
19fb0 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  se->db, pLevel->
19fc0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20  u.in.aInLoop,.  
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
19ff0 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  of(pLevel->u.in.
1a000 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76  aInLoop[0])*pLev
1a010 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20  el->u.in.nIn);. 
1a020 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d     pIn = pLevel-
1a030 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20  >u.in.aInLoop;. 
1a040 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20     if( pIn ){.  
1a050 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65      pIn += pLeve
1a060 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b  l->u.in.nIn - 1;
1a070 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72  .      pIn->iCur
1a080 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69   = iTab;.      i
1a090 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
1a0a0 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
1a0b0 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54      pIn->addrInT
1a0c0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
1a0d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
1a0e0 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b  id, iTab, iReg);
1a0f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1a100 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
1a110 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
1a120 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1a130 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20  olumn, iTab, 0, 
1a140 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iReg);.      }. 
1a150 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f       pIn->eEndLo
1a160 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  opOp = bRev ? OP
1a170 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
1a180 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a190 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
1a1a0 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20  sNull, iReg);.  
1a1b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1a1c0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
1a1d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 0;.    }.#endi
1a1e0 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54  f.  }.  disableT
1a1f0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
1a200 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65  m);.  return iRe
1a210 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  g;.}../*.** Gene
1a220 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
1a230 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c  ill evaluate all
1a240 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74   == and IN const
1a250 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a  raints for an.**
1a260 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f   index..**.** Fo
1a270 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69  r example, consi
1a280 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62  der table t1(a,b
1a290 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69  ,c,d,e,f) with i
1a2a0 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a  ndex i1(a,b,c)..
1a2b0 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57  ** Suppose the W
1a2c0 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
1a2d0 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62  his:  a==5 AND b
1a2e0 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20   IN (1,2,3) AND 
1a2f0 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20  c>5 AND c<10.** 
1a300 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73  The index has as
1a310 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65   many as three e
1a320 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1a330 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73  nts, but in this
1a340 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  .** example, the
1a350 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65   third "c" value
1a360 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   is an inequalit
1a370 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20  y.  So only two 
1a380 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  .** constraints 
1a390 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73  are coded.  This
1a3a0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65   routine will ge
1a3b0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
1a3c0 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20  valuate.** a==5 
1a3d0 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  and b IN (1,2,3)
1a3e0 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  .  The current v
1a3f0 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20  alues for a and 
1a400 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  b will be stored
1a410 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74 69  .** in consecuti
1a420 76 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ve registers and
1a430 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
1a440 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
1a450 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1a460 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
1a470 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e  le above nEq==2.
1a480 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f    But this subro
1a490 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20  utine works for 
1a4a0 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  any value.** of 
1a4b0 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e  nEq including 0.
1a4c0 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69    If nEq==0, thi
1a4d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61  s routine is nea
1a4e0 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20  rly a no-op..** 
1a4f0 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69  The only thing i
1a500 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61  t does is alloca
1a510 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69  te the pLevel->i
1a520 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  Mem memory cell 
1a530 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74  and.** compute t
1a540 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
1a550 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ng..**.** This r
1a560 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61 6c  outine always al
1a570 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73 74  locates at least
1a580 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   one memory cell
1a590 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20   and returns.** 
1a5a0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
1a5b0 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54  t memory cell. T
1a5c0 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  he code that.** 
1a5d0 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
1a5e0 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74  ne will use that
1a5f0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   memory cell to 
1a600 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e  store the termin
1a610 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c  ation.** key val
1a620 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ue of the loop. 
1a630 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
1a640 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70  IN operators app
1a650 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ear, then.** thi
1a660 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
1a670 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61  tes an additiona
1a680 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c  l nEq memory cel
1a690 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a  ls for internal.
1a6a0 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65  ** use..**.** Be
1a6b0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
1a6c0 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f  *pzAff is set to
1a6d0 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
1a6e0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a  er containing a.
1a6f0 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  ** copy of the c
1a700 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73  olumn affinity s
1a710 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64  tring of the ind
1a720 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  ex allocated usi
1a730 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d  ng.** sqlite3DbM
1a740 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c  alloc(). Except,
1a750 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1a760 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69  copy of the stri
1a770 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ng associated.**
1a780 20 77 69 74 68 20 65 71 75 61 6c 69 74 79 20 63   with equality c
1a790 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20  onstraints that 
1a7a0 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74  use NONE affinit
1a7b0 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20  y are set to.** 
1a7c0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
1a7d0 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c   This is to deal
1a7e0 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20 61   with SQL such a
1a7f0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
1a800 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
1a810 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54 20  TABLE t1(a TEXT 
1a820 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
1a830 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  .**   SELECT ...
1a840 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20   FROM t1 AS t2, 
1a850 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20  t1 WHERE t1.a = 
1a860 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  t2.b;.**.** In t
1a870 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
1a880 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74  , the index on t
1a890 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61 66  1(a) has TEXT af
1a8a0 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63  finity. But sinc
1a8b0 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68  e.** the right h
1a8c0 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
1a8d0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1a8e0 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e  int (t2.b) has N
1a8f0 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a  ONE affinity,.**
1a900 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73   no conversion s
1a910 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74  hould be attempt
1a920 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20  ed before using 
1a930 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20  a t2.b value as 
1a940 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79  part of.** a key
1a950 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 69   to search the i
1a960 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20  ndex. Hence the 
1a970 66 69 72 73 74 20 62 79 74 65 20 69 6e 20 74 68  first byte in th
1a980 65 20 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e  e returned affin
1a990 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e  ity.** string in
1a9a0 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f   this example wo
1a9b0 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53 51  uld be set to SQ
1a9c0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a  LITE_AFF_NONE..*
1a9d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
1a9e0 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
1a9f0 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
1aa00 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
1aa10 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1aa20 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
1aa30 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63  Level,   /* Whic
1aa40 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  h nested loop of
1aa50 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65   the FROM we are
1aa60 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74   coding */.  int
1aa70 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20   bRev,          
1aa80 20 20 20 2f 2a 20 52 65 76 65 72 73 65 20 74 68     /* Reverse th
1aa90 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f 70  e order of IN op
1aaa0 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74  erators */.  int
1aab0 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20 20   nExtraReg,     
1aac0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1aad0 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
1aae0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
1aaf0 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20   char **pzAff   
1ab00 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
1ab10 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
1ab20 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
1ab30 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 3b 20  /.){.  int nEq; 
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab50 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
1ab60 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63  er of == or IN c
1ab70 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f  onstraints to co
1ab80 64 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  de */.  Vdbe *v 
1ab90 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1aba0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20        /* The vm 
1abb0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1abc0 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
1abd0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
1abe0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
1abf0 65 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  ex being used fo
1ac00 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20  r this loop */. 
1ac10 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1ac20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
1ac30 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  * A single const
1ac40 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  raint term */.  
1ac50 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1ac60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ac70 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   The WhereLoop o
1ac80 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6a  bject */.  int j
1ac90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1aca0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1acb0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
1acc0 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
1acd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1ace0 61 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ase register */.
1acf0 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20    int nReg;     
1ad00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67  /* Number of reg
1ad20 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
1ad30 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  te */.  char *zA
1ad40 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
1ad50 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
1ad60 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75  y string to retu
1ad70 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  rn */..  /* This
1ad80 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20   module is only 
1ad90 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20  called on query 
1ada0 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65 20 61  plans that use a
1adb0 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 70 4c  n index. */.  pL
1adc0 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
1add0 4c 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  Loop;.  assert( 
1ade0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1adf0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
1ae00 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 6e 45  ABLE)==0 );.  nE
1ae10 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
1ae20 65 65 2e 6e 45 71 3b 0a 20 20 70 49 64 78 20 3d  ee.nEq;.  pIdx =
1ae30 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1ae40 70 49 6e 64 65 78 3b 0a 20 20 61 73 73 65 72 74  pIndex;.  assert
1ae50 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a 20 20  ( pIdx!=0 );..  
1ae60 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
1ae70 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65  w many memory ce
1ae80 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  lls we will need
1ae90 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74   then allocate t
1aea0 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42  hem..  */.  regB
1aeb0 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ase = pParse->nM
1aec0 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d  em + 1;.  nReg =
1aed0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1aee0 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b  nEq + nExtraReg;
1aef0 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
1af00 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66  += nReg;..  zAff
1af10 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
1af20 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  up(pParse->db, s
1af30 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
1af40 69 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 29  ityStr(v, pIdx))
1af50 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b  ;.  if( !zAff ){
1af60 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d  .    pParse->db-
1af70 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
1af80 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61  1;.  }..  /* Eva
1af90 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69  luate the equali
1afa0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ty constraints. 
1afb0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49   */.  assert( pI
1afc0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71  dx->nColumn>=nEq
1afd0 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   );.  for(j=0; j
1afe0 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  <nEq; j++){.    
1aff0 69 6e 74 20 72 31 3b 0a 20 20 20 20 70 54 65 72  int r1;.    pTer
1b000 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  m = pLoop->aLTer
1b010 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  m[j];.    assert
1b020 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
1b030 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1b040 6e 67 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69  ng true for indi
1b050 63 65 73 20 77 69 74 68 20 72 65 64 75 6e 64 61  ces with redunda
1b060 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20  nt columns. .   
1b070 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49   ** Ex: CREATE I
1b080 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c  NDEX i1 ON t1(a,
1b090 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46  b,a); SELECT * F
1b0a0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30  ROM t1 WHERE a=0
1b0b0 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20   AND b=0; */.   
1b0c0 20 74 65 73 74 63 61 73 65 28 20 28 70 54 65 72   testcase( (pTer
1b0d0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1b0e0 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20  M_CODED)!=0 );. 
1b0f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1b100 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1b110 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
1b120 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
1b130 36 32 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 63  62 */.    r1 = c
1b140 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1b150 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
1b160 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20  Level, j, bRev, 
1b170 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
1b180 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b  if( r1!=regBase+
1b190 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  j ){.      if( n
1b1a0 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Reg==1 ){.      
1b1b0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1b1c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1b1d0 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20  regBase);.      
1b1e0 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a    regBase = r1;.
1b1f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b200 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b210 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
1b220 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b  py, r1, regBase+
1b230 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
1b240 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
1b250 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1b260 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
1b270 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1b280 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1b290 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66   WO_IN );.    if
1b2a0 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1b2b0 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
1b2c0 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20  |WO_IN))==0 ){. 
1b2d0 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
1b2e0 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  t = pTerm->pExpr
1b2f0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1b300 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1b310 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69  sNullJump(v, pRi
1b320 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20  ght, regBase+j, 
1b330 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
1b340 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66 66  ;.      if( zAff
1b350 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1b360 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1b370 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
1b380 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f  Aff[j])==SQLITE_
1b390 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
1b3a0 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20        zAff[j] = 
1b3b0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1b3c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b3d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1b3e0 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
1b3f0 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
1b400 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  zAff[j]) ){.    
1b410 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20        zAff[j] = 
1b420 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1b430 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b440 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a   }.    }.  }.  *
1b450 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20  pzAff = zAff;.  
1b460 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a  return regBase;.
1b470 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1b480 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
1b490 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b4a0 65 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f  e is a helper fo
1b4b0 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61  r explainIndexRa
1b4c0 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a  nge() below.**.*
1b4d0 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65  * pStr holds the
1b4e0 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72   text of an expr
1b4f0 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61  ession that we a
1b500 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f  re building up o
1b510 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20  ne term.** at a 
1b520 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74  time.  This rout
1b530 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20 74  ine adds a new t
1b540 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  erm to the end o
1b550 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1b560 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73  ..** Terms are s
1b570 65 70 61 72 61 74 65 64 20 62 79 20 41 4e 44 20  eparated by AND 
1b580 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44 22  so add the "AND"
1b590 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64   text for second
1b5a0 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a   and subsequent.
1b5b0 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a  ** terms only..*
1b5c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
1b5d0 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1b5e0 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74  .  StrAccum *pSt
1b5f0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
1b600 2a 20 54 68 65 20 74 65 78 74 20 65 78 70 72 65  * The text expre
1b610 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c  ssion being buil
1b620 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d  t */.  int iTerm
1b630 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b640 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1b650 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74  his term.  First
1b660 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f   is zero */.  co
1b670 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
1b680 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  n,        /* Nam
1b690 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
1b6a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1b6b0 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20 20  *zOp            
1b6c0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1b6d0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20  operator */.){. 
1b6e0 20 69 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c   if( iTerm ) sql
1b6f0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1b700 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22  nd(pStr, " AND "
1b710 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 5);.  sqlite3S
1b720 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
1b730 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29  tr, zColumn, -1)
1b740 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
1b750 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
1b760 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  zOp, 1);.  sqlit
1b770 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1b780 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a  (pStr, "?", 1);.
1b790 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
1b7a0 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62  t pLevel describ
1b7b0 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66 6f  es a strategy fo
1b7c0 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65  r scanning table
1b7d0 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20   pTab. This .** 
1b7e0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1b7f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1b800 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f  string buffer co
1b810 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72  ntaining a descr
1b820 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  iption.** of the
1b830 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65   subset of table
1b840 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79   rows scanned by
1b850 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69 6e   the strategy in
1b860 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a   the form of an.
1b870 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f  ** SQL expressio
1b880 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f  n. Or, if all ro
1b890 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20  ws are scanned, 
1b8a0 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
1b8b0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1b8c0 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72  ple, if the quer
1b8d0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  y:.**.**   SELEC
1b8e0 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
1b8f0 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a  E a=1 AND b>2;.*
1b900 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20  *.** is run and 
1b910 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
1b920 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65  x on (a, b), the
1b930 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1b940 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72  returns a.** str
1b950 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a  ing similar to:.
1b960 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44  **.**   "a=? AND
1b970 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20   b>?".**.** The 
1b980 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72  returned pointer
1b990 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72   points to memor
1b9a0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
1b9b0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
1b9c0 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  )..** It is the 
1b9d0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
1b9e0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
1b9f0 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72 20  free the buffer 
1ba00 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f  when it is.** no
1ba10 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
1ba20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1ba30 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61   *explainIndexRa
1ba40 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nge(sqlite3 *db,
1ba50 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
1ba60 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  p, Table *pTab){
1ba70 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1ba80 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1ba90 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
1baa0 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
1bab0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 69 6e 74 20  tree.nEq;.  int 
1bac0 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  i, j;.  Column *
1bad0 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  aCol = pTab->aCo
1bae0 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75  l;.  int *aiColu
1baf0 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
1bb00 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75  olumn;.  StrAccu
1bb10 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45  m txt;..  if( nE
1bb20 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  q==0 && (pLoop->
1bb30 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1bb40 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
1bb50 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20  _TOP_LIMIT))==0 
1bb60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1bb70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
1bb80 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c  rAccumInit(&txt,
1bb90 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41   0, 0, SQLITE_MA
1bba0 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74  X_LENGTH);.  txt
1bbb0 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69  .db = db;.  sqli
1bbc0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1bbd0 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29  d(&txt, " (", 2)
1bbe0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1bbf0 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78  Eq; i++){.    ex
1bc00 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1bc10 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69  &txt, i, aCol[ai
1bc20 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65  Column[i]].zName
1bc30 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a  , "=");.  }..  j
1bc40 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f   = i;.  if( pLoo
1bc50 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45  p->wsFlags&WHERE
1bc60 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
1bc70 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d    char *z = (j==
1bc80 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
1bc90 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43  ) ? "rowid" : aC
1bca0 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  ol[aiColumn[j]].
1bcb0 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61  zName;.    expla
1bcc0 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78  inAppendTerm(&tx
1bcd0 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b  t, i++, z, ">");
1bce0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
1bcf0 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
1bd00 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
1bd10 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70   char *z = (j==p
1bd20 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
1bd30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
1bd40 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
1bd50 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
1bd60 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
1bd70 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20  , i, z, "<");.  
1bd80 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
1bd90 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
1bda0 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  ")", 1);.  retur
1bdb0 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  n sqlite3StrAccu
1bdc0 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d  mFinish(&txt);.}
1bdd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1bde0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1bdf0 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c   unless currentl
1be00 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20  y processing an 
1be10 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1be20 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49  AN.** command. I
1be30 66 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e  f the query bein
1be40 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e  g compiled is an
1be50 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
1be60 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  LAN, a single.**
1be70 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64   record is added
1be80 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74   to the output t
1be90 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  o describe the t
1bea0 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65  able scan strate
1beb0 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c  gy in .** pLevel
1bec0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1bed0 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
1bee0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1bef0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bf00 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
1bf10 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
1bf20 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
1bf30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1bf40 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70  e list this loop
1bf50 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20   refers to */.  
1bf60 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1bf70 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
1bf80 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65  /* Scan to write
1bf90 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f   OP_Explain opco
1bfa0 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  de for */.  int 
1bfb0 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
1bfc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1bfd0 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22  alue for "level"
1bfe0 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75   column of outpu
1bff0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
1c000 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c010 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1c020 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d  for "from" colum
1c030 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20  n of output */. 
1c040 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
1c050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c060 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
1c070 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
1c080 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  Begin() */.){.  
1c090 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
1c0a0 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 73 74  ain==2 ){.    st
1c0b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1c0c0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
1c0d0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
1c0e0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65  iFrom];.    Vdbe
1c0f0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1c100 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20  dbe;      /* VM 
1c110 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
1c120 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
1c130 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1c140 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61  b;     /* Databa
1c150 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20  se handle */.   
1c160 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20   char *zMsg;    
1c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c180 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f  * Text to add to
1c190 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20   EQP output */. 
1c1a0 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61     int iId = pPa
1c1b0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20  rse->iSelectId; 
1c1c0 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c   /* Select id (l
1c1d0 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20  eft-most output 
1c1e0 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69  column) */.    i
1c1f0 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20 20 20  nt isSearch;    
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c210 54 72 75 65 20 66 6f 72 20 61 20 53 45 41 52 43  True for a SEARC
1c220 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41  H. False for SCA
1c230 4e 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c  N. */.    WhereL
1c240 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
1c250 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1c260 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72 65  ontrolling Where
1c270 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
1c280 20 20 20 75 33 32 20 66 6c 61 67 73 3b 20 20 20     u32 flags;   
1c290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2a0 20 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20 64   /* Flags that d
1c2b0 65 73 63 72 69 62 65 20 74 68 69 73 20 6c 6f 6f  escribe this loo
1c2c0 70 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20  p */..    pLoop 
1c2d0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
1c2e0 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c  ;.    flags = pL
1c2f0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  oop->wsFlags;.  
1c300 20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45    if( (flags&WHE
1c310 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20  RE_MULTI_OR) || 
1c320 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  (wctrlFlags&WHER
1c330 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
1c340 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20   ) return;..    
1c350 69 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61 67  isSearch = (flag
1c360 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  s&(WHERE_BTM_LIM
1c370 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
1c380 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IT))!=0.        
1c390 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26 57      || ((flags&W
1c3a0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1c3b0 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d  E)==0 && (pLoop-
1c3c0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29 29  >u.btree.nEq>0))
1c3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
1c3e0 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45  (wctrlFlags&(WHE
1c3f0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57  RE_ORDERBY_MIN|W
1c400 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1c410 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20  ));..    zMsg = 
1c420 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1c430 62 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72 63  b, "%s", isSearc
1c440 68 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e  h?"SEARCH":"SCAN
1c450 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ");.    if( pIte
1c460 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
1c470 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1c480 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1c490 4d 73 67 2c 20 22 25 73 20 53 55 42 51 55 45 52  Msg, "%s SUBQUER
1c4a0 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65  Y %d", zMsg,pIte
1c4b0 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20  m->iSelectId);. 
1c4c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c4d0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1c4e0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1c4f0 20 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20   "%s TABLE %s", 
1c500 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  zMsg, pItem->zNa
1c510 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  me);.    }..    
1c520 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
1c530 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  s ){.      zMsg 
1c540 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1c550 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1c560 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  AS %s", zMsg, pI
1c570 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1c580 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61    }.    if( (fla
1c590 67 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c  gs & (WHERE_IPK|
1c5a0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1c5b0 4c 45 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  LE))==0.     && 
1c5c0 41 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 75 2e  ALWAYS(pLoop->u.
1c5d0 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 29  btree.pIndex!=0)
1c5e0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68  .    ){.      ch
1c5f0 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70  ar *zWhere = exp
1c600 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64  lainIndexRange(d
1c610 62 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d  b, pLoop, pItem-
1c620 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d  >pTab);.      zM
1c630 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1c640 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 0a 20  endf(db, zMsg,. 
1c650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
1c660 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  flags & WHERE_AU
1c670 54 4f 5f 49 4e 44 45 58 29 20 3f 20 0a 20 20 20  TO_INDEX) ? .   
1c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c690 22 25 73 20 55 53 49 4e 47 20 41 55 54 4f 4d 41  "%s USING AUTOMA
1c6a0 54 49 43 20 25 73 49 4e 44 45 58 25 2e 30 73 25  TIC %sINDEX%.0s%
1c6b0 73 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20  s" :.           
1c6c0 20 20 20 20 20 20 20 20 22 25 73 20 55 53 49 4e          "%s USIN
1c6d0 47 20 25 73 49 4e 44 45 58 20 25 73 25 73 22 29  G %sINDEX %s%s")
1c6e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1c6f0 20 20 7a 4d 73 67 2c 20 28 28 66 6c 61 67 73 20    zMsg, ((flags 
1c700 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
1c710 29 20 3f 20 22 43 4f 56 45 52 49 4e 47 20 22 20  ) ? "COVERING " 
1c720 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20  : ""),.         
1c730 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
1c740 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61  tree.pIndex->zNa
1c750 6d 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20  me, zWhere);.   
1c760 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1c770 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  (db, zWhere);.  
1c780 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
1c790 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
1c7a0 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26 20 57  =0 && (flags & W
1c7b0 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29  HERE_CONSTRAINT)
1c7c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73  !=0 ){.      zMs
1c7d0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1c7e0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1c7f0 73 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20  s USING INTEGER 
1c800 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d  PRIMARY KEY", zM
1c810 73 67 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  sg);..      if( 
1c820 66 6c 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c  flags&(WHERE_COL
1c830 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c  UMN_EQ|WHERE_COL
1c840 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20  UMN_IN) ){.     
1c850 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1c860 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1c870 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f  sg, "%s (rowid=?
1c880 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
1c890 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
1c8a0 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  s&WHERE_BOTH_LIM
1c8b0 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f  IT)==WHERE_BOTH_
1c8c0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
1c8d0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1c8e0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1c8f0 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41  , "%s (rowid>? A
1c900 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d  ND rowid<?)", zM
1c910 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
1c920 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45   if( flags&WHERE
1c930 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
1c940 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1c950 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1c960 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
1c970 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d>?)", zMsg);.  
1c980 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
1c990 57 41 59 53 28 66 6c 61 67 73 26 57 48 45 52 45  WAYS(flags&WHERE
1c9a0 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20  _TOP_LIMIT) ){. 
1c9b0 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
1c9c0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1c9d0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
1c9e0 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id<?)", zMsg);. 
1c9f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
1ca00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ca10 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1ca20 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67    else if( (flag
1ca30 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
1ca40 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
1ca50 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1ca60 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1ca70 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c  Msg, "%s VIRTUAL
1ca80 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a   TABLE INDEX %d:
1ca90 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20  %s", zMsg,.     
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
1cab0 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75  op->u.vtab.idxNu
1cac0 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  m, pLoop->u.vtab
1cad0 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a  .idxStr);.    }.
1cae0 23 65 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67 20  #endif.    zMsg 
1caf0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1cb00 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 22  f(db, zMsg, "%s"
1cb10 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  , zMsg);.    sql
1cb20 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1cb30 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49  , OP_Explain, iI
1cb40 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d  d, iLevel, iFrom
1cb50 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
1cb60 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
1cb70 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
1cb80 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78  nOneScan(u,v,w,x
1cb90 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
1cba0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
1cbb0 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47  AIN */.../*.** G
1cbc0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1cbd0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1cbe0 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70  e iLevel-th loop
1cbf0 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
1cc00 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  ause.** implemen
1cc10 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  tation described
1cc20 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73   by pWInfo..*/.s
1cc30 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
1cc40 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a  deOneLoopStart(.
1cc50 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1cc60 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65  nfo,   /* Comple
1cc70 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
1cc80 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63  bout the WHERE c
1cc90 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
1cca0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
1ccb0 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f  /* Which level o
1ccc0 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68  f pWInfo->a[] sh
1ccd0 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f  ould be coded */
1cce0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
1ccf0 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68  ady     /* Which
1cd00 20 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72   tables are curr
1cd10 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20  ently available 
1cd20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b  */.){.  int j, k
1cd30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1cd40 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1cd50 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
1cd60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1cd70 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
1cd80 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
1cd90 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20  t addrNxt;      
1cda0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
1cdb0 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ump to continue 
1cdc0 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
1cdd0 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   case */.  int o
1cde0 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20  mitTable;       
1cdf0 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73  /* True if we us
1ce00 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79  e the index only
1ce10 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20   */.  int bRev; 
1ce20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1ce30 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ue if we need to
1ce40 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   scan in reverse
1ce50 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72   order */.  Wher
1ce60 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
1ce70 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65   /* The where le
1ce80 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20  vel to be coded 
1ce90 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1cea0 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65  pLoop;    /* The
1ceb0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1cec0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
1ced0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1cee0 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d  pWC;    /* Decom
1cef0 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
1cf00 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61  entire WHERE cla
1cf10 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
1cf20 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
1cf30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48           /* A WH
1cf40 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
1cf50 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
1cf60 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1cf70 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1cf80 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64 62  context */.  Vdb
1cf90 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cfb0 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 6d  The prepared stm
1cfc0 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
1cfd0 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63  tions */.  struc
1cfe0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1cff0 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52  pTabItem;  /* FR
1d000 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62  OM clause term b
1d010 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
1d020 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20  int addrBrk;    
1d030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d040 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
1d050 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
1d060 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
1d070 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20  ddrCont;        
1d080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
1d090 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
1d0a0 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 63 79  nue with next cy
1d0b0 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f  cle */.  int iRo
1d0c0 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20  widReg = 0;     
1d0d0 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73     /* Rowid is s
1d0e0 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72 65  tored in this re
1d0f0 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a  gister, if not z
1d100 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ero */.  int iRe
1d110 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20  leaseReg = 0;   
1d120 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73     /* Temp regis
1d130 74 65 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f  ter to free befo
1d140 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a  re returning */.
1d150 20 20 42 69 74 6d 61 73 6b 20 6e 65 77 4e 6f 74    Bitmask newNot
1d160 52 65 61 64 79 3b 20 20 20 20 20 20 2f 2a 20 52  Ready;      /* R
1d170 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
1d180 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
1d190 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d  o->pParse;.  v =
1d1a0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1d1b0 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d    pWC = &pWInfo-
1d1c0 3e 73 57 43 3b 0a 20 20 70 4c 65 76 65 6c 20 3d  >sWC;.  pLevel =
1d1d0 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76   &pWInfo->a[iLev
1d1e0 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  el];.  pLoop = p
1d1f0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
1d200 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49   pTabItem = &pWI
1d210 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
1d220 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
1d230 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  .  iCur = pTabIt
1d240 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62  em->iCursor;.  b
1d250 52 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72  Rev = (pWInfo->r
1d260 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26  evMask>>iLevel)&
1d270 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d  1;.  omitTable =
1d280 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1d290 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
1d2a0 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  Y)!=0 .         
1d2b0 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
1d2c0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1d2d0 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30  _FORCE_TABLE)==0
1d2e0 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
1d2f0 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 4a  ent((v, "Begin J
1d300 6f 69 6e 20 4c 6f 6f 70 20 25 64 22 2c 20 69 4c  oin Loop %d", iL
1d310 65 76 65 6c 29 29 3b 0a 0a 20 20 2f 2a 20 43 72  evel));..  /* Cr
1d320 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20  eate labels for 
1d330 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20  the "break" and 
1d340 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72  "continue" instr
1d350 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72  uctions.  ** for
1d360 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
1d370 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72  p.  Jump to addr
1d380 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  Brk to break out
1d390 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a   of a loop..  **
1d3a0 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f   Jump to cont to
1d3b0 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   go immediately 
1d3c0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
1d3d0 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  ation of the.  *
1d3e0 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a  * loop..  **.  *
1d3f0 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69 73 20  * When there is 
1d400 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  an IN operator, 
1d410 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22  we also have a "
1d420 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74  addrNxt" label t
1d430 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74  hat.  ** means t
1d440 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
1d450 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75  the next IN valu
1d460 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20  e combination.  
1d470 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20  When.  ** there 
1d480 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74  are no IN operat
1d490 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  ors in the const
1d4a0 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64  raints, the "add
1d4b0 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a  rNxt" label.  **
1d4c0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
1d4d0 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a  "addrBrk"..  */.
1d4e0 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76    addrBrk = pLev
1d4f0 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c  el->addrBrk = pL
1d500 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
1d510 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1d520 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43  abel(v);.  addrC
1d530 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  ont = pLevel->ad
1d540 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
1d550 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1d560 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1d570 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
1d580 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  le of a LEFT OUT
1d590 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74  ER JOIN, allocat
1d5a0 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69  e and.  ** initi
1d5b0 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63  alize a memory c
1d5c0 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73  ell that records
1d5d0 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d   if this table m
1d5e0 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20  atches any.  ** 
1d5f0 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20  row of the left 
1d600 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
1d610 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  n..  */.  if( pL
1d620 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26  evel->iFrom>0 &&
1d630 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f   (pTabItem[0].jo
1d640 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
1d650 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76  )!=0 ){.    pLev
1d660 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20  el->iLeftJoin = 
1d670 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1d680 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d690 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1d6a0 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  ger, 0, pLevel->
1d6b0 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
1d6c0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1d6d0 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20  "init LEFT JOIN 
1d6e0 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29  no-match flag"))
1d6f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  ;.  }..  /* Spec
1d700 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 46 52  ial case of a FR
1d710 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM clause subque
1d720 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  ry implemented a
1d730 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a  s a co-routine *
1d740 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d  /.  if( pTabItem
1d750 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  ->viaCoroutine )
1d760 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69 65  {.    int regYie
1d770 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72  ld = pTabItem->r
1d780 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  egReturn;.    sq
1d790 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d7a0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
1d7b0 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  TabItem->addrFil
1d7c0 6c 53 75 62 2d 31 2c 20 72 65 67 59 69 65 6c 64  lSub-1, regYield
1d7d0 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  );.    pLevel->p
1d7e0 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65  2 =  sqlite3Vdbe
1d7f0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
1d800 6c 64 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  ld, regYield);. 
1d810 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1d820 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20  v, "next row of 
1d830 63 6f 2d 72 6f 75 74 69 6e 65 20 25 73 22 2c 20  co-routine %s", 
1d840 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
1d850 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c  zName));.    sql
1d860 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d870 2c 20 4f 50 5f 49 66 2c 20 72 65 67 59 69 65 6c  , OP_If, regYiel
1d880 64 2b 31 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20  d+1, addrBrk);. 
1d890 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1d8a0 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65  OP_Goto;.  }else
1d8b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1d8c0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1d8d0 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f 70  LE.  if(  (pLoop
1d8e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1d8f0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
1d900 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  =0 ){.    /* Cas
1d910 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c 65 20  e 1:  The table 
1d920 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62  is a virtual-tab
1d930 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69  le.  Use the VFi
1d940 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20  lter and VNext. 
1d950 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74     **          t
1d960 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
1d970 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  a..    */.    in
1d980 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20  t iReg;   /* P3 
1d990 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69  Value for OP_VFi
1d9a0 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lter */.    int 
1d9b0 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20  addrNotFound;.  
1d9c0 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
1d9d0 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72  t = pLoop->nLTer
1d9e0 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45  m;..    sqlite3E
1d9f0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1da00 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d  rse);.    iReg =
1da10 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1da20 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
1da30 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
1da40 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20   addrNotFound = 
1da50 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b  pLevel->addrBrk;
1da60 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1da70 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b  nConstraint; j++
1da80 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61  ){.      int iTa
1da90 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b  rget = iReg+j+2;
1daa0 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70  .      pTerm = p
1dab0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b  Loop->aLTerm[j];
1dac0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
1dad0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1dae0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
1daf0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1db00 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  IN ){.        co
1db10 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
1db20 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
1db30 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69  evel, j, bRev, i
1db40 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  Target);.       
1db50 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20   addrNotFound = 
1db60 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
1db70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1db80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1db90 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54  rCode(pParse, pT
1dba0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
1dbb0 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  ht, iTarget);.  
1dbc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1dbd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1dbe0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1dbf0 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
1dc00 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20  dxNum, iReg);.  
1dc10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dc20 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1dc30 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20  r, nConstraint, 
1dc40 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c  iReg+1);.    sql
1dc50 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1dc60 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43  , OP_VFilter, iC
1dc70 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64  ur, addrNotFound
1dc80 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20 20 20  , iReg,.        
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
1dca0 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  oop->u.vtab.idxS
1dcb0 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tr,.            
1dcc0 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
1dcd0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1dce0 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20   ? P4_MPRINTF : 
1dcf0 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
1dd00 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65  pLoop->u.vtab.ne
1dd10 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  edFree = 0;.    
1dd20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73  for(j=0; j<nCons
1dd30 74 72 61 69 6e 74 20 26 26 20 6a 3c 31 36 3b 20  traint && j<16; 
1dd40 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
1dd50 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f  (pLoop->u.vtab.o
1dd60 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29 7b  mitMask>>j)&1 ){
1dd70 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
1dd80 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4c 6f  Term(pLevel, pLo
1dd90 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b 0a  op->aLTerm[j]);.
1dda0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ddb0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
1ddc0 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  P_VNext;.    pLe
1ddd0 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
1dde0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
1ddf0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1de00 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1de10 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1de20 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1de30 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  iReg, nConstrain
1de40 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t+2);.    sqlite
1de50 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
1de60 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  arse, 1);.  }els
1de70 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
1de80 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1de90 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28  ABLE */..  if( (
1dea0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1deb0 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20   WHERE_IPK)!=0. 
1dec0 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
1ded0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
1dee0 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f  LUMN_IN|WHERE_CO
1def0 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29  LUMN_EQ))!=0.  )
1df00 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a  {.    /* Case 2:
1df10 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c    We can directl
1df20 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69  y reference a si
1df30 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61  ngle row using a
1df40 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
1df50 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61    equality compa
1df60 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
1df70 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20  e ROWID field.  
1df80 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  Or.    **       
1df90 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20     we reference 
1dfa0 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73  multiple rows us
1dfb0 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20  ing a "rowid IN 
1dfc0 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20  (...)".    **   
1dfd0 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74         construct
1dfe0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1dff0 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ert( pLoop->u.bt
1e000 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20  ree.nEq==1 );.  
1e010 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20    iReleaseReg = 
1e020 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1e030 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  g(pParse);.    p
1e040 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
1e050 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73  Term[0];.    ass
1e060 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
1e070 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
1e080 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a  rm->pExpr!=0 );.
1e090 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
1e0a0 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
1e0b0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1e0c0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1e0d0 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
1e0e0 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
1e0f0 2a 2f 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67  */.    iRowidReg
1e100 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
1e110 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
1e120 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52  m, pLevel, 0, bR
1e130 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  ev, iReleaseReg)
1e140 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
1e150 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
1e160 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1e170 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
1e180 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65  tBeInt, iRowidRe
1e190 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  g, addrNxt);.   
1e1a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e1b0 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
1e1c0 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78  ts, iCur, addrNx
1e1d0 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  t, iRowidReg);. 
1e1e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e1f0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1e200 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64  e(pParse, iRowid
1e210 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  Reg, 1);.    sql
1e220 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1e230 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
1e240 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
1e250 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
1e260 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
1e270 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1e280 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69  _Noop;.  }else i
1e290 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1e2a0 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
1e2b0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
1e2c0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1e2d0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
1e2e0 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  NGE)!=0.  ){.   
1e2f0 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20   /* Case 3:  We 
1e300 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
1e310 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
1e320 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
1e330 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  field..    */.  
1e340 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f    int testOp = O
1e350 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  P_Noop;.    int 
1e360 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d  start;.    int m
1e370 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a  emEndValue = 0;.
1e380 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1e390 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
1e3a0 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
1e3b0 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a  able==0 );.    j
1e3c0 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
1e3d0 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20   = pEnd = 0;.   
1e3e0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1e3f0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
1e400 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d  LIMIT ) pStart =
1e410 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1e420 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ++];.    if( pLo
1e430 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1e440 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20  ERE_TOP_LIMIT ) 
1e450 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  pEnd = pLoop->aL
1e460 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61  Term[j++];.    a
1e470 73 73 65 72 74 28 20 70 53 74 61 72 74 21 3d 30  ssert( pStart!=0
1e480 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20   || pEnd!=0 );. 
1e490 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
1e4a0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74       pTerm = pSt
1e4b0 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72  art;.      pStar
1e4c0 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  t = pEnd;.      
1e4d0 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pEnd = pTerm;.  
1e4e0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61    }.    if( pSta
1e4f0 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
1e500 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
1e510 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
1e520 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73  ion that defines
1e530 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
1e540 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31   */.      int r1
1e550 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20  , rTemp;        
1e560 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72  /* Registers for
1e570 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61   holding the sta
1e580 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a  rt boundary */..
1e590 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
1e5a0 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20  lowing constant 
1e5b0 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73  maps TK_xx codes
1e5c0 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64   into correspond
1e5d0 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65  ing .      ** se
1e5e0 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20  ek opcodes.  It 
1e5f0 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72  depends on a par
1e600 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67  ticular ordering
1e610 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20   of TK_xx.      
1e620 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
1e630 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a  8 aMoveOp[] = {.
1e640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
1e650 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GT */  OP_SeekG
1e660 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,.           /*
1e670 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_LE */  OP_Se
1e680 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  ekLe,.          
1e690 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50   /* TK_LT */  OP
1e6a0 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20  _SeekLt,.       
1e6b0 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20      /* TK_GE */ 
1e6c0 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20   OP_SeekGe.     
1e6d0 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   };.      assert
1e6e0 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31  ( TK_LE==TK_GT+1
1e6f0 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65   );      /* Make
1e700 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69   sure the orderi
1e710 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ng.. */.      as
1e720 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
1e730 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+2 );      /* 
1e740 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78   ... of the TK_x
1e750 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20  x values... */. 
1e760 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e770 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20  GE==TK_GT+3 );  
1e780 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63      /*  ... is c
1e790 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20  orrecct. */..   
1e7a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74     testcase( pSt
1e7b0 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
1e7c0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
1e7d0 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31  * EV: R-30575-11
1e7e0 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 70 58 20  662 */.      pX 
1e7f0 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b  = pStart->pExpr;
1e800 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e810 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  X!=0 );.      as
1e820 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65  sert( pStart->le
1e830 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
1e840 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1e850 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e860 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
1e870 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20  ght, &rTemp);.  
1e880 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e890 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70  ddOp3(v, aMoveOp
1e8a0 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20  [pX->op-TK_GT], 
1e8b0 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72  iCur, addrBrk, r
1e8c0 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
1e8d0 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
1e8e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e8f0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
1e900 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
1e910 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 1);.      sql
1e920 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1e930 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70  eg(pParse, rTemp
1e940 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65  );.      disable
1e950 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74  Term(pLevel, pSt
1e960 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  art);.    }else{
1e970 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e980 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76  beAddOp2(v, bRev
1e990 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f   ? OP_Last : OP_
1e9a0 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64  Rewind, iCur, ad
1e9b0 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  drBrk);.    }.  
1e9c0 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20    if( pEnd ){.  
1e9d0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
1e9e0 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70      pX = pEnd->p
1e9f0 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
1ea00 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
1ea10 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d     assert( pEnd-
1ea20 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
1ea30 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  r );.      testc
1ea40 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61  ase( pEnd->wtFla
1ea50 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1ea60 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  L ); /* EV: R-30
1ea70 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
1ea80 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d     memEndValue =
1ea90 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1eaa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1eab0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1eac0 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e  X->pRight, memEn
1ead0 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69  dValue);.      i
1eae0 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  f( pX->op==TK_LT
1eaf0 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47   || pX->op==TK_G
1eb00 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  T ){.        tes
1eb10 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
1eb20 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20  Le : OP_Ge;.    
1eb30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1eb40 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f   testOp = bRev ?
1eb50 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a   OP_Lt : OP_Gt;.
1eb60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69        }.      di
1eb70 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1eb80 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20  , pEnd);.    }. 
1eb90 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
1eba0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1ebb0 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  r(v);.    pLevel
1ebc0 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  ->op = bRev ? OP
1ebd0 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
1ebe0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
1ebf0 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
1ec00 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a  el->p2 = start;.
1ec10 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
1ec20 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20  el->p5==0 );.   
1ec30 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f   if( testOp!=OP_
1ec40 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52  Noop ){.      iR
1ec50 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61  owidReg = iRelea
1ec60 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
1ec70 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1ec80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ec90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1eca0 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52  _Rowid, iCur, iR
1ecb0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1ecc0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1ecd0 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
1ece0 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
1ecf0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1ed00 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74  3VdbeAddOp3(v, t
1ed10 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c  estOp, memEndVal
1ed20 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f  ue, addrBrk, iRo
1ed30 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
1ed40 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1ed50 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46  P5(v, SQLITE_AFF
1ed60 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54  _NUMERIC | SQLIT
1ed70 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1ed80 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1ed90 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1eda0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
1edb0 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34  ){.    /* Case 4
1edc0 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61  : A scan using a
1edd0 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  n index..    **.
1ede0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1edf0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1ee00 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f  may contain zero
1ee10 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74   or more equalit
1ee20 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
1ee30 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72    terms ("==" or
1ee40 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29   "IN" operators)
1ee50 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
1ee60 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20  he N.    **     
1ee70 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f      left-most co
1ee80 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
1ee90 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20  ex. It may also 
1eea0 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20  contain.    **  
1eeb0 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74         inequalit
1eec0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e  y constraints (>
1eed0 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f  , <, >= or <=) o
1eee0 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20  n the indexed.  
1eef0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c    **         col
1ef00 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61  umn that immedia
1ef10 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65  tely follows the
1ef20 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f   N equalities. O
1ef30 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  nly .    **     
1ef40 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f      the right-mo
1ef50 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65  st column can be
1ef60 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d   an inequality -
1ef70 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20   the rest must. 
1ef80 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73     **         us
1ef90 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22  e the "==" and "
1efa0 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46  IN" operators. F
1efb0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1efc0 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  he .    **      
1efd0 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28     index is on (
1efe0 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65  x,y,z), then the
1eff0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73   following claus
1f000 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20  es are all .    
1f010 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d  **         optim
1f020 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ized:.    **.   
1f030 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1f040 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  =5.    **       
1f050 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31       x=5 AND y=1
1f060 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1f070 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30      x=5 AND y<10
1f080 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f090 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41     x=5 AND y>5 A
1f0a0 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
1f0b0 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1f0c0 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a  D y=5 AND z<=10.
1f0d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1f0e0 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74        The z<10 t
1f0f0 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  erm of the follo
1f100 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75  wing cannot be u
1f110 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  sed, only.    **
1f120 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d 35           the x=5
1f130 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20   term:.    **.  
1f140 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1f150 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20  x=5 AND z<10.   
1f160 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1f170 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f     N may be zero
1f180 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
1f190 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1f1a0 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20  ints..    **    
1f1b0 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61 72       If there ar
1f1c0 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20  e no inequality 
1f1d0 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
1f1e0 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a  n N is at.    **
1f1f0 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f           least o
1f200 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ne..    **.    *
1f210 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63  *         This c
1f220 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ase is also used
1f230 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
1f240 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  no WHERE clause.
1f250 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
1f260 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61  onstraints but a
1f270 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63  n index is selec
1f280 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f  ted anyway, in o
1f290 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20  rder.    **     
1f2a0 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65      to force the
1f2b0 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f   output order to
1f2c0 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f   conform to an O
1f2d0 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20  RDER BY..    */ 
1f2e0 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e   .    static con
1f2f0 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d  st u8 aStartOp[]
1f300 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20   = {.      0,.  
1f310 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f      0,.      OP_
1f320 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20  Rewind,         
1f330 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f    /* 2: (!start_
1f340 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
1f350 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65 76  tartEq &&  !bRev
1f360 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61  ) */.      OP_La
1f370 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1f380 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 3: (!start_co
1f390 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
1f3a0 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20  rtEq &&   bRev) 
1f3b0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1f3c0 47 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Gt,           /*
1f3d0 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   4: (start_const
1f3e0 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
1f3f0 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f  tEq && !bRev) */
1f400 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74  .      OP_SeekLt
1f410 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35  ,           /* 5
1f420 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1f430 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
1f440 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20  q &&  bRev) */. 
1f450 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20       OP_SeekGe, 
1f460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20            /* 6: 
1f470 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1f480 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
1f490 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
1f4a0 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20     OP_SeekLe    
1f4b0 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73          /* 7: (s
1f4c0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1f4d0 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
1f4e0 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d    bRev) */.    }
1f4f0 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
1f500 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d  st u8 aEndOp[] =
1f510 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70   {.      OP_Noop
1f520 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1f530 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72   0: (!end_constr
1f540 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20  aints) */.      
1f550 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20  OP_IdxGE,       
1f560 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f       /* 1: (end_
1f570 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21  constraints && !
1f580 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1f590 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20 20 20  P_IdxLT         
1f5a0 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63      /* 2: (end_c
1f5b0 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 62 52  onstraints && bR
1f5c0 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  ev) */.    };.  
1f5d0 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f    int nEq = pLoo
1f5e0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20  p->u.btree.nEq; 
1f5f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
1f600 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a   or IN terms */.
1f610 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65      int isMinQue
1f620 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
1f630 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1f640 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45   an optimized SE
1f650 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f  LECT min(x).. */
1f660 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65  .    int regBase
1f670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f680 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
1f690 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74  er holding const
1f6a0 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a  raint values */.
1f6b0 20 20 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20      int r1;     
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6d0 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65   /* Temp registe
1f6e0 72 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  r */.    WhereTe
1f6f0 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20  rm *pRangeStart 
1f700 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c  = 0;  /* Inequal
1f710 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
1f720 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f  t range start */
1f730 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1f740 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20  pRangeEnd = 0;  
1f750 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
1f760 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
1f770 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69  nge end */.    i
1f780 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20  nt startEq;     
1f790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f7a0 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61  rue if range sta
1f7b0 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  rt uses ==, >= o
1f7c0 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
1f7d0 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20  endEq;          
1f7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1f7f0 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73   if range end us
1f800 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
1f810 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
1f820 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20  _constraints;   
1f830 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
1f840 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61  range is constra
1f850 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ined */.    int 
1f860 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20  nConstraint;    
1f870 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f880 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  er of constraint
1f890 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e   terms */.    In
1f8a0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
1f8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f8c0 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20  e index we will 
1f8d0 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20  be using */.    
1f8e0 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20  int iIdxCur;    
1f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f900 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1f910 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
1f920 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52  .    int nExtraR
1f930 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
1f940 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1f950 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e  xtra registers n
1f960 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  eeded */.    int
1f970 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
1f980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
1f990 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  truction opcode 
1f9a0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
1f9b0 61 72 74 41 66 66 3b 20 20 20 20 20 20 20 20 20  artAff;         
1f9c0 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
1f9d0 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e  for start of ran
1f9e0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  ge constraint */
1f9f0 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 41  .    char *zEndA
1fa00 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
1fa10 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
1fa20 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63  r end of range c
1fa30 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20  onstraint */..  
1fa40 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
1fa50 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
1fa60 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c      iIdxCur = pL
1fa70 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a  evel->iIdxCur;..
1fa80 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c      /* If this l
1fa90 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20  oop satisfies a 
1faa0 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64  sort order (pOrd
1fab0 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68  erBy) request th
1fac0 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70  at .    ** was p
1fad0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
1fae0 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
1faf0 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
1fb00 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a  n(x) ..." .    *
1fb10 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68  * query, then th
1fb20 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e  e caller will on
1fb30 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f  ly allow the loo
1fb40 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20  p to run for.   
1fb50 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65   ** a single ite
1fb60 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  ration. This mea
1fb70 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ns that the firs
1fb80 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20  t row returned. 
1fb90 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74     ** should not
1fba0 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c   have a NULL val
1fbb0 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27  ue stored in 'x'
1fbc0 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20  . If column 'x' 
1fbd0 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  is.    ** the fi
1fbe0 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68  rst one after th
1fbf0 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63  e nEq equality c
1fc00 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
1fc10 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20  e index,.    ** 
1fc20 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f  this requires so
1fc30 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  me special handl
1fc40 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
1fc50 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
1fc60 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
1fc70 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20  DERBY_MIN)!=0.  
1fc80 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 62     && (pWInfo->b
1fc90 4f 42 53 61 74 21 3d 30 29 0a 20 20 20 20 20 26  OBSat!=0).     &
1fca0 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  & (pIdx->nColumn
1fcb0 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  >nEq).    ){.   
1fcc0 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f     /* assert( pO
1fcd0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31  rderBy->nExpr==1
1fce0 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20   ); */.      /* 
1fcf0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
1fd00 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[0].pExpr->iC
1fd10 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43  olumn==pIdx->aiC
1fd20 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f  olumn[nEq] ); */
1fd30 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72  .      isMinQuer
1fd40 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78  y = 1;.      nEx
1fd50 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
1fd60 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61  }..    /* Find a
1fd70 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ny inequality co
1fd80 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66  nstraint terms f
1fd90 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  or the start and
1fda0 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20   end .    ** of 
1fdb0 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20  the range. .    
1fdc0 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a  */.    j = nEq;.
1fdd0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1fde0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
1fdf0 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
1fe00 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20    pRangeStart = 
1fe10 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
1fe20 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  +];.      nExtra
1fe30 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Reg = 1;.    }. 
1fe40 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
1fe50 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
1fe60 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  P_LIMIT ){.     
1fe70 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f   pRangeEnd = pLo
1fe80 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1fe90 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
1fea0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
1feb0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1fec0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c  e to evaluate al
1fed0 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  l constraint ter
1fee0 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49  ms using == or I
1fef0 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f  N.    ** and sto
1ff00 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  re the values of
1ff10 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20   those terms in 
1ff20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
1ff30 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
1ff40 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65  rting at regBase
1ff50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67  ..    */.    reg
1ff60 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71  Base = codeAllEq
1ff70 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72  ualityTerms(pPar
1ff80 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e  se,pLevel,bRev,n
1ff90 45 78 74 72 61 52 65 67 2c 26 7a 53 74 61 72 74  ExtraReg,&zStart
1ffa0 41 66 66 29 3b 0a 20 20 20 20 7a 45 6e 64 41 66  Aff);.    zEndAf
1ffb0 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  f = sqlite3DbStr
1ffc0 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
1ffd0 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
1ffe0 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
1fff0 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20  ->addrNxt;..    
20000 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
20010 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64  ng a reverse ord
20020 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73  er scan on an as
20030 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f  cending index, o
20040 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61  r.    ** a forwa
20050 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  rd order scan on
20060 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
20070 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65  dex, interchange
20080 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61   the .    ** sta
20090 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73  rt and end terms
200a0 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e   (pRangeStart an
200b0 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20  d pRangeEnd)..  
200c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45    */.    if( (nE
200d0 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  q<pIdx->nColumn 
200e0 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e  && bRev==(pIdx->
200f0 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d  aSortOrder[nEq]=
20100 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29  =SQLITE_SO_ASC))
20110 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26  .     || (bRev &
20120 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  & pIdx->nColumn=
20130 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  =nEq).    ){.   
20140 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72     SWAP(WhereTer
20150 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20  m *, pRangeEnd, 
20160 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
20170 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73    }..    testcas
20180 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
20190 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  & (pRangeStart->
201a0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
201b0 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  E)!=0 );.    tes
201c0 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
201d0 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61  rt && (pRangeSta
201e0 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
201f0 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_GE)!=0 );.   
20200 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
20210 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45  eEnd && (pRangeE
20220 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
20230 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_LE)!=0 );.   
20240 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
20250 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45  eEnd && (pRangeE
20260 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
20270 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_GE)!=0 );.   
20280 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e   startEq = !pRan
20290 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67  geStart || pRang
202a0 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
202b0 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
202c0 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20  );.    endEq =  
202d0 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70   !pRangeEnd || p
202e0 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
202f0 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
20300 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63  GE);.    start_c
20310 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61  onstraints = pRa
20320 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e  ngeStart || nEq>
20330 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20  0;..    /* Seek 
20340 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
20350 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
20360 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20   the range. */. 
20370 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
20380 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
20390 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20  angeStart ){.   
203a0 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
203b0 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70  = pRangeStart->p
203c0 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
203d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
203e0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
203f0 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29  ht, regBase+nEq)
20400 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61  ;.      if( (pRa
20410 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
20420 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
20430 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
20440 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
20450 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
20460 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  t, regBase+nEq, 
20470 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
20480 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61  }.      if( zSta
20490 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20  rtAff ){.       
204a0 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
204b0 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
204c0 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  ht, zStartAff[nE
204d0 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  q])==SQLITE_AFF_
204e0 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20  NONE){.         
204f0 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   /* Since the co
20500 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62  mparison is to b
20510 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68  e performed with
20520 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a   no conversions.
20530 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70            ** app
20540 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72  lied to the oper
20550 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66  ands, set the af
20560 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20  finity to apply 
20570 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20  to pRight to .  
20580 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
20590 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a  E_AFF_NONE.  */.
205a0 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74            zStart
205b0 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
205c0 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
205d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
205e0 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
205f0 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
20600 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72  ge(pRight, zStar
20610 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20  tAff[nEq]) ){.  
20620 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
20630 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
20640 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
20650 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20    }.      }  .  
20660 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
20670 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
20680 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  e( pRangeStart->
20690 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
206a0 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
206b0 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
206c0 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
206d0 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20  isMinQuery ){.  
206e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
206f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
20700 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
20710 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
20720 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  aint++;.      st
20730 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  artEq = 0;.     
20740 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
20750 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
20760 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
20770 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
20780 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
20790 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
207a0 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b    op = aStartOp[
207b0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
207c0 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45  ts<<2) + (startE
207d0 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20  q<<1) + bRev];. 
207e0 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30     assert( op!=0
207f0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
20800 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ( op==OP_Rewind 
20810 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
20820 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a   op==OP_Last );.
20830 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
20840 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20  ==OP_SeekGt );. 
20850 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
20860 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20  =OP_SeekGe );.  
20870 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
20880 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20  OP_SeekLe );.   
20890 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
208a0 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20  P_SeekLt );.    
208b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
208c0 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
208d0 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
208e0 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
208f0 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  nt);..    /* Loa
20900 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  d the value for 
20910 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
20920 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65  onstraint at the
20930 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
20940 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79  ** range (if any
20950 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43  )..    */.    nC
20960 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
20970 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45  .    if( pRangeE
20980 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
20990 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
209a0 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69  eEnd->pExpr->pRi
209b0 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
209c0 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
209d0 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
209e0 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20  e+nEq, 1);.     
209f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20a00 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
20a10 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
20a20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
20a30 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
20a40 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b  ERM_VNULL)==0 ){
20a50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20a60 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
20a70 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
20a80 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
20a90 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
20aa0 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29     if( zEndAff )
20ab0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
20ac0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
20ad0 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e  nity(pRight, zEn
20ae0 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49  dAff[nEq])==SQLI
20af0 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20  TE_AFF_NONE){.  
20b00 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65          /* Since
20b10 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
20b20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d  is to be perform
20b30 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65  ed with no conve
20b40 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20  rsions.         
20b50 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74   ** applied to t
20b60 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74  he operands, set
20b70 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
20b80 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74   apply to pRight
20b90 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a   to .          *
20ba0 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
20bb0 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  E.  */.         
20bc0 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20   zEndAff[nEq] = 
20bd0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
20be0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20bf0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
20c00 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
20c10 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
20c20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b  zEndAff[nEq]) ){
20c30 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41  .          zEndA
20c40 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
20c50 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
20c60 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20     }.      }  . 
20c70 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66       codeApplyAf
20c80 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
20c90 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a  egBase, nEq+1, z
20ca0 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e  EndAff);.      n
20cb0 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
20cc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
20cd0 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
20ce0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
20cf0 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
20d00 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d  5-11662 */.    }
20d10 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
20d20 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
20d30 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73  StartAff);.    s
20d40 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
20d50 72 73 65 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66  rse->db, zEndAff
20d60 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f  );..    /* Top o
20d70 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20  f the loop body 
20d80 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  */.    pLevel->p
20d90 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
20da0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
20db0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
20dc0 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
20dd0 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64   is past the end
20de0 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
20df0 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f  /.    op = aEndO
20e00 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20  p[(pRangeEnd || 
20e10 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76  nEq) * (1 + bRev
20e20 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  )];.    testcase
20e30 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b  ( op==OP_Noop );
20e40 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
20e50 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20  p==OP_IdxGE );. 
20e60 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
20e70 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20  =OP_IdxLT );.   
20e80 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70   if( op!=OP_Noop
20e90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20ea0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
20eb0 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
20ec0 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
20ed0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20   nConstraint);. 
20ee0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20ef0 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45  ChangeP5(v, endE
20f00 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20  q!=bRev ?1:0);. 
20f10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
20f20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
20f30 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
20f40 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
20f50 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66   value.    ** of
20f60 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
20f70 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71 75  n that the inequ
20f80 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20  ality contrains 
20f90 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20  is not NULL..   
20fa0 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75   ** If it is, ju
20fb0 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
20fc0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
20fd0 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
20fe0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
20ff0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
21000 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
21010 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
21020 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
21030 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
21040 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
21050 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
21060 54 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4c  T );.    if( (pL
21070 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
21080 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
21090 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
210a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
210b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
210c0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
210d0 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b  dxCur, nEq, r1);
210e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
210f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
21100 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43  sNull, r1, addrC
21110 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ont);.    }.    
21120 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
21130 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
21140 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20  );..    /* Seek 
21150 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  the table cursor
21160 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  , if required */
21170 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d  .    disableTerm
21180 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53  (pLevel, pRangeS
21190 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62  tart);.    disab
211a0 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
211b0 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 69  RangeEnd);.    i
211c0 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b  f( !omitTable ){
211d0 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
211e0 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d   = iReleaseReg =
211f0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
21200 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
21210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21220 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
21230 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f  id, iIdxCur, iRo
21240 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
21250 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
21260 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
21270 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
21280 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21290 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
212a0 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f  _Seek, iCur, iRo
212b0 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66  widReg);  /* Def
212c0 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20  erred seek */.  
212d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f    }..    /* Reco
212e0 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  rd the instructi
212f0 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69  on used to termi
21300 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44  nate the loop. D
21310 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57  isable .    ** W
21320 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
21330 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74  s made redundant
21340 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 72 61   by the index ra
21350 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f  nge scan..    */
21360 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
21370 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21380 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  ONEROW ){.      
21390 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
213a0 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Noop;.    }else 
213b0 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
213c0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
213d0 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73  P_Prev;.    }els
213e0 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
213f0 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20  >op = OP_Next;. 
21400 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
21410 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  >p1 = iIdxCur;. 
21420 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
21430 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
21440 4f 4e 53 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b  ONSTRAINT)==0 ){
21450 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
21460 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
21470 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
21480 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  TEP;.    }else{.
21490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
214a0 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
214b0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69     }.  }else..#i
214c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
214d0 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
214e0 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  N.  if( pLoop->w
214f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
21500 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f  ULTI_OR ){.    /
21510 2a 20 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f  * Case 5:  Two o
21520 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c  r more separatel
21530 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20  y indexed terms 
21540 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a  connected by OR.
21550 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
21560 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
21570 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
21580 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b  BLE t1(a,b,c,d);
21590 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
215a0 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
215b0 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  a);.    **   CRE
215c0 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20  ATE INDEX i2 ON 
215d0 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(b);.    **   
215e0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20  CREATE INDEX i3 
215f0 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a  ON t1(c);.    **
21600 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
21610 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
21620 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28   a=5 OR b=7 OR (
21630 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20  c=11 AND d=13). 
21640 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
21650 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  the example, the
21660 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64  re are three ind
21670 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
21680 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20  cted by OR..    
21690 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  ** The top of th
216a0 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b  e loop looks lik
216b0 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
216c0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
216d0 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
216e0 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
216f0 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
21700 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20  reg 1.    **.   
21710 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61   ** Then, for ea
21720 63 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c  ch indexed term,
21730 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20   the following. 
21740 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
21750 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65  .    ** RowSetTe
21760 73 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74  st are such that
21770 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
21780 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
21790 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a   inserted.    **
217a0 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74   into the RowSet
217b0 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
217c0 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74  dy present, cont
217d0 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20  rol skips the.  
217e0 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64    ** Gosub opcod
217f0 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61  e and jumps stra
21800 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65  ight to the code
21810 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68   generated by Wh
21820 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a  ereEnd()..    **
21830 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73  .    **        s
21840 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
21850 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20  (<term>).    ** 
21860 20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54           RowSetT
21870 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  est             
21880 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f       # Insert ro
21890 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a  wid into rowset.
218a0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
218b0 47 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20  Gosub      2 A. 
218c0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
218d0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20  ite3WhereEnd(). 
218e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c     **.    ** Fol
218f0 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65  lowing the above
21900 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e  , code to termin
21910 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61  ate the loop. La
21920 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65  bel A, the targe
21930 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
21940 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d  Gosub above, jum
21950 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75  ps to the instru
21960 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65  ction right afte
21970 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20  r the Goto..    
21980 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
21990 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
219a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
219b0 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
219c0 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
219d0 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20            Goto  
219e0 20 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20       B          
219f0 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70        # The loop
21a00 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20   is finished..  
21a10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
21a20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e    A: <loop body>
21a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a40 20 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20   # Return data, 
21a50 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a  whatever..    **
21a60 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
21a70 20 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20   Return     2   
21a80 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a               # J
21a90 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
21aa0 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20  Gosub.    **.   
21ab0 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66   **       B: <af
21ac0 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20  ter the loop>.  
21ad0 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20    **.    */.    
21ae0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
21af0 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  Wc;    /* The OR
21b00 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f  -clause broken o
21b10 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  ut into subterms
21b20 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20   */.    SrcList 
21b30 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f  *pOrTab;       /
21b40 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c  * Shortened tabl
21b50 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61  e list or OR-cla
21b60 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  use generation *
21b70 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f  /.    Index *pCo
21b80 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  v = 0;          
21b90 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20     /* Potential 
21ba0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28  covering index (
21bb0 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20  or NULL) */.    
21bc0 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50  int iCovCur = pP
21bd0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f  arse->nTab++;  /
21be0 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f  * Cursor used fo
21bf0 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69  r index scans (i
21c00 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69  f any) */..    i
21c10 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  nt regReturn = +
21c20 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
21c30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
21c40 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f  ster used with O
21c50 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69  P_Gosub */.    i
21c60 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30  nt regRowset = 0
21c70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21c80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
21c90 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20  ster for RowSet 
21ca0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e  object */.    in
21cb0 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20  t regRowid = 0; 
21cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cd0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
21ce0 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69  ter holding rowi
21cf0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f  d */.    int iLo
21d00 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  opBody = sqlite3
21d10 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
21d20 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c  ;  /* Start of l
21d30 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20  oop body */.    
21d40 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20  int iRetInit;   
21d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
21d70 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72  ress of regRetur
21d80 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e  n init */.    in
21d90 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  t untestedTerms 
21da0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
21db0 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e   /* Some terms n
21dc0 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65  ot completely te
21dd0 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sted */.    int 
21de0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
21df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21e00 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
21e10 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64  /.    Expr *pAnd
21e20 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Expr = 0;       
21e30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22           /* An "
21e40 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78  .. AND (...)" ex
21e50 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a  pression */.   .
21e60 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
21e70 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20  p->aLTerm[0];.  
21e80 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
21e90 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
21ea0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
21eb0 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20  or & WO_OR );.  
21ec0 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
21ed0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
21ee0 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20  _ORINFO)!=0 );. 
21ef0 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72     pOrWc = &pTer
21f00 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
21f10 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
21f20 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20   = OP_Return;.  
21f30 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72    pLevel->p1 = r
21f40 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f  egReturn;..    /
21f50 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20 53  * Set up a new S
21f60 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62  rcList in pOrTab
21f70 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
21f80 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e  table being scan
21f90 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ned.    ** by th
21fa0 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61  is loop in the a
21fb0 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c  [0] slot and all
21fc0 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
21fd0 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73   in a[1..] slots
21fe0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65  ..    ** This be
21ff0 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73  comes the SrcLis
22000 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  t in the recursi
22010 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ve call to sqlit
22020 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a  e3WhereBegin()..
22030 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
22040 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
22050 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f  ){.      int nNo
22060 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
22070 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
22080 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64  umber of notRead
22090 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  y tables */.    
220a0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
220b0 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20  _item *origSrc; 
220c0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
220d0 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  list of tables *
220e0 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64  /.      nNotRead
220f0 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  y = pWInfo->nLev
22100 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b  el - iLevel - 1;
22110 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
22120 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f  sqlite3StackAllo
22130 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c  cRaw(pParse->db,
22140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
22160 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e  eof(*pOrTab)+ nN
22170 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70  otReady*sizeof(p
22180 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20  OrTab->a[0]));. 
22190 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d       if( pOrTab=
221a0 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52  =0 ) return notR
221b0 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54  eady;.      pOrT
221c0 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38  ab->nAlloc = (u8
221d0 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29  )(nNotReady + 1)
221e0 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
221f0 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e  nSrc = pOrTab->n
22200 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d  Alloc;.      mem
22210 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70  cpy(pOrTab->a, p
22220 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28  TabItem, sizeof(
22230 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20  *pTabItem));.   
22240 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49     origSrc = pWI
22250 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
22260 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b  ;.      for(k=1;
22270 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b   k<=nNotReady; k
22280 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ++){.        mem
22290 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b  cpy(&pOrTab->a[k
222a0 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76  ], &origSrc[pLev
222b0 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69  el[k].iFrom], si
222c0 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b  zeof(pOrTab->a[k
222d0 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
222e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f   }else{.      pO
222f0 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  rTab = pWInfo->p
22300 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a  TabList;.    }..
22310 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
22320 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67  e the rowset reg
22330 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ister to contain
22340 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55   NULL. An SQL NU
22350 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71  LL is .    ** eq
22360 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65  uivalent to an e
22370 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20  mpty rowset..   
22380 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20   **.    ** Also 
22390 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65  initialize regRe
223a0 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20  turn to contain 
223b0 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
223c0 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a  he instruction .
223d0 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
223e0 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
223f0 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68   OP_Return at th
22400 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
22410 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a  loop. This.    *
22420 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  * is required in
22430 20 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c   a few obscure L
22440 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77  EFT JOIN cases w
22450 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d  here control jum
22460 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  ps.    ** over t
22470 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
22480 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  op into the body
22490 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20   of it. In this 
224a0 63 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  case the .    **
224b0 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73   correct respons
224c0 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66  e for the end-of
224d0 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20  -loop code (the 
224e0 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f  OP_Return) is to
224f0 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68   .    ** fall th
22500 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
22510 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a  t instruction, j
22520 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78  ust as an OP_Nex
22530 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a  t does if.    **
22540 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e   called on an un
22550 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73  initialized curs
22560 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
22570 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
22580 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
22590 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30  UPLICATES_OK)==0
225a0 20 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f 77   ){.      regRow
225b0 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
225c0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52  nMem;.      regR
225d0 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
225e0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
225f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22600 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
22610 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a  gRowset);.    }.
22620 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20 73      iRetInit = s
22630 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22640 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
22650 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a  0, regReturn);..
22660 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 72      /* If the or
22670 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61  iginal WHERE cla
22680 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68 65 20  use is z of the 
22690 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20 78 32  form:  (x1 OR x2
226a0 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20   OR ...) AND y. 
226b0 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65     ** Then for e
226c0 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20 65 76  very term xN, ev
226d0 61 6c 75 61 74 65 20 61 73 20 74 68 65 20 73 75  aluate as the su
226e0 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20  bexpression: xN 
226f0 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61  AND z.    ** Tha
22700 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69 6e 20  t way, terms in 
22710 79 20 74 68 61 74 20 61 72 65 20 66 61 63 74 6f  y that are facto
22720 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64 69 73  red into the dis
22730 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20  junction will.  
22740 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64 20 75    ** be picked u
22750 70 20 62 79 20 74 68 65 20 72 65 63 75 72 73 69  p by the recursi
22760 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ve calls to sqli
22770 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
22780 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20  below..    **.  
22790 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65    ** Actually, e
227a0 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f  ach subexpressio
227b0 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74  n is converted t
227c0 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77 68 65  o "xN AND w" whe
227d0 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a 20 74  re w is.    ** t
227e0 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e 67 22  he "interesting"
227f0 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65   terms of z - te
22800 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e 6f 74  rms that did not
22810 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68   originate in th
22820 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55  e.    ** ON or U
22830 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  SING clause of a
22840 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20   LEFT JOIN, and 
22850 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 75  terms that are u
22860 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a  sable as .    **
22870 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a   indices..    **
22880 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 70 74  .    ** This opt
22890 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f 20 6f  imization also o
228a0 6e 6c 79 20 61 70 70 6c 69 65 73 20 69 66 20 74  nly applies if t
228b0 68 65 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20  he (x1 OR x2 OR 
228c0 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20 2a 2a  ...) term.    **
228d0 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
228e0 64 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  d in the ON clau
228f0 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
22900 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 69  N..    ** See ti
22910 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e  cket http://www.
22920 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69  sqlite.org/src/i
22930 6e 66 6f 2f 66 32 33 36 39 33 30 34 65 34 0a 20  nfo/f2369304e4. 
22940 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57     */.    if( pW
22950 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20  C->nTerm>1 ){.  
22960 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20      int iTerm;. 
22970 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d 3d 30       for(iTerm=0
22980 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54 65  ; iTerm<pWC->nTe
22990 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20  rm; iTerm++){.  
229a0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
229b0 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d  r = pWC->a[iTerm
229c0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
229d0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
229e0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
229f0 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74 69  romJoin) ) conti
22a00 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
22a10 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77   pWC->a[iTerm].w
22a20 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
22a30 49 52 54 55 41 4c 7c 54 45 52 4d 5f 4f 52 49 4e  IRTUAL|TERM_ORIN
22a40 46 4f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  FO) ) continue;.
22a50 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43          if( (pWC
22a60 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72  ->a[iTerm].eOper
22a70 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d  ator & WO_ALL)==
22a80 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
22a90 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
22aa0 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
22ab0 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
22ac0 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64  0);.        pAnd
22ad0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
22ae0 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
22af0 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70  , pAndExpr, pExp
22b00 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
22b10 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29    if( pAndExpr )
22b20 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78  {.        pAndEx
22b30 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
22b40 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44  r(pParse, TK_AND
22b50 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30  , 0, pAndExpr, 0
22b60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
22b70 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
22b80 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b  ii<pOrWc->nTerm;
22b90 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68   ii++){.      Wh
22ba0 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
22bb0 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d   = &pOrWc->a[ii]
22bc0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
22bd0 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
22be0 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72  =iCur || (pOrTer
22bf0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
22c00 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20  O_AND)!=0 ){.   
22c10 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a       WhereInfo *
22c20 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20  pSubWInfo;      
22c30 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20      /* Info for 
22c40 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73  single OR-term s
22c50 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  can */.        E
22c60 78 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70  xpr *pOrExpr = p
22c70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20  OrTerm->pExpr;. 
22c80 20 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45         if( pAndE
22c90 78 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50  xpr && !ExprHasP
22ca0 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c  roperty(pOrExpr,
22cb0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
22cc0 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45  .          pAndE
22cd0 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72  xpr->pLeft = pOr
22ce0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
22cf0 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78  pOrExpr = pAndEx
22d00 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
22d10 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
22d20 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72  rough table entr
22d30 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ies that match t
22d40 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a  erm pOrTerm. */.
22d50 20 20 20 20 20 20 20 20 70 53 75 62 57 49 6e 66          pSubWInf
22d60 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
22d70 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f  Begin(pParse, pO
22d80 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30  rTab, pOrExpr, 0
22d90 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
22da0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
22db0 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
22dc0 53 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f  SE | WHERE_AND_O
22dd0 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20  NLY |.          
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
22df0 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20  ERE_FORCE_TABLE 
22e00 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  | WHERE_ONETABLE
22e10 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b  _ONLY, iCovCur);
22e20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
22e30 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50   pSubWInfo || pP
22e40 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
22e50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
22e60 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
22e70 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20    if( pSubWInfo 
22e80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65  ){.          Whe
22e90 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70  reLoop *pSubLoop
22ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c  ;.          expl
22eb0 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20  ainOneScan(.    
22ec0 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
22ed0 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57  , pOrTab, &pSubW
22ee0 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76  Info->a[0], iLev
22ef0 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  el, pLevel->iFro
22f00 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29  m, 0.          )
22f10 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22f20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
22f30 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
22f40 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b  ICATES_OK)==0 ){
22f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
22f60 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f   iSet = ((ii==pO
22f70 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31  rWc->nTerm-1)?-1
22f80 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  :ii);.          
22f90 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20    int r;.       
22fa0 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33       r = sqlite3
22fb0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
22fc0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  n(pParse, pTabIt
22fd0 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43  em->pTab, -1, iC
22fe0 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ur, .           
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
23010 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20  gRowid, 0);.    
23020 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23030 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
23040 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72  OP_RowSetTest, r
23050 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20  egRowset,.      
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23070 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
23080 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
23090 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29  r(v)+2, r, iSet)
230a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
230b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
230c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
230d0 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e  Gosub, regReturn
230e0 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
230f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23100 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
23110 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65  tedTerms flag me
23120 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52  ans that this OR
23130 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
23140 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65  ** contained one
23150 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72   or more AND ter
23160 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64  m from a notRead
23170 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20  y table.  The.  
23180 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
23190 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61   from the notRea
231a0 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e  dy table could n
231b0 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64  ot be tested and
231c0 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   will.          
231d0 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65  ** need to be te
231e0 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20  sted later..    
231f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
23200 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
23210 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
23220 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ) untestedTerms 
23230 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
23240 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  /* If all of the
23250 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
23260 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65  rms are optimize
23270 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
23280 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
23290 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64  dex, and the ind
232a0 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  ex is opened usi
232b0 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73  ng the same curs
232c0 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  or number.      
232d0 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63      ** by each c
232e0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
232f0 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20  ereBegin() made 
23300 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74  by this loop, it
23310 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a   may.          *
23320 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  * be possible to
23330 20 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20   use that index 
23340 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
23350 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
23360 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
23370 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  f the call to sq
23380 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
23390 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64  ) above resulted
233a0 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a   in a scan that.
233b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
233c0 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20  s an index, and 
233d0 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74  this is either t
233e0 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e  he first OR-conn
233f0 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20  ected term.     
23400 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
23410 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69  d or the index i
23420 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
23430 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70  at used by all p
23440 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
23450 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20    ** terms, set 
23460 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64  pCov to the cand
23470 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69  idate covering i
23480 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c  ndex. Otherwise,
23490 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20   set .          
234a0 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20  ** pCov to NULL 
234b0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
234c0 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f   no candidate co
234d0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c  vering index wil
234e0 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
234f0 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20  be available..  
23500 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
23510 20 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20       pSubLoop = 
23520 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  pSubWInfo->a[0].
23530 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
23540 20 20 61 73 73 65 72 74 28 20 28 70 53 75 62 4c    assert( (pSubL
23550 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
23560 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
23570 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
23580 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e   if( (pSubLoop->
23590 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
235a0 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
235b0 20 20 20 20 20 20 20 26 26 20 28 69 69 3d 3d 30         && (ii==0
235c0 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e   || pSubLoop->u.
235d0 62 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43  btree.pIndex==pC
235e0 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ov).          ){
235f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
23600 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e  ert( pSubWInfo->
23610 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43  a[0].iIdxCur==iC
23620 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20  ovCur );.       
23630 20 20 20 20 20 70 43 6f 76 20 3d 20 70 53 75 62       pCov = pSub
23640 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
23650 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20  ndex;.          
23660 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23670 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20     pCov = 0;.   
23680 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
23690 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68      /* Finish th
236a0 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  e loop through t
236b0 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61  able entries tha
236c0 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72  t match term pOr
236d0 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20  Term. */.       
236e0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
236f0 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20  nd(pSubWInfo);. 
23700 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23710 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
23720 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70  l->u.pCovidx = p
23730 43 6f 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  Cov;.    if( pCo
23740 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  v ) pLevel->iIdx
23750 43 75 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20  Cur = iCovCur;. 
23760 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
23770 29 7b 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70  ){.      pAndExp
23780 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  r->pLeft = 0;.  
23790 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
237a0 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
237b0 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20  , pAndExpr);.   
237c0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
237d0 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52  beChangeP1(v, iR
237e0 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56  etInit, sqlite3V
237f0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
23800 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
23810 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23820 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
23830 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73  >addrBrk);.    s
23840 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
23850 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42  eLabel(v, iLoopB
23860 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ody);..    if( p
23870 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
23880 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72  ) sqlite3StackFr
23890 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
238a0 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20  OrTab);.    if( 
238b0 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  !untestedTerms )
238c0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
238d0 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d  vel, pTerm);.  }
238e0 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
238f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
23900 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20  TIMIZATION */.. 
23910 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 36   {.    /* Case 6
23920 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75  :  There is no u
23930 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65  sable index.  We
23940 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c   must do a compl
23950 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ete.    **      
23960 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20      scan of the 
23970 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20  entire table..  
23980 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20    */.    static 
23990 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d  const u8 aStep[]
239a0 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50   = { OP_Next, OP
239b0 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61  _Prev };.    sta
239c0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
239d0 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77  art[] = { OP_Rew
239e0 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a  ind, OP_Last };.
239f0 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76      assert( bRev
23a00 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29  ==0 || bRev==1 )
23a10 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
23a20 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a   = aStep[bRev];.
23a30 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
23a40 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
23a50 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69  l->p2 = 1 + sqli
23a60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23a70 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69   aStart[bRev], i
23a80 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20  Cur, addrBrk);. 
23a90 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20     pLevel->p5 = 
23aa0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
23ab0 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b  S_FULLSCAN_STEP;
23ac0 0a 20 20 7d 0a 20 20 6e 65 77 4e 6f 74 52 65 61  .  }.  newNotRea
23ad0 64 79 20 3d 20 6e 6f 74 52 65 61 64 79 20 26 20  dy = notReady & 
23ae0 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  ~getMask(&pWInfo
23af0 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
23b00 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20  );..  /* Insert 
23b10 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76 65  code to test eve
23b20 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ry subexpression
23b30 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d   that can be com
23b40 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d  pletely.  ** com
23b50 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  puted using the 
23b60 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74  current set of t
23b70 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
23b80 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
23b90 4f 46 3a 20 52 2d 34 39 35 32 35 2d 35 30 39 33  OF: R-49525-5093
23ba0 35 20 54 65 72 6d 73 20 74 68 61 74 20 63 61 6e  5 Terms that can
23bb0 6e 6f 74 20 62 65 20 73 61 74 69 73 66 69 65 64  not be satisfied
23bc0 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68   through.  ** th
23bd0 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  e use of indices
23be0 20 62 65 63 6f 6d 65 20 74 65 73 74 73 20 74 68   become tests th
23bf0 61 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  at are evaluated
23c00 20 61 67 61 69 6e 73 74 20 65 61 63 68 20 72 6f   against each ro
23c10 77 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65  w of.  ** the re
23c20 6c 65 76 61 6e 74 20 69 6e 70 75 74 20 74 61 62  levant input tab
23c30 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
23c40 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
23c50 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b  pWC->nTerm; j>0;
23c60 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j--, pTerm++){.
23c70 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20      Expr *pE;.  
23c80 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
23c90 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
23ca0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
23cb0 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36  IMP: R-30575-116
23cc0 36 32 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61  62 */.    testca
23cd0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
23ce0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
23cf0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
23d00 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
23d10 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
23d20 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
23d30 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
23d40 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 65  ->prereqAll & ne
23d50 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  wNotReady)!=0 ){
23d60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
23d70 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
23d80 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20  dTerms==0.      
23d90 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
23da0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
23db0 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
23dc0 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20  _ONLY)!=0 );.   
23dd0 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73     pWInfo->untes
23de0 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20  tedTerms = 1;.  
23df0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
23e00 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65    }.    pE = pTe
23e10 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
23e20 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
23e30 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
23e40 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
23e50 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
23e60 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
23e70 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
23e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23e90 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
23ea0 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43  Parse, pE, addrC
23eb0 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
23ec0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65  IFNULL);.    pTe
23ed0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
23ee0 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a  ERM_CODED;.  }..
23ef0 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
23f00 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70   to test for imp
23f10 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  lied constraints
23f20 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69   based on transi
23f30 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74  tivity.  ** of t
23f40 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72  he "==" operator
23f50 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
23f60 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52  ple: If the WHER
23f70 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
23f80 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e  s "t1.a=t2.b" an
23f90 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a  d "t2.b=123".  *
23fa0 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64  * and we are cod
23fb0 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ing the t1 loop 
23fc0 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  and the t2 loop 
23fd0 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65  has not yet code
23fe0 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20  d,.  ** then we 
23ff0 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22  cannot use the "
24000 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74  t1.a=t2.b" const
24010 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61  raint, but we ca
24020 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20  n code.  ** the 
24030 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32  implied "t1.a=12
24040 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  3" constraint.. 
24050 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
24060 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
24070 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
24080 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
24090 70 72 20 2a 70 45 3b 0a 20 20 20 20 57 68 65 72  pr *pE;.    Wher
240a0 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20  eTerm *pAlt;.   
240b0 20 45 78 70 72 20 73 45 71 3b 0a 20 20 20 20 69   Expr sEq;.    i
240c0 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
240d0 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
240e0 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
240f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
24100 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
24110 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56 7c 57 4f  or!=(WO_EQUIV|WO
24120 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  _EQ) ) continue;
24130 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
24140 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
24150 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
24160 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
24170 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
24180 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
24190 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
241a0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
241b0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
241c0 69 67 68 74 20 26 20 6e 65 77 4e 6f 74 52 65 61  ight & newNotRea
241d0 64 79 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 41  dy)!=0 );.    pA
241e0 6c 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  lt = findTerm(pW
241f0 43 2c 20 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e  C, iCur, pTerm->
24200 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f  u.leftColumn, no
24210 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  tReady, WO_EQ|WO
24220 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  _IN, 0);.    if(
24230 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69   pAlt==0 ) conti
24240 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 41 6c  nue;.    if( pAl
24250 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  t->wtFlags & (TE
24260 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
24270 69 6e 75 65 3b 0a 20 20 20 20 74 65 73 74 63 61  inue;.    testca
24280 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61  se( pAlt->eOpera
24290 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
242a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 6c     testcase( pAl
242b0 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
242c0 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 56 64 62 65  O_IN );.    Vdbe
242d0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
242e0 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76  "begin transitiv
242f0 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b  e constraint"));
24300 0a 20 20 20 20 73 45 71 20 3d 20 2a 70 41 6c 74  .    sEq = *pAlt
24310 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 73 45 71  ->pExpr;.    sEq
24320 2e 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65  .pLeft = pE->pLe
24330 66 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ft;.    sqlite3E
24340 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
24350 65 2c 20 26 73 45 71 2c 20 61 64 64 72 43 6f 6e  e, &sEq, addrCon
24360 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
24370 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NULL);.  }..  /*
24380 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45   For a LEFT OUTE
24390 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65  R JOIN, generate
243a0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
243b0 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
243c0 74 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61  that.  ** at lea
243d0 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  st one row of th
243e0 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68 61  e right table ha
243f0 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65  s matched the le
24400 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f  ft table.  .  */
24410 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69  .  if( pLevel->i
24420 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
24430 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
24440 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
24450 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
24460 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24470 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
24480 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69  er, 1, pLevel->i
24490 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56  LeftJoin);.    V
244a0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
244b0 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e  record LEFT JOIN
244c0 20 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71 6c   hit"));.    sql
244d0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
244e0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
244f0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
24500 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54  , j=0; j<pWC->nT
24510 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  erm; j++, pTerm+
24520 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  +){.      testca
24530 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
24540 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
24550 4c 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  L );  /* IMP: R-
24560 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20  30575-11662 */. 
24570 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
24580 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
24590 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
245a0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
245b0 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
245c0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
245d0 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
245e0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
245f0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 65 77  >prereqAll & new
24600 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  NotReady)!=0 ){.
24610 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24620 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
24630 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20  Terms );.       
24640 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
24650 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
24660 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b   pTerm->pExpr );
24670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24680 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
24690 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
246a0 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
246b0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
246c0 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
246d0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
246e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
246f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
24700 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c  Reg(pParse, iRel
24710 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74  easeReg);..  ret
24720 75 72 6e 20 6e 65 77 4e 6f 74 52 65 61 64 79 3b  urn newNotReady;
24730 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  .}..#ifdef WHERE
24740 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
24750 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72  .** Print a Wher
24760 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72  eLoop object for
24770 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f   debugging purpo
24780 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ses.*/.static vo
24790 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e  id whereLoopPrin
247a0 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t(WhereLoop *p, 
247b0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
247c0 74 29 7b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31  t){.  int nb = 1
247d0 2b 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  +(pTabList->nSrc
247e0 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74 20  +7)/8;.  struct 
247f0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
24800 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  tem = pTabList->
24810 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54  a + p->iTab;.  T
24820 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
24830 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69  em->pTab;.  sqli
24840 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24850 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a  %c%2d.%0*llx.%0*
24860 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20  llx", p->cId,.  
24870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24880 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20     p->iTab, nb, 
24890 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c  p->maskSelf, nb,
248a0 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73   p->prereq);.  s
248b0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
248c0 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20  f(" %12s",.     
248d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248e0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20  pItem->zAlias ? 
248f0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20  pItem->zAlias : 
24900 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
24910 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
24920 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
24930 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
24940 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  if( p->u.btree.p
24950 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 63  Index ){.      c
24960 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
24970 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
24980 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  ndex->zName;.   
24990 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
249a0 29 20 7a 4e 61 6d 65 20 3d 20 22 69 70 6b 22 3b  ) zName = "ipk";
249b0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
249c0 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
249d0 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31  e_autoindex_", 1
249e0 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
249f0 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33   int i = sqlite3
24a00 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20  Strlen30(zName) 
24a10 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69  - 1;.        whi
24a20 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f  le( zName[i]!='_
24a30 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) i--;.       
24a40 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20   zName += i;.   
24a50 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
24a60 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e  e3DebugPrintf(".
24a70 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d  %-16s %2d", zNam
24a80 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  e, p->u.btree.nE
24a90 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  q);.    }else{. 
24aa0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24ab0 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22  gPrintf("%20s","
24ac0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
24ad0 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
24ae0 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61      if( p->u.vta
24af0 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20  b.idxStr ){.    
24b00 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
24b10 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c  rintf("(%d,\"%s\
24b20 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20  ",%x)",.        
24b30 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61          p->u.vta
24b40 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
24b50 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75  tab.idxStr, p->u
24b60 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
24b70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24b80 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
24b90 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c  rintf("(%d,%x)",
24ba0 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
24bb0 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  m, p->u.vtab.omi
24bc0 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  tMask);.    }.  
24bd0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24be0 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a  intf(" %-19s", z
24bf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
24c00 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71  ree(z);.  }.  sq
24c10 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24c20 28 22 20 66 20 25 30 34 78 20 4e 20 25 64 22 2c  (" f %04x N %d",
24c30 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
24c40 6e 4c 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74  nLTerm);.  sqlit
24c50 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
24c60 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22  cost %d,%d,%d\n"
24c70 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e  , p->rSetup, p->
24c80 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a  rRun, p->nOut);.
24c90 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
24ca0 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d  Convert bulk mem
24cb0 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64  ory into a valid
24cc0 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
24cd0 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a  can be passed.**
24ce0 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65   to whereLoopCle
24cf0 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a  ar harmlessly..*
24d00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
24d10 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72  ereLoopInit(Wher
24d20 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e  eLoop *p){.  p->
24d30 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65  aLTerm = p->aLTe
24d40 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c  rmSpace;.  p->nL
24d50 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  Term = 0;.  p->n
24d60 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a  LSlot = ArraySiz
24d70 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  e(p->aLTermSpace
24d80 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20  );.  p->wsFlags 
24d90 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
24da0 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  ear the WhereLoo
24db0 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76  p.u union.  Leav
24dc0 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65  e WhereLoop.pLTe
24dd0 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74  rm intact..*/.st
24de0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
24df0 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71  oopClearUnion(sq
24e00 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
24e10 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
24e20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
24e30 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
24e40 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45  |WHERE_AUTO_INDE
24e50 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  X) ){.    if( (p
24e60 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
24e70 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
24e80 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e  =0 && p->u.vtab.
24e90 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
24ea0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
24eb0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
24ec0 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
24ed0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
24ee0 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
24ef0 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  idxStr = 0;.    
24f00 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73  }else if( (p->ws
24f10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
24f20 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20  TO_INDEX)!=0 && 
24f30 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
24f40 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x!=0 ){.      sq
24f50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
24f60 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
24f70 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20  x->zColAff);.   
24f80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
24f90 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  (db, p->u.btree.
24fa0 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70  pIndex);.      p
24fb0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
24fc0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
24fd0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
24fe0 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d  ate internal mem
24ff0 6f 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68  ory used by a Wh
25000 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
25010 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
25020 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c  ereLoopClear(sql
25030 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
25040 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
25050 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54  ->aLTerm!=p->aLT
25060 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74  ermSpace ) sqlit
25070 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
25080 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65  aLTerm);.  where
25090 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64  LoopClearUnion(d
250a0 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f  b, p);.  whereLo
250b0 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a  opInit(p);.}../*
250c0 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65  .** Increase the
250d0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
250e0 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c  on for pLoop->aL
250f0 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20  Term[] to be at 
25100 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74  least n..*/.stat
25110 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
25120 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a  Resize(sqlite3 *
25130 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
25140 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72  , int n){.  Wher
25150 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20  eTerm **paNew;. 
25160 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d   if( p->nLSlot>=
25170 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n ) return SQLIT
25180 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37  E_OK;.  n = (n+7
25190 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20  )&~7;.  paNew = 
251a0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
251b0 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d  aw(db, sizeof(p-
251c0 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a  >aLTerm[0])*n);.
251d0 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29    if( paNew==0 )
251e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
251f0 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  OMEM;.  memcpy(p
25200 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c  aNew, p->aLTerm,
25210 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72   sizeof(p->aLTer
25220 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29  m[0])*p->nLSlot)
25230 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  ;.  if( p->aLTer
25240 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
25250 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
25260 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
25270 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  ;.  p->aLTerm = 
25280 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  paNew;.  p->nLSl
25290 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  ot = n;.  return
252a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
252b0 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f  *.** Transfer co
252c0 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73  ntent from the s
252d0 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f  econd pLoop into
252e0 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73   the first..*/.s
252f0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
25300 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20  oopXfer(sqlite3 
25310 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
25320 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pTo, WhereLoop *
25330 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 77 68  pFrom){.  if( wh
25340 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
25350 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c  , pTo, pFrom->nL
25360 54 65 72 6d 29 20 29 20 72 65 74 75 72 6e 20 53  Term) ) return S
25370 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 77  QLITE_NOMEM;.  w
25380 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
25390 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 6d  on(db, pTo);.  m
253a0 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d  emcpy(pTo, pFrom
253b0 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45  , WHERE_LOOP_XFE
253c0 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28  R_SZ);.  memcpy(
253d0 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72  pTo->aLTerm, pFr
253e0 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d  om->aLTerm, pTo-
253f0 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70  >nLTerm*sizeof(p
25400 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b  To->aLTerm[0]));
25410 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73  .  if( pFrom->ws
25420 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
25430 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20  RTUALTABLE ){.  
25440 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e    pFrom->u.vtab.
25450 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
25460 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d  }else if( (pFrom
25470 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
25480 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
25490 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
254a0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
254b0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
254c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
254d0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65  .** Delete a Whe
254e0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
254f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
25500 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c  reLoopDelete(sql
25510 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
25520 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  oop *p){.  where
25530 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29  LoopClear(db, p)
25540 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
25550 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
25560 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49  ** Free a WhereI
25570 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f  nfo structure.*/
25580 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
25590 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74  reInfoFree(sqlit
255a0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66  e3 *db, WhereInf
255b0 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66  o *pWInfo){.  if
255c0 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29  ( ALWAYS(pWInfo)
255d0 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61   ){.    whereCla
255e0 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f  useClear(&pWInfo
255f0 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c  ->sWC);.    whil
25600 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  e( pWInfo->pLoop
25610 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  s ){.      Where
25620 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f  Loop *p = pWInfo
25630 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20  ->pLoops;.      
25640 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d  pWInfo->pLoops =
25650 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
25660 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
25670 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
25680 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
25690 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
256a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
256b0 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65  nsert or replace
256c0 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74   a WhereLoop ent
256d0 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d  ry using the tem
256e0 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a  plate supplied..
256f0 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
25700 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  g WhereLoop entr
25710 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77  y might be overw
25720 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65  ritten if the ne
25730 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73  w template.** is
25740 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20   better and has 
25750 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
25760 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70  es.  Or the temp
25770 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e  late will be ign
25780 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69  ored.** and no i
25790 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72  nsert will occur
257a0 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
257b0 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73  WhereLoop is fas
257c0 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66  ter and has.** f
257d0 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
257e0 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c  s than the templ
257f0 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ate.  Otherwise 
25800 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20  a new WhereLoop 
25810 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65  is.** added base
25820 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  d on the templat
25830 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69  e..**.** If pBui
25840 6c 64 65 72 2d 3e 70 42 65 73 74 20 69 73 20 6e  lder->pBest is n
25850 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20  ot NULL then we 
25860 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
25870 74 68 65 20 76 65 72 79 0a 2a 2a 20 62 65 73 74  the very.** best
25880 20 74 65 6d 70 6c 61 74 65 20 61 6e 64 20 74 68   template and th
25890 61 74 20 74 65 6d 70 6c 61 74 65 20 73 68 6f 75  at template shou
258a0 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ld be stored in 
258b0 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 2e  pBuilder->pBest.
258c0 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d  .** If pBuilder-
258d0 3e 70 42 65 73 74 20 69 73 20 4e 55 4c 4c 20 74  >pBest is NULL t
258e0 68 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68  hen a list of th
258f0 65 20 62 65 73 74 20 74 65 6d 70 6c 61 74 65 73  e best templates
25900 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69   are stored.** i
25910 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  n pBuilder->pWIn
25920 66 6f 2d 3e 70 4c 6f 6f 70 73 2e 0a 2a 2a 0a 2a  fo->pLoops..**.*
25930 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74  * When accumulat
25940 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f  ing multiple loo
25950 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65  ps (when pBuilde
25960 72 2d 3e 70 42 65 73 74 20 69 73 20 4e 55 4c 4c  r->pBest is NULL
25970 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69  ) we.** still mi
25980 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69  ght overwrite si
25990 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68  milar loops with
259a0 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
259b0 65 20 69 66 20 74 68 65 0a 2a 2a 20 74 65 6d 70  e if the.** temp
259c0 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 2e 20  late is better. 
259d0 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76   Loops may be ov
259e0 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
259f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63   following .** c
25a00 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65  onditions are me
25a10 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  t:.**.**    (1) 
25a20 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
25a30 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20  ame iTab..**    
25a40 28 32 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (2)  They have t
25a50 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78  he same iSortIdx
25a60 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65  ..**    (3)  The
25a70 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61   template has sa
25a80 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65 70 65  me or fewer depe
25a90 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
25aa0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
25ab0 2a 20 20 20 20 28 34 29 20 20 54 68 65 20 74 65  *    (4)  The te
25ac0 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65 20 73  mplate has the s
25ad0 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
25ae0 74 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  t than the curre
25af0 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 35  nt loop.**    (5
25b00 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
25b10 75 73 65 73 20 6d 6f 72 65 20 74 65 72 6d 73 20  uses more terms 
25b20 6f 66 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  of the same inde
25b30 78 20 62 75 74 20 68 61 73 20 6e 6f 20 61 64 64  x but has no add
25b40 69 74 69 6f 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  itional.**      
25b50 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20     dependencies 
25b60 20 20 20 20 20 20 20 20 20 0a 2a 2f 0a 73 74 61           .*/.sta
25b70 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
25b80 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f  pInsert(WhereLoo
25b90 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
25ba0 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  er, WhereLoop *p
25bb0 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65  Template){.  Whe
25bc0 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c  reLoop **ppPrev,
25bd0 20 2a 70 2c 20 2a 70 4e 65 78 74 20 3d 20 30 3b   *p, *pNext = 0;
25be0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
25bf0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
25c00 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  >pWInfo;.  sqlit
25c10 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
25c20 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20  >pParse->db;..  
25c30 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e  /* If pBuilder->
25c40 70 42 65 73 74 20 69 73 20 64 65 66 69 6e 65 64  pBest is defined
25c50 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70  , then only keep
25c60 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 73 69   track of the si
25c70 6e 67 6c 65 0a 20 20 2a 2a 20 62 65 73 74 20 57  ngle.  ** best W
25c80 68 65 72 65 4c 6f 6f 70 2e 20 20 70 42 75 69 6c  hereLoop.  pBuil
25c90 64 65 72 2d 3e 70 42 65 73 74 2d 3e 6d 61 73 6b  der->pBest->mask
25ca0 53 65 6c 66 3d 3d 30 20 69 6e 64 69 63 61 74 65  Self==0 indicate
25cb0 73 20 74 68 61 74 20 6e 6f 0a 20 20 2a 2a 20 70  s that no.  ** p
25cc0 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20  rior WhereLoops 
25cd0 68 61 76 65 20 62 65 65 6e 20 65 76 61 6c 75 61  have been evalua
25ce0 74 65 64 20 61 6e 64 20 74 68 61 74 20 74 68 65  ted and that the
25cf0 20 63 75 72 72 65 6e 74 20 70 54 65 6d 70 6c 61   current pTempla
25d00 74 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65  te.  ** is there
25d10 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 61  fore the first a
25d20 6e 64 20 68 65 6e 63 65 20 74 68 65 20 62 65 73  nd hence the bes
25d30 74 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20  t and should be 
25d40 72 65 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  retained..  */. 
25d50 20 69 66 28 20 28 70 20 3d 20 70 42 75 69 6c 64   if( (p = pBuild
25d60 65 72 2d 3e 70 42 65 73 74 29 21 3d 30 20 29 7b  er->pBest)!=0 ){
25d70 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 73 6b  .    if( p->mask
25d80 53 65 6c 66 21 3d 30 20 29 7b 0a 20 20 20 20 20  Self!=0 ){.     
25d90 20 57 68 65 72 65 43 6f 73 74 20 72 43 6f 73 74   WhereCost rCost
25da0 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   = whereCostAdd(
25db0 70 2d 3e 72 52 75 6e 2c 70 2d 3e 72 53 65 74 75  p->rRun,p->rSetu
25dc0 70 29 3b 0a 20 20 20 20 20 20 57 68 65 72 65 43  p);.      WhereC
25dd0 6f 73 74 20 72 54 65 6d 70 6c 61 74 65 20 3d 20  ost rTemplate = 
25de0 77 68 65 72 65 43 6f 73 74 41 64 64 28 70 54 65  whereCostAdd(pTe
25df0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 70 54 65  mplate->rRun,pTe
25e00 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 29 3b  mplate->rSetup);
25e10 0a 20 20 20 20 20 20 69 66 28 20 72 43 6f 73 74  .      if( rCost
25e20 20 3c 20 72 54 65 6d 70 6c 61 74 65 20 29 7b 0a   < rTemplate ){.
25e30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
25e40 28 20 72 43 6f 73 74 3d 3d 72 54 65 6d 70 6c 61  ( rCost==rTempla
25e50 74 65 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  te-1 );.        
25e60 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e  goto whereLoopIn
25e70 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20  sert_noop;.     
25e80 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 43 6f   }.      if( rCo
25e90 73 74 3d 3d 72 54 65 6d 70 6c 61 74 65 20 26 26  st==rTemplate &&
25ea0 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
25eb0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
25ec0 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a 20  ==p->prereq ){. 
25ed0 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72         goto wher
25ee0 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70  eLoopInsert_noop
25ef0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
25f00 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
25f10 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
25f20 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
25f30 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
25f40 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
25f50 74 66 28 70 2d 3e 6d 61 73 6b 53 65 6c 66 3d 3d  tf(p->maskSelf==
25f60 30 20 3f 20 22 69 6e 73 2d 69 6e 69 74 3a 20 22  0 ? "ins-init: "
25f70 20 3a 20 22 69 6e 73 2d 62 65 73 74 3a 20 22 29   : "ins-best: ")
25f80 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
25f90 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
25fa0 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  , pWInfo->pTabLi
25fb0 73 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  st);.    }.#endi
25fc0 66 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 58  f.    whereLoopX
25fd0 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70  fer(db, p, pTemp
25fe0 6c 61 74 65 29 3b 0a 20 20 20 20 72 65 74 75 72  late);.    retur
25ff0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
26000 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  ..  /* Search fo
26010 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  r an existing Wh
26020 65 72 65 4c 6f 6f 70 20 74 6f 20 6f 76 65 72 77  ereLoop to overw
26030 72 69 74 65 2c 20 6f 72 20 77 68 69 63 68 20 74  rite, or which t
26040 61 6b 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 69  akes.  ** priori
26050 74 79 20 6f 76 65 72 20 70 54 65 6d 70 6c 61 74  ty over pTemplat
26060 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70  e..  */.  for(pp
26070 50 72 65 76 3d 26 70 57 49 6e 66 6f 2d 3e 70 4c  Prev=&pWInfo->pL
26080 6f 6f 70 73 2c 20 70 3d 2a 70 70 50 72 65 76 3b  oops, p=*ppPrev;
26090 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70   p; ppPrev=&p->p
260a0 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50  NextLoop, p=*ppP
260b0 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  rev){.    if( p-
260c0 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65  >iTab!=pTemplate
260d0 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f  ->iTab || p->iSo
260e0 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65  rtIdx!=pTemplate
260f0 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20  ->iSortIdx ){.  
26100 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72      /* If either
26110 20 74 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f   the iTab or iSo
26120 72 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72  rtIdx values for
26130 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61   two WhereLoop a
26140 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20  re different.   
26150 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65     ** then those
26160 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64   WhereLoops need
26170 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65   to be considere
26180 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e  d separately.  N
26190 65 69 74 68 65 72 20 69 73 0a 20 20 20 20 20 20  either is.      
261a0 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  ** a candidate t
261b0 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74  o replace the ot
261c0 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f  her. */.      co
261d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
261e0 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72    /* In the curr
261f0 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
26200 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20 76  on, the rSetup v
26210 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 7a  alue is either z
26220 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68  ero.    ** or th
26230 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69  e cost of buildi
26240 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  ng an automatic 
26250 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e  index (NlogN) an
26260 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20  d the NlogN.    
26270 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 66  ** is the same f
26280 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68  or compatible Wh
26290 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20  ereLoops. */.   
262a0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
262b0 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61  up==0 || pTempla
262c0 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20  te->rSetup==0 . 
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262e0 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54  || p->rSetup==pT
262f0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
26300 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65  );..    /* where
26310 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20 61  LoopAddBtree() a
26320 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65 73 20  lways generates 
26330 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65 20  and inserts the 
26340 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a  automatic index.
26350 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73      ** case firs
26360 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74  t.  Hence compat
26370 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57  ible candidate W
26380 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20  hereLoops never 
26390 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20  have a larger.  
263a0 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c    ** rSetup. Cal
263b0 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56  l this SETUP-INV
263c0 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73  ARIANT */.    as
263d0 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e  sert( p->rSetup>
263e0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
263f0 75 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 28  up );..    if( (
26400 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
26410 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
26420 70 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26  p->prereq.     &
26430 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65  & p->rSetup<=pTe
26440 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a 20  mplate->rSetup. 
26450 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d      && p->rRun<=
26460 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a  pTemplate->rRun.
26470 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
26480 54 68 69 73 20 62 72 61 6e 63 68 20 74 61 6b 65  This branch take
26490 6e 20 77 68 65 6e 20 70 20 69 73 20 65 71 75 61  n when p is equa
264a0 6c 20 6f 72 20 62 65 74 74 65 72 20 74 68 61 6e  l or better than
264b0 20 70 54 65 6d 70 6c 61 74 65 20 69 6e 20 0a 20   pTemplate in . 
264c0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f 66 20 28       ** all of (
264d0 31 29 20 64 65 70 65 6e 64 65 6e 63 65 73 20 28  1) dependences (
264e0 32 29 20 73 65 74 75 70 2d 63 6f 73 74 2c 20 61  2) setup-cost, a
264f0 6e 64 20 28 33 29 20 72 75 6e 2d 63 6f 73 74 2e  nd (3) run-cost.
26500 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
26510 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65  ( p->rSetup==pTe
26520 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
26530 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
26540 4c 54 65 72 6d 3c 70 54 65 6d 70 6c 61 74 65 2d  LTerm<pTemplate-
26550 3e 6e 4c 54 65 72 6d 0a 20 20 20 20 20 20 20 26  >nLTerm.       &
26560 26 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  & (p->wsFlags & 
26570 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
26580 30 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 65  0.       && (pTe
26590 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20  mplate->wsFlags 
265a0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
265b0 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 2d  !=0.       && p-
265c0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3d  >u.btree.pIndex=
265d0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 75 2e 62 74  =pTemplate->u.bt
265e0 72 65 65 2e 70 49 6e 64 65 78 0a 20 20 20 20 20  ree.pIndex.     
265f0 20 20 26 26 20 70 2d 3e 70 72 65 72 65 71 3d 3d    && p->prereq==
26600 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
26610 71 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  q.      ){.     
26620 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20     /* Overwrite 
26630 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
26640 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 73 69  eLoop with an si
26650 6d 69 6c 61 72 20 6f 6e 65 20 74 68 61 74 20 75  milar one that u
26660 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  ses.        ** m
26670 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ore terms of the
26680 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
26690 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
266a0 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  xtLoop;.        
266b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
266c0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70  se{.        /* p
266d0 54 65 6d 70 6c 61 74 65 20 69 73 20 6e 6f 74 20  Template is not 
266e0 68 65 6c 70 66 75 6c 2e 0a 20 20 20 20 20 20 20  helpful..       
266f0 20 2a 2a 20 52 65 74 75 72 6e 20 77 69 74 68 6f   ** Return witho
26700 75 74 20 63 68 61 6e 67 69 6e 67 20 6f 72 20 61  ut changing or a
26710 64 64 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  dding anything *
26720 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77  /.        goto w
26730 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e  hereLoopInsert_n
26740 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oop;.      }.   
26750 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70   }.    if( (p->p
26760 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
26770 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d  e->prereq)==pTem
26780 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20  plate->prereq.  
26790 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70     && p->rRun>=p
267a0 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20  Template->rRun. 
267b0 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 70 2d      && ALWAYS(p-
267c0 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
267d0 74 65 2d 3e 72 53 65 74 75 70 29 20 2f 2a 20 53  te->rSetup) /* S
267e0 65 65 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41  ee SETUP-INVARIA
267f0 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20  NT above */.    
26800 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 76 65 72  ){.      /* Over
26810 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e  write an existin
26820 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  g WhereLoop with
26830 20 61 20 62 65 74 74 65 72 20 6f 6e 65 3a 20 6f   a better one: o
26840 6e 65 20 74 68 61 74 20 69 73 0a 20 20 20 20 20  ne that is.     
26850 20 2a 2a 20 62 65 74 74 65 72 20 61 74 20 6f 6e   ** better at on
26860 65 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64 65  e of (1) depende
26870 6e 63 65 73 2c 20 28 32 29 20 73 65 74 75 70 2d  nces, (2) setup-
26880 63 6f 73 74 2c 20 6f 72 20 28 33 29 20 72 75 6e  cost, or (3) run
26890 2d 63 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 61  -cost.      ** a
268a0 6e 64 20 69 73 20 6e 6f 20 77 6f 72 73 65 20 69  nd is no worse i
268b0 6e 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 63  n any of those c
268c0 61 74 65 67 6f 72 69 65 73 2e 20 2a 2f 0a 20 20  ategories. */.  
268d0 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
268e0 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  NextLoop;.      
268f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
26900 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
26910 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  ch this point it
26920 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68   means that eith
26930 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65  er p[] should be
26940 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a   overwritten.  *
26950 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65  * with pTemplate
26960 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73  [] if p[] exists
26970 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20  , or if p==NULL 
26980 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20  then allocate a 
26990 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f  new.  ** WhereLo
269a0 6f 70 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  op and insert it
269b0 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45  ..  */.#if WHERE
269c0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
269d0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
269e0 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
269f0 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20     if( p!=0 ){. 
26a00 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
26a10 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 64 65 6c  gPrintf("ins-del
26a20 3a 20 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65  :  ");.      whe
26a30 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70  reLoopPrint(p, p
26a40 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29  WInfo->pTabList)
26a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
26a60 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
26a70 69 6e 73 2d 6e 65 77 3a 20 20 22 29 3b 0a 20 20  ins-new:  ");.  
26a80 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
26a90 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e  (pTemplate, pWIn
26aa0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20  fo->pTabList);. 
26ab0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
26ac0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70 20 3d 20  p==0 ){.    p = 
26ad0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
26ae0 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 68  aw(db, sizeof(Wh
26af0 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69  ereLoop));.    i
26b00 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
26b10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
26b20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74     whereLoopInit
26b30 28 70 29 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65  (p);.  }.  where
26b40 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20  LoopXfer(db, p, 
26b50 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 2d  pTemplate);.  p-
26b60 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 70 4e 65  >pNextLoop = pNe
26b70 78 74 3b 0a 20 20 2a 70 70 50 72 65 76 20 3d 20  xt;.  *ppPrev = 
26b80 70 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46  p;.  if( (p->wsF
26b90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
26ba0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b  TUALTABLE)==0 ){
26bb0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  .    Index *pInd
26bc0 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e  ex = p->u.btree.
26bd0 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  pIndex;.    if( 
26be0 70 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78  pIndex && pIndex
26bf0 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20  ->tnum==0 ){.   
26c00 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49     p->u.btree.pI
26c10 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ndex = 0;.    }.
26c20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
26c30 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
26c40 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 69  mp here if the i
26c50 6e 73 65 72 74 20 69 73 20 61 20 6e 6f 2d 6f 70  nsert is a no-op
26c60 20 2a 2f 0a 77 68 65 72 65 4c 6f 6f 70 49 6e 73   */.whereLoopIns
26c70 65 72 74 5f 6e 6f 6f 70 3a 0a 23 69 66 20 57 48  ert_noop:.#if WH
26c80 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
26c90 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
26ca0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
26cb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
26cc0 75 67 50 72 69 6e 74 66 28 70 42 75 69 6c 64 65  ugPrintf(pBuilde
26cd0 72 2d 3e 70 42 65 73 74 20 3f 20 22 69 6e 73 2d  r->pBest ? "ins-
26ce0 73 6b 69 70 3a 20 22 20 3a 20 22 69 6e 73 2d 6e  skip: " : "ins-n
26cf0 6f 6f 70 3a 20 22 29 3b 0a 20 20 20 20 77 68 65  oop: ");.    whe
26d00 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
26d10 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d 3e 70  plate, pWInfo->p
26d20 54 61 62 4c 69 73 74 29 3b 0a 20 20 7d 0a 23 65  TabList);.  }.#e
26d30 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
26d40 4c 49 54 45 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a  LITE_OK;  .}../*
26d50 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66  .** We have so f
26d60 61 72 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c  ar matched pBuil
26d70 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
26d80 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20  ee.nEq terms of 
26d90 74 68 65 20 69 6e 64 65 78 20 70 49 6e 64 65 78  the index pIndex
26da0 2e 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 61 74 63  ..** Try to matc
26db0 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a  h one more..**.*
26dc0 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75  * If pProbe->tnu
26dd0 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73  m==0, that means
26de0 20 70 49 6e 64 65 78 20 69 73 20 61 20 66 61 6b   pIndex is a fak
26df0 65 20 69 6e 64 65 78 20 75 73 65 64 20 66 6f 72  e index used for
26e00 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20   the.** INTEGER 
26e10 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a  PRIMARY KEY..*/.
26e20 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
26e30 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
26e40 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  x(.  WhereLoopBu
26e50 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
26e60 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
26e70 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f  eLoop factory */
26e80 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
26e90 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20  t_item *pSrc,   
26ea0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
26eb0 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61  e term being ana
26ec0 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  lyzed */.  Index
26ed0 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20 20 20   *pProbe,       
26ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
26ef0 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63 20 2a   index on pSrc *
26f00 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e 49  /.  WhereCost nI
26f10 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20  nMul            
26f20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65      /* log(Numbe
26f30 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20  r of iterations 
26f40 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b  due to IN) */.){
26f50 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
26f60 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
26f70 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45  >pWInfo;  /* WHE
26f80 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65  RE analyse conte
26f90 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  xt */.  Parse *p
26fa0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
26fb0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 2f  pParse;        /
26fc0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
26fd0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
26fe0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
26ff0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
27000 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  se connection ma
27010 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  lloc context */.
27020 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
27030 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
27040 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68    /* Template Wh
27050 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f  ereLoop under co
27060 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
27070 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
27080 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27090 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 75  /* A WhereTerm u
270a0 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69  nder considerati
270b0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61  on */.  int opMa
270c0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
270d0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64          /* Valid
270e0 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 63   operators for c
270f0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
27100 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 20  WhereScan scan; 
27110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27120 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
27130 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20  WHERE terms */. 
27140 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64 5f 70   Bitmask saved_p
27150 72 65 72 65 71 3b 20 20 20 20 20 20 20 20 20 20  rereq;          
27160 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
27170 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72  ue of pNew->prer
27180 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  eq */.  u16 save
27190 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20  d_nLTerm;       
271a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
271b0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
271c0 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 69  w->nLTerm */.  i
271d0 6e 74 20 73 61 76 65 64 5f 6e 45 71 3b 20 20 20  nt saved_nEq;   
271e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
271f0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
27200 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   of pNew->u.btre
27210 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 33 32 20 73  e.nEq */.  u32 s
27220 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20  aved_wsFlags;   
27230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
27240 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
27250 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f  pNew->wsFlags */
27260 0a 20 20 57 68 65 72 65 43 6f 73 74 20 73 61 76  .  WhereCost sav
27270 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  ed_nOut;        
27280 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
27290 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f  alue of pNew->nO
272a0 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  ut */.  int iCol
272b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
272c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
272d0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   of the column i
272e0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
272f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27300 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
27310 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
27320 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e  */.  WhereCost n
27330 52 6f 77 45 73 74 3b 20 20 20 20 20 20 20 20 20  RowEst;         
27340 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65       /* Estimate
27350 64 20 69 6e 64 65 78 20 73 65 6c 65 63 74 69 76  d index selectiv
27360 69 74 79 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ity */.  WhereCo
27370 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20  st rLogSize;    
27380 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
27390 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73  rithm of table s
273a0 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ize */.  WhereTe
273b0 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70  rm *pTop = 0, *p
273c0 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20  Btm = 0; /* Top 
273d0 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65  and bottom range
273e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
273f0 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
27400 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20  er->pNew;.  if( 
27410 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
27420 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
27430 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72  _NOMEM;..  asser
27440 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  t( (pNew->wsFlag
27450 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
27460 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20  LTABLE)==0 );.  
27470 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
27480 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
27490 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a  OP_LIMIT)==0 );.
274a0 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
274b0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
274c0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d  LIMIT ){.    opM
274d0 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  ask = WO_LT|WO_L
274e0 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  E;.  }else if( p
274f0 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c  Probe->tnum<=0 |
27500 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  | (pSrc->jointyp
27510 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
27520 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  ){.    opMask = 
27530 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47  WO_EQ|WO_IN|WO_G
27540 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
27550 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _LE;.  }else{.  
27560 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51    opMask = WO_EQ
27570 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_IN|WO_ISNULL
27580 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
27590 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20  LT|WO_LE;.  }.  
275a0 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f  if( pProbe->bUno
275b0 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20  rdered ) opMask 
275c0 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  &= ~(WO_GT|WO_GE
275d0 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a  |WO_LT|WO_LE);..
275e0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
275f0 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72  u.btree.nEq<=pPr
27600 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  obe->nColumn );.
27610 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 62 74    if( pNew->u.bt
27620 72 65 65 2e 6e 45 71 20 3c 20 70 50 72 6f 62 65  ree.nEq < pProbe
27630 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
27640 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e   iCol = pProbe->
27650 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75  aiColumn[pNew->u
27660 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 20 20 20  .btree.nEq];.   
27670 20 6e 52 6f 77 45 73 74 20 3d 20 77 68 65 72 65   nRowEst = where
27680 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52  Cost(pProbe->aiR
27690 6f 77 45 73 74 5b 70 4e 65 77 2d 3e 75 2e 62 74  owEst[pNew->u.bt
276a0 72 65 65 2e 6e 45 71 2b 31 5d 29 3b 0a 20 20 20  ree.nEq+1]);.   
276b0 20 69 66 28 20 6e 52 6f 77 45 73 74 3d 3d 30 20   if( nRowEst==0 
276c0 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72  && pProbe->onErr
276d0 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 6e 52  or==OE_None ) nR
276e0 6f 77 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65 6c  owEst = 1;.  }el
276f0 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 2d  se{.    iCol = -
27700 31 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d  1;.    nRowEst =
27710 20 30 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20   0;.  }.  pTerm 
27720 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28  = whereScanInit(
27730 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d  &scan, pBuilder-
27740 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72  >pWC, pSrc->iCur
27750 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20  sor, iCol,.     
27760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27770 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62     opMask, pProb
27780 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45 71 20  e);.  saved_nEq 
27790 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
277a0 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54  nEq;.  saved_nLT
277b0 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65  erm = pNew->nLTe
277c0 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c  rm;.  saved_wsFl
277d0 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c  ags = pNew->wsFl
277e0 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65  ags;.  saved_pre
277f0 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72  req = pNew->prer
27800 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74  eq;.  saved_nOut
27810 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20   = pNew->nOut;. 
27820 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
27830 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  0;.  rLogSize = 
27840 65 73 74 4c 6f 67 28 77 68 65 72 65 43 6f 73 74  estLog(whereCost
27850 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73  (pProbe->aiRowEs
27860 74 5b 30 5d 29 29 3b 0a 20 20 66 6f 72 28 3b 20  t[0]));.  for(; 
27870 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
27880 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d   pTerm!=0; pTerm
27890 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74   = whereScanNext
278a0 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 69 6e  (&scan)){.    in
278b0 74 20 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 69  t nIn = 0;.    i
278c0 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
278d0 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61  Right & pNew->ma
278e0 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75  skSelf ) continu
278f0 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  e;.    pNew->wsF
27900 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
27910 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lags;.    pNew->
27920 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
27930 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65  ved_nEq;.    pNe
27940 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
27950 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66  d_nLTerm;.    if
27960 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
27970 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
27980 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72  ->nLTerm+1) ) br
27990 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20  eak; /* OOM */. 
279a0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
279b0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
279c0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65  = pTerm;.    pNe
279d0 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76  w->prereq = (sav
279e0 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72  ed_prereq | pTer
279f0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20  m->prereqRight) 
27a00 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  & ~pNew->maskSel
27a10 66 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  f;.    pNew->rRu
27a20 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 3b 20 2f 2a  n = rLogSize; /*
27a30 20 42 61 73 65 6c 69 6e 65 20 63 6f 73 74 20 69   Baseline cost i
27a40 73 20 6c 6f 67 32 28 4e 29 2e 20 20 41 64 6a 75  s log2(N).  Adju
27a50 73 74 6d 65 6e 74 73 20 62 65 6c 6f 77 20 2a 2f  stments below */
27a60 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
27a70 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
27a80 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N ){.      Expr 
27a90 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
27aa0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
27ab0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
27ac0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
27ad0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
27ae0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
27af0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
27b00 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
27b10 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a  N (SELECT ...)":
27b20 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45    TUNING: the SE
27b30 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20  LECT returns 25 
27b40 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rows */.        
27b50 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72  nIn = 46;  asser
27b60 74 28 20 34 36 3d 3d 77 68 65 72 65 43 6f 73 74  t( 46==whereCost
27b70 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d 65  (25) );.      }e
27b80 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
27b90 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26  Expr->x.pList &&
27ba0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
27bb0 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
27bc0 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c     /* "x IN (val
27bd0 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22  ue, value, ...)"
27be0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
27bf0 3d 20 77 68 65 72 65 43 6f 73 74 28 70 45 78 70  = whereCost(pExp
27c00 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
27c10 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
27c20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20    pNew->rRun += 
27c30 6e 49 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  nIn;.      pNew-
27c40 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
27c50 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
27c60 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e   = nRowEst + nIn
27c70 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d  Mul + nIn;.    }
27c80 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
27c90 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
27ca0 45 51 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  EQ) ){.      ass
27cb0 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c  ert( (pNew->wsFl
27cc0 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
27cd0 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43  UMN_NULL|WHERE_C
27ce0 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 30 0a 20 20  OLUMN_IN))!=0.  
27cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d00 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30 20 29 3b 0a  || nInMul==0 );.
27d10 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
27d20 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
27d30 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66  UMN_EQ;.      if
27d40 28 20 69 43 6f 6c 3c 30 20 20 0a 20 20 20 20 20  ( iCol<0  .     
27d50 20 20 7c 7c 20 28 70 50 72 6f 62 65 2d 3e 6f 6e    || (pProbe->on
27d60 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26  Error!=OE_None &
27d70 26 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20  & nInMul==0.    
27d80 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e         && pNew->
27d90 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50 72  u.btree.nEq==pPr
27da0 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 29 0a  obe->nColumn-1).
27db0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
27dc0 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
27dd0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27de0 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 7c 7c  COLUMN_IN)==0 ||
27df0 20 69 43 6f 6c 3c 30 20 29 3b 0a 20 20 20 20 20   iCol<0 );.     
27e00 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
27e10 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57   |= WHERE_ONEROW
27e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27e30 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
27e40 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  q++;.      pNew-
27e50 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20  >nOut = nRowEst 
27e60 2b 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20 7d 65  + nInMul;.    }e
27e70 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  lse if( pTerm->e
27e80 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
27e90 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  SNULL) ){.      
27ea0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
27eb0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
27ec0 4c 4c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  LL;.      pNew->
27ed0 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20  u.btree.nEq++;. 
27ee0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
27ef0 49 53 20 4e 55 4c 4c 20 73 65 6c 65 63 74 73 20  IS NULL selects 
27f00 32 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  2 rows */.      
27f10 6e 49 6e 20 3d 20 31 30 3b 20 20 61 73 73 65 72  nIn = 10;  asser
27f20 74 28 20 31 30 3d 3d 77 68 65 72 65 43 6f 73 74  t( 10==whereCost
27f30 28 32 29 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  (2) );.      pNe
27f40 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73  w->nOut = nRowEs
27f50 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e  t + nInMul + nIn
27f60 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
27f70 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
27f80 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
27f90 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
27fa0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
27fb0 61 74 6f 72 20 26 20 57 4f 5f 47 54 20 29 3b 0a  ator & WO_GT );.
27fc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27fd0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
27fe0 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
27ff0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
28000 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
28010 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f  RANGE|WHERE_BTM_
28020 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 42 74  LIMIT;.      pBt
28030 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  m = pTerm;.     
28040 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d   pTop = 0;.    }
28050 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
28060 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
28070 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ator & (WO_LT|WO
28080 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65  _LE) );.      te
28090 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
280a0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 54  Operator & WO_LT
280b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
280c0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
280d0 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a  ator & WO_LE );.
280e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
280f0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
28100 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
28110 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
28120 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20   pTop = pTerm;. 
28130 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65       pBtm = (pNe
28140 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
28150 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30  RE_BTM_LIMIT)!=0
28160 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
28170 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c          pNew->aL
28180 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
28190 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a  m-2] : 0;.    }.
281a0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
281b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
281c0 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
281d0 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f      /* Adjust nO
281e0 75 74 20 61 6e 64 20 72 52 75 6e 20 66 6f 72 20  ut and rRun for 
281f0 53 54 41 54 33 20 72 61 6e 67 65 20 76 61 6c 75  STAT3 range valu
28200 65 73 20 2a 2f 0a 20 20 20 20 20 20 57 68 65 72  es */.      Wher
28210 65 43 6f 73 74 20 72 44 69 76 3b 0a 20 20 20 20  eCost rDiv;.    
28220 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e    whereRangeScan
28230 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f  Est(pParse, pPro
28240 62 65 2c 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  be, pNew->u.btre
28250 65 2e 6e 45 71 2c 0a 20 20 20 20 20 20 20 20 20  e.nEq,.         
28260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
28270 42 74 6d 2c 20 70 54 6f 70 2c 20 26 72 44 69 76  Btm, pTop, &rDiv
28280 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
28290 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
282a0 3e 72 44 69 76 2b 31 30 20 3f 20 73 61 76 65 64  >rDiv+10 ? saved
282b0 5f 6e 4f 75 74 20 2d 20 72 44 69 76 20 3a 20 31  _nOut - rDiv : 1
282c0 30 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  0;.    }.#ifdef 
282d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
282e0 41 54 33 0a 20 20 20 20 69 66 28 20 70 4e 65 77  AT3.    if( pNew
282f0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31  ->u.btree.nEq==1
28300 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d   && pProbe->nSam
28310 70 6c 65 0a 20 20 20 20 20 26 26 20 20 4f 70 74  ple.     &&  Opt
28320 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
28330 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74  (db, SQLITE_Stat
28340 33 29 20 29 7b 0a 20 20 20 20 20 20 74 52 6f 77  3) ){.      tRow
28350 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20  cnt nOut = 0;.  
28360 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
28370 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
28380 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d  EQ|WO_ISNULL))!=
28390 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  0 ){.        tes
283a0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
283b0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
283c0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
283d0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
283e0 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
283f0 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  L );.        rc 
28400 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  = whereEqualScan
28410 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f  Est(pParse, pPro
28420 62 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  be, pTerm->pExpr
28430 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29  ->pRight, &nOut)
28440 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
28450 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
28460 74 6f 72 20 26 20 57 4f 5f 49 4e 29 0a 20 20 20  tor & WO_IN).   
28470 20 20 20 20 20 20 20 20 20 20 26 26 20 20 21 45            &&  !E
28480 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
28490 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
284a0 78 49 73 53 65 6c 65 63 74 29 20 20 29 7b 0a 20  xIsSelect)  ){. 
284b0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
284c0 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73  eInScanEst(pPars
284d0 65 2c 20 70 50 72 6f 62 65 2c 20 70 54 65 72 6d  e, pProbe, pTerm
284e0 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ->pExpr->x.pList
284f0 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
28500 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
28510 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 4e 65 77  SQLITE_OK ) pNew
28520 2d 3e 6e 4f 75 74 20 3d 20 77 68 65 72 65 43 6f  ->nOut = whereCo
28530 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20 7d 0a  st(nOut);.    }.
28540 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
28550 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
28560 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c  (WHERE_IDX_ONLY|
28570 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29  WHERE_IPK))==0 )
28580 7b 0a 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20  {.      /* Each 
28590 72 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61 20 73  row involves a s
285a0 74 65 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78  tep of the index
285b0 2c 20 74 68 65 6e 20 61 20 62 69 6e 61 72 79 20  , then a binary 
285c0 73 65 61 72 63 68 20 6f 66 0a 20 20 20 20 20 20  search of.      
285d0 2a 2a 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  ** the main tabl
285e0 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  e */.      pNew-
285f0 3e 72 52 75 6e 20 3d 20 20 77 68 65 72 65 43 6f  >rRun =  whereCo
28600 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e  stAdd(pNew->rRun
28610 2c 20 72 4c 6f 67 53 69 7a 65 3e 32 37 20 3f 20  , rLogSize>27 ? 
28620 72 4c 6f 67 53 69 7a 65 2d 31 37 20 3a 20 31 30  rLogSize-17 : 10
28630 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
28640 53 74 65 70 20 63 6f 73 74 20 66 6f 72 20 65 61  Step cost for ea
28650 63 68 20 6f 75 74 70 75 74 20 72 6f 77 20 2a 2f  ch output row */
28660 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
28670 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 70  = whereCostAdd(p
28680 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d  New->rRun, pNew-
28690 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 54  >nOut);.    /* T
286a0 42 44 3a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20  BD: Adjust nOut 
286b0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  for additional c
286c0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
286d0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
286e0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
286f0 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20   pNew);.    if( 
28700 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
28710 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
28720 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65  )==0.     && pNe
28730 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 28  w->u.btree.nEq<(
28740 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
28750 2b 20 28 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65  + (pProbe->zName
28760 21 3d 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  !=0)).    ){.   
28770 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
28780 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
28790 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
287a0 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20  , nInMul+nIn);. 
287b0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d     }.  }.  pNew-
287c0 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f  >prereq = saved_
287d0 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e  prereq;.  pNew->
287e0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
287f0 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d  ved_nEq;.  pNew-
28800 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
28810 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  _wsFlags;.  pNew
28820 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
28830 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  Out;.  pNew->nLT
28840 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65  erm = saved_nLTe
28850 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  rm;.  return rc;
28860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
28870 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20 70   True if it is p
28880 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e  ossible that pIn
28890 64 65 78 20 6d 69 67 68 74 20 62 65 20 75 73 65  dex might be use
288a0 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d  ful in.** implem
288b0 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52  enting the ORDER
288c0 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42   BY clause in pB
288d0 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  uilder..**.** Re
288e0 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42  turn False if pB
288f0 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20  uilder does not 
28900 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52  contain an ORDER
28910 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a   BY clause or.**
28920 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
28930 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74  way for pIndex t
28940 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69  o be useful in i
28950 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74  mplementing that
28960 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
28970 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
28980 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c  nt indexMightHel
28990 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20  pWithOrderBy(.  
289a0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
289b0 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e   *pBuilder,.  In
289c0 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69  dex *pIndex,.  i
289d0 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20  nt iCursor.){.  
289e0 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20  ExprList *pOB;. 
289f0 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20   int ii, jj;..  
28a00 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f  if( pIndex->bUno
28a10 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e 20  rdered ) return 
28a20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20  0;.  if( (pOB = 
28a30 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
28a40 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29  ->pOrderBy)==0 )
28a50 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
28a60 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e  (ii=0; ii<pOB->n
28a70 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
28a80 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73   Expr *pExpr = s
28a90 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
28aa0 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d  llate(pOB->a[ii]
28ab0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
28ac0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
28ad0 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
28ae0 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
28af0 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72  >iTable==iCursor
28b00 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a   ){.      for(jj
28b10 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e  =0; jj<pIndex->n
28b20 43 6f 6c 75 6d 6e 3b 20 6a 6a 2b 2b 29 7b 0a 20  Column; jj++){. 
28b30 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
28b40 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65  ->iColumn==pInde
28b50 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20  x->aiColumn[jj] 
28b60 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
28b70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
28b80 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
28b90 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69 74 6d  ** Return a bitm
28ba0 61 73 6b 20 77 68 65 72 65 20 31 73 20 69 6e 64  ask where 1s ind
28bb0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 63  icate that the c
28bc0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c  orresponding col
28bd0 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  umn of.** the ta
28be0 62 6c 65 20 69 73 20 75 73 65 64 20 62 79 20 61  ble is used by a
28bf0 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74  n index.  Only t
28c00 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75  he first 63 colu
28c10 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  mns are consider
28c20 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  ed..*/.static Bi
28c30 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49  tmask columnsInI
28c40 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78  ndex(Index *pIdx
28c50 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d  ){.  Bitmask m =
28c60 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66   0;.  int j;.  f
28c70 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  or(j=pIdx->nColu
28c80 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  mn-1; j>=0; j--)
28c90 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49  {.    int x = pI
28ca0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
28cb0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78  .    testcase( x
28cc0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 74  ==BMS-1 );.    t
28cd0 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
28ce0 32 20 29 3b 0a 20 20 20 20 69 66 28 20 78 3c 42  2 );.    if( x<B
28cf0 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b  MS-1 ) m |= MASK
28d00 42 49 54 28 78 29 3b 0a 20 20 7d 0a 20 20 72 65  BIT(x);.  }.  re
28d10 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn m;.}.../*.*
28d20 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
28d30 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
28d40 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f  a single table o
28d50 66 20 74 68 65 20 6a 6f 69 6e 20 77 65 72 65 20  f the join were 
28d60 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  the table.** is 
28d70 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69  idenfied by pBui
28d80 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
28d90 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
28da0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
28db0 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61  e.** a b-tree ta
28dc0 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75  ble, not a virtu
28dd0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
28de0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
28df0 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65  pAddBtree(.  Whe
28e00 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
28e10 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52  Builder, /* WHER
28e20 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
28e30 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
28e40 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20  k mExtra        
28e50 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
28e60 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72  rerequesites for
28e70 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c   using this tabl
28e80 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
28e90 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
28ea0 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
28eb0 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
28ec0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
28ed0 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
28ee0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
28ef0 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
28f00 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20  /.  Index sPk;  
28f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20  /* A fake index 
28f30 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70  object for the p
28f40 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
28f50 74 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73 74  tRowcnt aiRowEst
28f60 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54  Pk[2];      /* T
28f70 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61  he aiRowEst[] va
28f80 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
28f90 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61  index */.  int a
28fa0 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20  iColumnPk = -1; 
28fb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43         /* The aC
28fc0 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f  olumn[] value fo
28fd0 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
28fe0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
28ff0 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
29000 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
29010 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
29020 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
29030 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc;  /* The FROM
29040 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65   clause btree te
29050 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57  rm to add */.  W
29060 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
29070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
29080 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
29090 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
290a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
290b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
290c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
290d0 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20   iSortIdx = 1;  
290e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
290f0 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  x number */.  in
29100 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  t b;            
29110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62            /* A b
29120 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a  oolean value */.
29130 20 20 57 68 65 72 65 43 6f 73 74 20 72 53 69 7a    WhereCost rSiz
29140 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
29150 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
29160 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
29170 20 20 57 68 65 72 65 43 6f 73 74 20 72 4c 6f 67    WhereCost rLog
29180 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Size;         /*
29190 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   Logarithm of th
291a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
291b0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
291c0 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  .  .  pNew = pBu
291d0 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
291e0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
291f0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62  ->pWInfo;.  pTab
29200 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
29210 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20  TabList;.  pSrc 
29220 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  = pTabList->a + 
29230 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 61 73  pNew->iTab;.  as
29240 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c  sert( !IsVirtual
29250 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a  (pSrc->pTab) );.
29260 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e  .  if( pSrc->pIn
29270 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  dex ){.    /* An
29280 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
29290 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70  se specifies a p
292a0 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
292b0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50  to use */.    pP
292c0 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e  robe = pSrc->pIn
292d0 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
292e0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
292f0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
29300 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61  se.  Create a fa
29310 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke Index object 
29320 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  in local.    ** 
29330 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20  variable sPk to 
29340 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
29350 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
29360 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69  index.  Make thi
29370 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e  s.    ** fake in
29380 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e  dex the first in
29390 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65   a chain of Inde
293a0 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61  x objects with a
293b0 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20  ll of the real. 
293c0 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f     ** indices to
293d0 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49   follow */.    I
293e0 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20  ndex *pFirst;   
293f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29400 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20  * First of real 
29410 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
29420 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  able */.    mems
29430 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65  et(&sPk, 0, size
29440 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
29450 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b  sPk.nColumn = 1;
29460 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d  .    sPk.aiColum
29470 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b  n = &aiColumnPk;
29480 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73  .    sPk.aiRowEs
29490 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a  t = aiRowEstPk;.
294a0 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20      sPk.onError 
294b0 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
294c0 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70    sPk.pTable = p
294d0 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  Src->pTab;.    a
294e0 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70  iRowEstPk[0] = p
294f0 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45  Src->pTab->nRowE
29500 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  st;.    aiRowEst
29510 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70  Pk[1] = 1;.    p
29520 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54  First = pSrc->pT
29530 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
29540 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  if( pSrc->notInd
29550 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  exed==0 ){.     
29560 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64   /* The real ind
29570 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c  ices of the tabl
29580 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69  e are only consi
29590 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20  dered if the.   
295a0 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45     ** NOT INDEXE
295b0 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f  D qualifier is o
295c0 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
295d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
295e0 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d       sPk.pNext =
295f0 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20   pFirst;.    }. 
29600 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b     pProbe = &sPk
29610 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20  ;.  }.  rSize = 
29620 77 68 65 72 65 43 6f 73 74 28 70 53 72 63 2d 3e  whereCost(pSrc->
29630 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 29 3b 0a  pTab->nRowEst);.
29640 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
29650 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  Log(rSize);..  /
29660 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  * Automatic inde
29670 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42  xes */.  if( !pB
29680 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 0a 20 20  uilder->pBest.  
29690 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61   && (pWInfo->pPa
296a0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
296b0 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
296c0 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63  x)!=0.   && pSrc
296d0 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26  ->pIndex==0.   &
296e0 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f  & !pSrc->viaCoro
296f0 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53 72  utine.   && !pSr
29700 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20  c->notIndexed.  
29710 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72   && !pSrc->isCor
29720 72 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20 20 20  related.  ){.   
29730 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74   /* Generate aut
29740 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f  o-index WhereLoo
29750 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43  ps */.    WhereC
29760 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 42 75  lause *pWC = pBu
29770 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 20 20  ilder->pWC;.    
29780 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
29790 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
297a0 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61  *pWCEnd = pWC->a
297b0 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
297c0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
297d0 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->a; rc==SQLITE_
297e0 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45  OK && pTerm<pWCE
297f0 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
29800 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
29810 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
29820 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
29830 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
29840 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
29850 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
29860 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
29870 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
29880 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
29890 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
298a0 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
298b0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
298c0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
298d0 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
298e0 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  m;.        /* TU
298f0 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63  NING: One-time c
29900 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e  ost for computin
29910 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  g the automatic 
29920 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20 20  index is.       
29930 20 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74 65 6c   ** approximatel
29940 79 20 37 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68  y 7*N*log2(N) wh
29950 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
29960 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20  ber of rows in. 
29970 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61         ** the ta
29980 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
29990 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  d. */.        pN
299a0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f  ew->rSetup = rLo
299b0 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20  gSize + rSize + 
299c0 32 38 3b 20 20 61 73 73 65 72 74 28 20 32 38 3d  28;  assert( 28=
299d0 3d 77 68 65 72 65 43 6f 73 74 28 37 29 20 29 3b  =whereCost(7) );
299e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
299f0 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c  NG: Each index l
29a00 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20  ookup yields 20 
29a10 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
29a20 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20  e.  This.       
29a30 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e   ** is more than
29a40 20 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73   the usual guess
29a50 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e   of 10 rows, sin
29a60 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61  ce we have no wa
29a70 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  y.        ** of 
29a80 6b 6e 6f 77 6e 69 6e 67 20 68 6f 77 20 73 65 6c  knowning how sel
29a90 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78  ective the index
29aa0 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
29ab0 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20   be.  It would. 
29ac0 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65         ** not be
29ad0 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f   unreasonable to
29ae0 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65   make this value
29af0 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f   much larger. */
29b00 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
29b10 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72  Out = 43;  asser
29b20 74 28 20 34 33 3d 3d 77 68 65 72 65 43 6f 73 74  t( 43==whereCost
29b30 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20  (20) );.        
29b40 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77 68 65  pNew->rRun = whe
29b50 72 65 43 6f 73 74 41 64 64 28 72 4c 6f 67 53 69  reCostAdd(rLogSi
29b60 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a  ze,pNew->nOut);.
29b70 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
29b80 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55  Flags = WHERE_AU
29b90 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20  TO_INDEX;.      
29ba0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
29bb0 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d 2d   mExtra | pTerm-
29bc0 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
29bd0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
29be0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
29bf0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
29c00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
29c10 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
29c20 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20  l indices.  */. 
29c30 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54   for(; rc==SQLIT
29c40 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20  E_OK && pProbe; 
29c50 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70  pProbe=pProbe->p
29c60 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b  Next, iSortIdx++
29c70 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  ){.    pNew->u.b
29c80 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20  tree.nEq = 0;.  
29c90 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
29ca0 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53   0;.    pNew->iS
29cb0 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
29cc0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
29cd0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
29ce0 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20  eq = mExtra;.   
29cf0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
29d00 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ize;.    pNew->u
29d10 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
29d20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20  pProbe;.    b = 
29d30 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
29d40 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64  thOrderBy(pBuild
29d50 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63  er, pProbe, pSrc
29d60 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
29d70 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44  /* The ONEPASS_D
29d80 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76  ESIRED flags nev
29d90 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68  er occurs togeth
29da0 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59  er with ORDER BY
29db0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
29dc0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
29dd0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
29de0 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
29df0 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69  || b==0 );.    i
29e00 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c  f( pProbe->tnum<
29e10 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
29e20 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
29e30 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ey index */.    
29e40 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
29e50 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20  = WHERE_IPK;..  
29e60 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c      /* Full tabl
29e70 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  e scan */.      
29e80 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
29e90 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
29ea0 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  0;.      /* TUNI
29eb0 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c  NG: Cost of full
29ec0 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 33   table scan is 3
29ed0 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a  *(N + log2(N))..
29ee0 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65        **  +  The
29ef0 20 65 78 74 72 61 20 33 20 66 61 63 74 6f 72 20   extra 3 factor 
29f00 69 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20  is to encourage 
29f10 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78  the use of index
29f20 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20  ed lookups.     
29f30 20 2a 2a 20 20 20 20 20 6f 76 65 72 20 66 75 6c   **     over ful
29f40 6c 20 73 63 61 6e 73 2e 20 20 41 20 73 6d 61 6c  l scans.  A smal
29f50 6c 65 72 20 63 6f 6e 73 74 61 6e 74 20 32 20 69  ler constant 2 i
29f60 73 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72  s used for cover
29f70 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ing.      **    
29f80 20 69 6e 64 65 78 20 73 63 61 6e 73 20 73 6f 20   index scans so 
29f90 74 68 61 74 20 61 20 63 6f 76 65 72 69 6e 67 20  that a covering 
29fa0 69 6e 64 65 78 20 73 63 61 6e 20 77 69 6c 6c 20  index scan will 
29fb0 62 65 20 66 61 76 6f 72 65 64 20 6f 76 65 72 0a  be favored over.
29fc0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 61 20 74        **     a t
29fd0 61 62 6c 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  able scan. */.  
29fe0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
29ff0 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 53   whereCostAdd(rS
2a000 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b 20  ize,rLogSize) + 
2a010 31 36 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  16;.      rc = w
2a020 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
2a030 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
2a040 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
2a050 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
2a060 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
2a070 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
2a080 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64   & ~columnsInInd
2a090 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  ex(pProbe);.    
2a0a0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2a0b0 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52  = (m==0) ? (WHER
2a0c0 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
2a0d0 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52  _INDEXED) : WHER
2a0e0 45 5f 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20 20  E_INDEXED;..    
2a0f0 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76    /* Full scan v
2a100 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ia index */.    
2a110 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c    if( b.       |
2a120 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20  | ( m==0.       
2a130 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e    && pProbe->bUn
2a140 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20  ordered==0.     
2a150 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
2a160 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2a170 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2a180 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)==0.         
2a190 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
2a1a0 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20  Config.bUseCis. 
2a1b0 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d          && Optim
2a1c0 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
2a1d0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
2a1e0 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49  b, SQLITE_CoverI
2a1f0 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20  dxScan).        
2a200 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20    ).      ){.   
2a210 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
2a220 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
2a230 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  dx : 0;.        
2a240 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  if( m==0 ){.    
2a250 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
2a260 20 43 6f 73 74 20 6f 66 20 61 20 63 6f 76 65 72   Cost of a cover
2a270 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69  ing index scan i
2a280 73 20 32 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29  s 2*(N + log2(N)
2a290 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  )..          ** 
2a2a0 20 2b 20 20 54 68 65 20 65 78 74 72 61 20 32 20   +  The extra 2 
2a2b0 66 61 63 74 6f 72 20 69 73 20 74 6f 20 65 6e 63  factor is to enc
2a2c0 6f 75 72 61 67 65 20 74 68 65 20 75 73 65 20 6f  ourage the use o
2a2d0 66 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75 70  f indexed lookup
2a2e0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  s.          **  
2a2f0 20 20 20 6f 76 65 72 20 69 6e 64 65 78 20 73 63     over index sc
2a300 61 6e 73 2e 20 20 41 20 74 61 62 6c 65 20 73 63  ans.  A table sc
2a310 61 6e 20 75 73 65 73 20 61 20 66 61 63 74 6f 72  an uses a factor
2a320 20 6f 66 20 33 20 73 6f 20 74 68 61 74 0a 20 20   of 3 so that.  
2a330 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69          **     i
2a340 6e 64 65 78 20 73 63 61 6e 73 20 61 72 65 20 66  ndex scans are f
2a350 61 76 6f 72 65 64 20 6f 76 65 72 20 74 61 62 6c  avored over tabl
2a360 65 20 73 63 61 6e 73 2e 0a 20 20 20 20 20 20 20  e scans..       
2a370 20 20 20 2a 2a 20 20 2b 20 20 49 66 20 74 68 69     **  +  If thi
2a380 73 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  s covering index
2a390 20 6d 69 67 68 74 20 61 6c 73 6f 20 68 65 6c 70   might also help
2a3a0 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
2a3b0 45 52 20 42 59 0a 20 20 20 20 20 20 20 20 20 20  ER BY.          
2a3c0 2a 2a 20 20 20 20 20 63 6c 61 75 73 65 2c 20 74  **     clause, t
2a3d0 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20  hen the cost is 
2a3e0 66 75 64 67 65 64 20 64 6f 77 6e 20 73 6c 69 67  fudged down slig
2a3f0 68 74 6c 79 20 73 6f 20 74 68 61 74 20 74 68 69  htly so that thi
2a400 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  s.          **  
2a410 20 20 20 69 6e 64 65 78 20 69 73 20 66 61 76 6f     index is favo
2a420 72 65 64 20 61 62 6f 76 65 20 6f 74 68 65 72 20  red above other 
2a430 69 6e 64 69 63 65 73 20 74 68 61 74 20 68 61 76  indices that hav
2a440 65 20 6e 6f 20 68 6f 70 65 20 6f 66 0a 20 20 20  e no hope of.   
2a450 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 68 65         **     he
2a460 6c 70 69 6e 67 20 77 69 74 68 20 74 68 65 20 4f  lping with the O
2a470 52 44 45 52 20 42 59 2e 20 2a 2f 0a 20 20 20 20  RDER BY. */.    
2a480 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
2a490 20 3d 20 31 30 20 2b 20 77 68 65 72 65 43 6f 73   = 10 + whereCos
2a4a0 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53  tAdd(rSize,rLogS
2a4b0 69 7a 65 29 20 2d 20 62 3b 0a 20 20 20 20 20 20  ize) - b;.      
2a4c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a4d0 20 20 20 61 73 73 65 72 74 28 20 62 21 3d 30 20     assert( b!=0 
2a4e0 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ); .          /*
2a4f0 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
2a500 20 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f 6e 2d   scanning a non-
2a510 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 69  covering index i
2a520 73 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e 29 0a  s (N+1)*log2(N).
2a530 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68 69            ** whi
2a540 63 68 20 77 65 20 77 69 6c 6c 20 73 69 6d 70 6c  ch we will simpl
2a550 69 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a 6c 6f  ify to just N*lo
2a560 67 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20 20 20  g2(N) */.       
2a570 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2a580 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a 65  rSize + rLogSize
2a590 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a5a0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2a5b0 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2a5c0 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
2a5d0 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
2a5e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a5f0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2a600 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
2a610 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
2a620 70 50 72 6f 62 65 2c 20 30 29 3b 0a 0a 20 20 20  pProbe, 0);..   
2a630 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
2a640 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
2a650 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79  lause, then only
2a660 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20   that one index 
2a670 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64  is.    ** consid
2a680 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ered. */.    if(
2a690 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20   pSrc->pIndex ) 
2a6a0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
2a6b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
2a6c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2a6d0 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
2a6e0 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
2a6f0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
2a700 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  a table of the j
2a710 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62  oin identified b
2a720 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70  y.** pBuilder->p
2a730 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
2a740 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
2a750 74 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72  teed to be a vir
2a760 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  tual table..*/.s
2a770 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
2a780 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20  oopAddVirtual(. 
2a790 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
2a7a0 72 20 2a 70 42 75 69 6c 64 65 72 20 20 20 2f 2a  r *pBuilder   /*
2a7b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
2a7c0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a  formation */.){.
2a7d0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2a7e0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nfo;           /
2a7f0 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
2a800 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
2a810 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
2a820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2a830 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
2a840 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
2a850 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
2a860 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2a870 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
2a880 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2a890 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65   *pSrc;   /* The
2a8a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
2a8b0 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
2a8c0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
2a8d0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
2a8e0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
2a8f0 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73  o *pIdxInfo;.  s
2a900 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
2a910 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
2a920 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
2a930 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
2a940 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
2a950 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65  e *pUsage;.  Whe
2a960 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
2a970 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
2a980 20 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a   iTerm, mxTerm;.
2a990 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
2a9a0 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20  t;.  int seenIn 
2a9b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2a9c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
2a9d0 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73  IN operator is s
2a9e0 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65  een */.  int see
2a9f0 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  nVar = 0;       
2aa00 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2aa10 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20   a non-constant 
2aa20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65  constraint is se
2aa30 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61  en */.  int iPha
2aa40 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
2aa50 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74       /* 0: const
2aa60 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73   w/o IN, 1: cons
2aa70 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a  t, 2: no IN,  2:
2aa80 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f   IN */.  WhereLo
2aa90 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  op *pNew;.  int 
2aaa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2aab0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
2aac0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
2aad0 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
2aae0 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
2aaf0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57  pParse->db;.  pW
2ab00 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
2ab10 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  C;.  pNew = pBui
2ab20 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53  lder->pNew;.  pS
2ab30 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  rc = &pWInfo->pT
2ab40 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e  abList->a[pNew->
2ab50 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20  iTab];.  pTab = 
2ab60 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73  pSrc->pTab;.  as
2ab70 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28  sert( IsVirtual(
2ab80 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49  pTab) );.  pIdxI
2ab90 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e  nfo = allocateIn
2aba0 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  dexInfo(pParse, 
2abb0 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c  pWC, pSrc, pBuil
2abc0 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  der->pOrderBy);.
2abd0 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
2abe0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2abf0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d  E_NOMEM;.  pNew-
2ac00 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70  >prereq = 0;.  p
2ac10 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
2ac20 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  .  pNew->wsFlags
2ac30 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   = WHERE_VIRTUAL
2ac40 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e  TABLE;.  pNew->n
2ac50 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65  LTerm = 0;.  pNe
2ac60 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
2ac70 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65  ee = 0;.  pUsage
2ac80 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f   = pIdxInfo->aCo
2ac90 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
2aca0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   nConstraint = p
2acb0 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
2acc0 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72  aint;.  if( wher
2acd0 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
2ace0 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  pNew, nConstrain
2acf0 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
2ad00 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
2ad10 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72  Info);.    retur
2ad20 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2ad30 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73    }..  for(iPhas
2ad40 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20  e=0; iPhase<=3; 
2ad50 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69  iPhase++){.    i
2ad60 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69  f( !seenIn && (i
2ad70 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20  Phase&1)!=0 ){. 
2ad80 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20       iPhase++;. 
2ad90 20 20 20 20 20 69 66 28 20 69 50 68 61 73 65 3e       if( iPhase>
2ada0 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  3 ) break;.    }
2adb0 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 56 61  .    if( !seenVa
2adc0 72 20 26 26 20 69 50 68 61 73 65 3e 31 20 29 20  r && iPhase>1 ) 
2add0 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43  break;.    pIdxC
2ade0 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
2adf0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
2ae00 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
2ae10 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
2ae20 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2ae30 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
2ae40 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
2ae50 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20  xCons++){.      
2ae60 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
2ae70 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
2ae80 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
2ae90 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63  [j];.      switc
2aea0 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20  h( iPhase ){.   
2aeb0 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 20 20       case 0:    
2aec0 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74  /* Constants wit
2aed0 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72  hout IN operator
2aee0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49   */.          pI
2aef0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
2af00 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
2af10 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
2af20 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
2af30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2af40 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20  eenIn = 1;.     
2af50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2af60 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
2af70 65 71 52 69 67 68 74 21 3d 30 20 29 7b 0a 20 20  eqRight!=0 ){.  
2af80 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 56 61            seenVa
2af90 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r = 1;.         
2afa0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72   }else if( (pTer
2afb0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2afc0 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  O_IN)==0 ){.    
2afd0 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2afe0 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ->usable = 1;.  
2aff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b000 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2b010 20 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a     case 1:    /*
2b020 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20   Constants with 
2b030 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  IN operators */.
2b040 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2b050 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20  ( seenIn );.    
2b060 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2b070 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
2b080 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29  >prereqRight==0)
2b090 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2b0a0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
2b0b0 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  2:    /* Variabl
2b0c0 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f  es without IN */
2b0d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2b0e0 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20  t( seenVar );.  
2b0f0 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2b100 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
2b110 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2b120 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20  O_IN)==0;.      
2b130 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2b140 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a     default:   /*
2b150 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20   Variables with 
2b160 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
2b170 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
2b180 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  && seenIn );.   
2b190 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2b1a0 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
2b1b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2b1c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2b1d0 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
2b1e0 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
2b1f0 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  0])*pIdxInfo->nC
2b200 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
2b210 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
2b220 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
2b230 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
2b240 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
2b250 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
2b260 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
2b270 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
2b280 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
2b290 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2b2a0 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
2b2b0 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
2b2c0 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
2b2d0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
2b2e0 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
2b2f0 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62  _BIG_DBL / (doub
2b300 6c 65 29 32 3b 0a 20 20 20 20 72 63 20 3d 20 76  le)2;.    rc = v
2b310 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61  tabBestIndex(pPa
2b320 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49  rse, pTab, pIdxI
2b330 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nfo);.    if( rc
2b340 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f   ) goto whereLoo
2b350 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20  pAddVtab_exit;. 
2b360 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28     pIdxCons = *(
2b370 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
2b380 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
2b390 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
2b3a0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e  nstraint;.    pN
2b3b0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a  ew->prereq = 0;.
2b3c0 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b      mxTerm = -1;
2b3d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
2b3e0 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73  w->nLSlot>=nCons
2b3f0 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f  traint );.    fo
2b400 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
2b410 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d  aint; i++) pNew-
2b420 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a  >aLTerm[i] = 0;.
2b430 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2b440 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  .omitMask = 0;. 
2b450 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
2b460 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
2b470 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
2b480 20 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20     if( (iTerm = 
2b490 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  pUsage[i].argvIn
2b4a0 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20  dex - 1)>=0 ){. 
2b4b0 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43         j = pIdxC
2b4c0 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
2b4d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54  ;.        if( iT
2b4e0 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm>=nConstraint
2b4f0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30  .         || j<0
2b500 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d  .         || j>=
2b510 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20  pWC->nTerm.     
2b520 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54      || pNew->aLT
2b530 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20  erm[iTerm]!=0.  
2b540 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2b550 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2b560 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
2b570 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2b580 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73  pParse, "%s.xBes
2b590 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63  tIndex() malfunc
2b5a0 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  tion", pTab->zNa
2b5b0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
2b5c0 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  oto whereLoopAdd
2b5d0 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20  Vtab_exit;.     
2b5e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
2b5f0 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43  tcase( iTerm==nC
2b600 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20  onstraint-1 );. 
2b610 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2b620 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   j==0 );.       
2b630 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57   testcase( j==pW
2b640 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20  C->nTerm-1 );.  
2b650 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
2b660 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20  WC->a[j];.      
2b670 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c    pNew->prereq |
2b680 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  = pTerm->prereqR
2b690 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
2b6a0 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77  sert( iTerm<pNew
2b6b0 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20  ->nLSlot );.    
2b6c0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
2b6d0 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b  [iTerm] = pTerm;
2b6e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
2b6f0 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65  rm>mxTerm ) mxTe
2b700 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20  rm = iTerm;.    
2b710 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
2b720 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20  erm==15 );.     
2b730 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
2b740 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20  rm==16 );.      
2b750 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26    if( iTerm<16 &
2b760 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  & pUsage[i].omit
2b770 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e   ) pNew->u.vtab.
2b780 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69  omitMask |= 1<<i
2b790 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
2b7a0 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
2b7b0 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
2b7c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2b7d0 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d   pUsage[i].omit=
2b7e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2b7f0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    /* Do not atte
2b800 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e  mpt to use an IN
2b810 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74   constraint if t
2b820 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
2b830 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2b840 73 61 79 73 20 74 68 61 74 20 74 68 65 20 65 71  says that the eq
2b850 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73  uivalent EQ cons
2b860 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
2b870 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e   safely omitted.
2b880 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2b890 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74  If we do attempt
2b8a0 20 74 6f 20 75 73 65 20 73 75 63 68 20 61 20 63   to use such a c
2b8b0 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20  onstraint, some 
2b8c0 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20  rows might be.  
2b8d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70            ** rep
2b8e0 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74  eated in the out
2b8f0 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  put. */.        
2b900 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2b910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b920 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61   /* A virtual ta
2b930 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  ble that is cons
2b940 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e  trained by an IN
2b950 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a   clause may not.
2b960 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
2b970 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42  sume the ORDER B
2b980 59 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65  Y clause because
2b990 20 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f   (1) the order o
2b9a0 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20  f IN terms.     
2b9b0 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e       ** is not n
2b9c0 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74  ecessarily relat
2b9d0 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20  ed to the order 
2b9e0 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20  of output terms 
2b9f0 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
2ba00 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75   (2) Multiple ou
2ba10 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e  tputs from a sin
2ba20 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c  gle IN value wil
2ba30 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20  l not merge.    
2ba40 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65        ** togethe
2ba50 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  r.  */.         
2ba60 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
2ba70 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
2ba80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ba90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2baa0 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  i>=nConstraint )
2bab0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  {.      pNew->nL
2bac0 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b  Term = mxTerm+1;
2bad0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2bae0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65  New->nLTerm<=pNe
2baf0 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20  w->nLSlot );.   
2bb00 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2bb10 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66  idxNum = pIdxInf
2bb20 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20  o->idxNum;.     
2bb30 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
2bb40 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66  edFree = pIdxInf
2bb50 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2bb60 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49  Str;.      pIdxI
2bb70 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2bb80 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20  dxStr = 0;.     
2bb90 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
2bba0 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xStr = pIdxInfo-
2bbb0 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70  >idxStr;.      p
2bbc0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72  New->u.vtab.isOr
2bbd0 64 65 72 65 64 20 3d 20 28 75 38 29 28 28 70 49  dered = (u8)((pI
2bbe0 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
2bbf0 21 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  !=0).           
2bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc10 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
2bc20 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
2bc30 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 70  nsumed);.      p
2bc40 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
2bc50 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
2bc60 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 46 72 6f  n = whereCostFro
2bc70 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f  mDouble(pIdxInfo
2bc80 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
2bc90 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
2bca0 47 3a 20 45 76 65 72 79 20 76 69 72 74 75 61 6c  G: Every virtual
2bcb0 20 74 61 62 6c 65 20 71 75 65 72 79 20 72 65 74   table query ret
2bcc0 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a  urns 25 rows */.
2bcd0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
2bce0 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20   = 46;  assert( 
2bcf0 34 36 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35  46==whereCost(25
2bd00 29 20 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65  ) );.      where
2bd10 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
2bd20 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
2bd30 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74    if( pNew->u.vt
2bd40 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20  ab.needFree ){. 
2bd50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2bd60 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ree(pNew->u.vtab
2bd70 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20  .idxStr);.      
2bd80 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
2bd90 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  eedFree = 0;.   
2bda0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20     }.    }.  }  
2bdb0 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  ..whereLoopAddVt
2bdc0 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70  ab_exit:.  if( p
2bdd0 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
2bde0 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69  reeIdxStr ) sqli
2bdf0 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66  te3_free(pIdxInf
2be00 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  o->idxStr);.  sq
2be10 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2be20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74  pIdxInfo);.  ret
2be30 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
2be40 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2be50 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
2be60 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65  ./*.** Add Where
2be70 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20  Loop entries to 
2be80 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e  handle OR terms.
2be90 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72    This works for
2bea0 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65   either.** btree
2beb0 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62  s or virtual tab
2bec0 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les..*/.static i
2bed0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f  nt whereLoopAddO
2bee0 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  r(WhereLoopBuild
2bef0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69  er *pBuilder, Bi
2bf00 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20  tmask mExtra){. 
2bf10 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2bf20 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
2bf30 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c  WInfo;.  WhereCl
2bf40 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65  ause *pWC;.  Whe
2bf50 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
2bf60 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2bf70 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74  , *pWCEnd;.  int
2bf80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bf90 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57  .  int iCur;.  W
2bfa0 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57  hereClause tempW
2bfb0 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  C;.  WhereLoopBu
2bfc0 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b  ilder sSubBuild;
2bfd0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 73 42 65  .  WhereLoop sBe
2bfe0 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
2bff0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2c000 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75  ;.  .  pWC = pBu
2c010 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66  ilder->pWC;.  if
2c020 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
2c030 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44  lags & WHERE_AND
2c040 5f 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53  _ONLY ) return S
2c050 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45  QLITE_OK;.  pWCE
2c060 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
2c070 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77  C->nTerm;.  pNew
2c080 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
2c090 77 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  w;..  for(pTerm=
2c0a0 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
2c0b0 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  CEnd && rc==SQLI
2c0c0 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b  TE_OK; pTerm++){
2c0d0 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
2c0e0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2c0f0 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  OR)!=0.     && (
2c100 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
2c110 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e  ->indexable & pN
2c120 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  ew->maskSelf)!=0
2c130 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
2c140 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
2c150 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
2c160 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
2c170 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
2c180 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
2c190 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
2c1a0 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
2c1b0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2c1c0 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 57 68  OrTerm;.      Wh
2c1d0 65 72 65 43 6f 73 74 20 72 54 6f 74 61 6c 20 3d  ereCost rTotal =
2c1e0 20 30 3b 0a 20 20 20 20 20 20 57 68 65 72 65 43   0;.      WhereC
2c1f0 6f 73 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20  ost nRow = 0;.  
2c200 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72      Bitmask prer
2c210 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20  eq = mExtra;.   
2c220 20 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f   .      whereLoo
2c230 70 49 6e 69 74 28 26 73 42 65 73 74 29 3b 0a 20  pInit(&sBest);. 
2c240 20 20 20 20 20 70 49 74 65 6d 20 3d 20 70 57 49       pItem = pWI
2c250 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
2c260 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
2c270 20 20 20 20 20 69 43 75 72 20 3d 20 70 49 74 65       iCur = pIte
2c280 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
2c290 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70    sSubBuild = *p
2c2a0 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73  Builder;.      s
2c2b0 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42  SubBuild.pOrderB
2c2c0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75  y = 0;.      sSu
2c2d0 62 42 75 69 6c 64 2e 70 42 65 73 74 20 3d 20 26  bBuild.pBest = &
2c2e0 73 42 65 73 74 3b 0a 0a 20 20 20 20 20 20 66 6f  sBest;..      fo
2c2f0 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
2c300 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
2c310 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
2c320 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
2c330 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
2c340 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
2c350 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  {.          sSub
2c360 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72  Build.pWC = &pOr
2c370 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
2c380 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  ->wc;.        }e
2c390 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
2c3a0 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
2c3b0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  r ){.          t
2c3c0 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70  empWC.pWInfo = p
2c3d0 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20  WC->pWInfo;.    
2c3e0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
2c3f0 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
2c400 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
2c410 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
2c420 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
2c430 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
2c440 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
2c450 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  m;.          sSu
2c460 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65  bBuild.pWC = &te
2c470 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65  mpWC;.        }e
2c480 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2c490 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2c4a0 20 7d 0a 20 20 20 20 20 20 20 20 73 42 65 73 74   }.        sBest
2c4b0 2e 6d 61 73 6b 53 65 6c 66 20 3d 20 30 3b 0a 20  .maskSelf = 0;. 
2c4c0 20 20 20 20 20 20 20 73 42 65 73 74 2e 72 53 65         sBest.rSe
2c4d0 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tup = 0;.       
2c4e0 20 73 42 65 73 74 2e 72 52 75 6e 20 3d 20 30 3b   sBest.rRun = 0;
2c4f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c500 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2c510 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  E.        if( Is
2c520 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
2c530 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
2c540 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2c550 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62  AddVirtual(&sSub
2c560 42 75 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Build);.        
2c570 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
2c580 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2c590 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2c5a0 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75 69  ddBtree(&sSubBui
2c5b0 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  ld, mExtra);.   
2c5c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
2c5d0 2a 20 73 42 65 73 74 2e 6d 61 73 6b 53 65 6c 66  * sBest.maskSelf
2c5e0 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 20   is always zero 
2c5f0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
2c600 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  rs */.        as
2c610 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2c620 5f 4f 4b 20 7c 7c 20 73 42 65 73 74 2e 6d 61 73  _OK || sBest.mas
2c630 6b 53 65 6c 66 3d 3d 30 20 29 3b 0a 20 20 20 20  kSelf==0 );.    
2c640 20 20 20 20 69 66 28 20 73 42 65 73 74 2e 6d 61      if( sBest.ma
2c650 73 6b 53 65 6c 66 3d 3d 30 20 29 20 62 72 65 61  skSelf==0 ) brea
2c660 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  k;.        asser
2c670 74 28 20 73 42 65 73 74 2e 72 53 65 74 75 70 3d  t( sBest.rSetup=
2c680 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 54  =0 );.        rT
2c690 6f 74 61 6c 20 3d 20 77 68 65 72 65 43 6f 73 74  otal = whereCost
2c6a0 41 64 64 28 72 54 6f 74 61 6c 2c 20 73 42 65 73  Add(rTotal, sBes
2c6b0 74 2e 72 52 75 6e 29 3b 0a 20 20 20 20 20 20 20  t.rRun);.       
2c6c0 20 6e 52 6f 77 20 3d 20 77 68 65 72 65 43 6f 73   nRow = whereCos
2c6d0 74 41 64 64 28 6e 52 6f 77 2c 20 73 42 65 73 74  tAdd(nRow, sBest
2c6e0 2e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  .nOut);.        
2c6f0 70 72 65 72 65 71 20 7c 3d 20 73 42 65 73 74 2e  prereq |= sBest.
2c700 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 7d 0a  prereq;.      }.
2c710 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
2c720 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 31 20 29 3b  ew->nLSlot>=1 );
2c730 0a 20 20 20 20 20 20 69 66 28 20 73 42 65 73 74  .      if( sBest
2c740 2e 6d 61 73 6b 53 65 6c 66 20 29 7b 0a 20 20 20  .maskSelf ){.   
2c750 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
2c760 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  m = 1;.        p
2c770 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
2c780 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
2c790 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2c7a0 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
2c7b0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
2c7c0 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  etup = 0;.      
2c7d0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 75 6c    /* TUNING: Mul
2c7e0 74 69 70 6c 65 20 62 79 20 33 2e 35 20 66 6f 72  tiple by 3.5 for
2c7f0 20 74 68 65 20 73 65 63 6f 6e 64 61 72 79 20 74   the secondary t
2c800 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20  able lookup */. 
2c810 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
2c820 6e 20 3d 20 72 54 6f 74 61 6c 20 2b 20 31 38 3b  n = rTotal + 18;
2c830 20 61 73 73 65 72 74 28 20 31 38 3d 3d 77 68 65   assert( 18==whe
2c840 72 65 43 6f 73 74 28 37 29 2d 77 68 65 72 65 43  reCost(7)-whereC
2c850 6f 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20  ost(2) );.      
2c860 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
2c870 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  Row;.        pNe
2c880 77 2d 3e 70 72 65 72 65 71 20 3d 20 70 72 65 72  w->prereq = prer
2c890 65 71 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  eq;.        mems
2c8a0 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20  et(&pNew->u, 0, 
2c8b0 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29  sizeof(pNew->u))
2c8c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
2c8d0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
2c8e0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
2c8f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
2c900 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 70 57 49  ereLoopClear(pWI
2c910 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  nfo->pParse->db,
2c920 20 26 73 42 65 73 74 29 3b 0a 20 20 20 20 7d 0a   &sBest);.    }.
2c930 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2c940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  .}../*.** Add al
2c950 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
2c960 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  cts for all tabl
2c970 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es .*/.static in
2c980 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  t whereLoopAddAl
2c990 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  l(WhereLoopBuild
2c9a0 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20  er *pBuilder){. 
2c9b0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2c9c0 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
2c9d0 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b  WInfo;.  Bitmask
2c9e0 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42   mExtra = 0;.  B
2c9f0 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20  itmask mPrior = 
2ca00 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
2ca10 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2ca20 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
2ca30 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
2ca40 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2ca50 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
2ca60 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
2ca70 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
2ca80 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
2ca90 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20  ->nLevel;.  int 
2caa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2cab0 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79    u8 priorJoinTy
2cac0 70 65 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c  pe = 0;.  WhereL
2cad0 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a  oop *pNew;..  /*
2cae0 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   Loop over the t
2caf0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
2cb00 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  n, from left to 
2cb10 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20  right */.  pNew 
2cb20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2cb30 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
2cb40 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69  t(pNew);.  for(i
2cb50 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61  Tab=0, pItem=pTa
2cb60 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e  bList->a; iTab<n
2cb70 54 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c  TabList; iTab++,
2cb80 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70   pItem++){.    p
2cb90 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62  New->iTab = iTab
2cba0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b  ;.    pNew->mask
2cbb0 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26  Self = getMask(&
2cbc0 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
2cbd0 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
2cbe0 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74  );.    if( ((pIt
2cbf0 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72 69  em->jointype|pri
2cc00 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26 20 28 4a  orJoinType) & (J
2cc10 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
2cc20 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 45  )!=0 ){.      mE
2cc30 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20  xtra = mPrior;. 
2cc40 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f     }.    priorJo
2cc50 69 6e 54 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e  inType = pItem->
2cc60 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69 66  jointype;.    if
2cc70 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65  ( IsVirtual(pIte
2cc80 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
2cc90 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2cca0 41 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c  AddVirtual(pBuil
2ccb0 64 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  der);.    }else{
2ccc0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
2ccd0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42  eLoopAddBtree(pB
2cce0 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
2ccf0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2cd00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2cd10 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2cd20 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64  LoopAddOr(pBuild
2cd30 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  er, mExtra);.   
2cd40 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d   }.    mPrior |=
2cd50 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b   pNew->maskSelf;
2cd60 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64  .    if( rc || d
2cd70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2cd80 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77  ) break;.  }.  w
2cd90 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62  hereLoopClear(db
2cda0 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
2cdb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
2cdc0 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61  xamine a WherePa
2cdd0 74 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64  th (with the add
2cde0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74  ition of the ext
2cdf0 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20  ra WhereLoop of 
2ce00 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d  the 5th.** param
2ce10 65 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66  eters) to see if
2ce20 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73   it outputs rows
2ce30 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
2ce40 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f  d ORDER BY.** (o
2ce50 72 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68  r GROUP BY) with
2ce60 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20  out requiring a 
2ce70 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70  separate sort op
2ce80 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  eration.  Return
2ce90 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30 3a 20 20  :.** .**    0:  
2cea0 4f 52 44 45 52 20 42 59 20 69 73 20 6e 6f 74 20  ORDER BY is not 
2ceb0 73 61 74 69 73 66 69 65 64 2e 20 20 53 6f 72 74  satisfied.  Sort
2cec0 69 6e 67 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  ing required.** 
2ced0 20 20 20 31 3a 20 20 4f 52 44 45 52 20 42 59 20     1:  ORDER BY 
2cee0 69 73 20 73 61 74 69 73 66 69 65 64 2e 20 20 20  is satisfied.   
2cef0 20 20 20 4f 6d 69 74 20 73 6f 72 74 69 6e 67 0a     Omit sorting.
2cf00 2a 2a 20 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77  **   -1:  Unknow
2cf10 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 0a 2a  n at this time.*
2cf20 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
2cf30 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48  rocessing for WH
2cf40 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20  ERE_GROUPBY and 
2cf50 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
2cf60 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74   is not as.** st
2cf70 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55  rict.  With GROU
2cf80 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  P BY and DISTINC
2cf90 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69  T the only requi
2cfa0 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a  rement is that.*
2cfb0 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77  * equivalent row
2cfc0 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61  s appear immedia
2cfd0 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f  tely adjacent to
2cfe0 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47   one another.  G
2cff0 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44  ROUP BY.** and D
2d000 49 53 54 49 4e 54 20 64 6f 20 6e 6f 74 20 72 65  ISTINT do not re
2d010 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70  quire rows to ap
2d020 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74  pear in any part
2d030 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20  icular order as 
2d040 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76  long.** as equiv
2d050 65 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67  elent rows are g
2d060 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e  rouped together.
2d070 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50    Thus for GROUP
2d080 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
2d090 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79  .** the pOrderBy
2d0a0 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61   terms can be ma
2d0b0 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64  tched in any ord
2d0c0 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20  er.  With ORDER 
2d0d0 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64  BY, the .** pOrd
2d0e0 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20  erBy terms must 
2d0f0 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74  be matched in st
2d100 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67  rict left-to-rig
2d110 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ht order..*/.sta
2d120 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74  tic int wherePat
2d130 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
2d140 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  y(.  WhereInfo *
2d150 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68  pWInfo,    /* Th
2d160 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
2d170 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
2d180 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44  rderBy,   /* ORD
2d190 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
2d1a0 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c  Y or DISTINCT cl
2d1b0 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  ause to check */
2d1c0 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50  .  WherePath *pP
2d1d0 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ath,     /* The 
2d1e0 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65  WherePath to che
2d1f0 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ck */.  u16 wctr
2d200 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a  lFlags,       /*
2d210 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 57   Might contain W
2d220 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20  HERE_GROUPBY or 
2d230 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
2d240 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c   */.  u16 nLoop,
2d250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2d260 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2d270 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   in pPath->aLoop
2d280 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
2d290 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a  p *pLast,     /*
2d2a0 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c   Add this WhereL
2d2b0 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  oop to the end o
2d2c0 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  f pPath->aLoop[]
2d2d0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70   */.  Bitmask *p
2d2e0 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f  RevMask     /* O
2d2f0 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72  UT: Mask of Wher
2d300 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e  eLoops to run in
2d310 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
2d320 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74  /.){.  u8 revSet
2d330 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2d340 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b  True if rev is k
2d350 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76  nown */.  u8 rev
2d360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d370 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72  /* Composite sor
2d380 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
2d390 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20  revIdx;         
2d3a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74     /* Index sort
2d3b0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69   order */.  u8 i
2d3c0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20  sOrderDistinct; 
2d3d0 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57    /* All prior W
2d3e0 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72  hereLoops are or
2d3f0 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a  der-distinct */.
2d400 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c    u8 distinctCol
2d410 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20  umns;   /* True 
2d420 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20  if the loop has 
2d430 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20  UNIQUE NOT NULL 
2d440 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20  columns */.  u8 
2d450 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20  isMatch;        
2d460 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61     /* iColumn ma
2d470 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20  tches a term of 
2d480 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2d490 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f  use */.  u16 nCo
2d4a0 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
2d4b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2d4c0 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f  mns in pIndex */
2d4d0 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b  .  u16 nOrderBy;
2d4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d4f0 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  er terms in the 
2d500 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2d510 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
2d520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2d530 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  dex of WhereLoop
2d540 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20   in pPath being 
2d550 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69  processed */.  i
2d560 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
2d570 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2d580 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
2d590 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
2d5a0 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
2d5b0 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68  r for current Wh
2d5c0 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ereLoop */.  int
2d5d0 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
2d5e0 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e     /* A column n
2d5f0 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62  umber within tab
2d600 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65  le iCur */.  Whe
2d610 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
2d620 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68  0; /* Current Wh
2d630 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72  ereLoop being pr
2d640 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68  ocessed. */.  Wh
2d650 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
2d660 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
2d670 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
2d680 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
2d690 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20  pr *pOBExpr;    
2d6a0 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73      /* An expres
2d6b0 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52  sion from the OR
2d6c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2d6d0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
2d6e0 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c  l;       /* COLL
2d6f0 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  ATE function fro
2d700 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  m an ORDER BY cl
2d710 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49  ause term */.  I
2d720 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
2d730 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2d740 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
2d750 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  h pLoop */.  sql
2d760 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
2d770 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20  o->pParse->db;  
2d780 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
2d790 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  ection */.  Bitm
2d7a0 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20  ask obSat = 0;  
2d7b0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
2d7c0 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69  ER BY terms sati
2d7d0 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  sfied so far */.
2d7e0 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65    Bitmask obDone
2d7f0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ;       /* Mask 
2d800 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20  of all ORDER BY 
2d810 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
2d820 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  sk orderDistinct
2d830 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f  Mask;  /* Mask o
2d840 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72  f all well-order
2d850 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69  ed loops */.  Bi
2d860 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20  tmask ready;    
2d870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
2d880 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  k of inner loops
2d890 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57   */..  /*.  ** W
2d8a0 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
2d8b0 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22  oop is "one-row"
2d8c0 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73   if it generates
2d8d0 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
2d8e0 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75  e.  ** row of ou
2d8f0 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f  tput.  A WhereLo
2d900 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66  op is one-row if
2d910 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
2d920 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
2d930 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e    **  (a) All in
2d940 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63  dex columns matc
2d950 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c  h with WHERE_COL
2d960 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62  UMN_EQ..  **  (b
2d970 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75  ) The index is u
2d980 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57  nique.  ** Any W
2d990 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e  hereLoop with an
2d9a0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
2d9b0 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74   constraint on t
2d9c0 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d  he rowid is one-
2d9d0 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20  row..  ** Every 
2d9e0 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
2d9f0 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20  p will have the 
2da00 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74  WHERE_ONEROW bit
2da10 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e   set in wsFlags.
2da20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  **.  ** We sa
2da30 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
2da40 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e  is "order-distin
2da50 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f  ct" if the set o
2da60 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20  f columns from. 
2da70 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f   ** that WhereLo
2da80 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  op that are in t
2da90 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2daa0 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  se are different
2dab0 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20   for every.  ** 
2dac0 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65  row of the Where
2dad0 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65  Loop.  Every one
2dae0 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69  -row WhereLoop i
2daf0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  s automatically.
2db00 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69    ** order-disti
2db10 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f  nct.   A WhereLo
2db20 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63  op that has no c
2db30 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52  olumns in the OR
2db40 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
2db50 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d  ** is not order-
2db60 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20  distinct. To be 
2db70 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69  order-distinct i
2db80 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20  s not quite the 
2db90 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20  same as being.  
2dba0 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20  ** UNIQUE since 
2dbb0 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20  a UNIQUE column 
2dbc0 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76  or index can hav
2dbd0 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
2dbe0 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e  that .  ** are N
2dbf0 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c  ULL and NULL val
2dc00 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  ues are equivale
2dc10 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  nt for the purpo
2dc20 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74  se of order-dist
2dc30 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65  inct..  ** To be
2dc40 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c   order-distinct,
2dc50 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73   the columns mus
2dc60 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20  t be UNIQUE and 
2dc70 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20  NOT NULL..  **. 
2dc80 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
2dc90 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77  r a table is alw
2dca0 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e  ays UNIQUE and N
2dcb0 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65  OT NULL so whene
2dcc0 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77  ver the.  ** row
2dcd0 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  id appears in th
2dce0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2dcf0 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
2dd00 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ding WhereLoop i
2dd10 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63  s.  ** automatic
2dd20 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69  ally order-disti
2dd30 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73  nct..  */..  ass
2dd40 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
2dd50 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62   );..  /* Sortab
2dd60 69 6c 69 74 79 20 6f 66 20 76 69 72 74 75 61 6c  ility of virtual
2dd70 20 74 61 62 6c 65 73 20 69 73 20 64 65 74 65 72   tables is deter
2dd80 6d 69 6e 65 64 20 62 79 20 74 68 65 20 78 42 65  mined by the xBe
2dd90 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20  stIndex method. 
2dda0 20 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75   ** of the virtu
2ddb0 61 6c 20 74 61 62 6c 65 20 69 74 73 65 6c 66 20  al table itself 
2ddc0 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 2d 3e  */.  if( pLast->
2ddd0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2dde0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a  VIRTUALTABLE ){.
2ddf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 4c      testcase( nL
2de00 6f 6f 70 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75  oop>0 );  /* Tru
2de10 65 20 77 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f  e when outer loo
2de20 70 73 20 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61  ps are one-row a
2de30 6e 64 20 6d 61 74 63 68 20 0a 20 20 20 20 20 20  nd match .      
2de40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de50 20 20 20 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20      ** no ORDER 
2de60 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  BY terms */.    
2de70 72 65 74 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e  return pLast->u.
2de80 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a  vtab.isOrdered;.
2de90 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20    }.  if( nLoop 
2dea0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  && OptimizationD
2deb0 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
2dec0 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
2ded0 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  n) ) return 0;..
2dee0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
2def0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
2df00 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72  testcase( nOrder
2df10 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  By==BMS-1 );.  i
2df20 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d  f( nOrderBy>BMS-
2df30 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  1 ) return 0;  /
2df40 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a  * Cannot optimiz
2df50 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f  e overly large O
2df60 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73  RDER BYs */.  is
2df70 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2df80 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41  1;.  obDone = MA
2df90 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d  SKBIT(nOrderBy)-
2dfa0 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e  1;.  orderDistin
2dfb0 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65  ctMask = 0;.  re
2dfc0 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ady = 0;.  for(i
2dfd0 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44  Loop=0; isOrderD
2dfe0 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74  istinct && obSat
2dff0 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70  <obDone && iLoop
2e000 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  <=nLoop; iLoop++
2e010 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70  ){.    if( iLoop
2e020 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c  >0 ) ready |= pL
2e030 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
2e040 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70     pLoop = iLoop
2e050 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e  <nLoop ? pPath->
2e060 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70  aLoop[iLoop] : p
2e070 4c 61 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  Last;.    assert
2e080 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
2e090 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
2e0a0 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20  LTABLE)==0 );.  
2e0b0 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d    iCur = pWInfo-
2e0c0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f  >pTabList->a[pLo
2e0d0 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f  op->iTab].iCurso
2e0e0 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  r;..    /* Mark 
2e0f0 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59  off any ORDER BY
2e100 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20   term X that is 
2e110 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
2e120 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20  table of.    ** 
2e130 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
2e140 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65   for which there
2e150 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20   is term in the 
2e160 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61  WHERE.    ** cla
2e170 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  use of the form 
2e180 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f  X IS NULL or X=?
2e190 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
2e1a0 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a  only outer.    *
2e1b0 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a  * loops..    */.
2e1c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2e1d0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
2e1e0 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
2e1f0 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
2e200 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f  ntinue;.      pO
2e210 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  BExpr = sqlite3E
2e220 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
2e230 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2e240 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
2e250 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
2e260 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75  COLUMN ) continu
2e270 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42  e;.      if( pOB
2e280 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43  Expr->iTable!=iC
2e290 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
2e2a0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
2e2b0 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73  dTerm(&pWInfo->s
2e2c0 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70  WC, iCur, pOBExp
2e2d0 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  r->iColumn,.    
2e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2f0 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51     ~ready, WO_EQ
2e300 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a  |WO_ISNULL, 0);.
2e310 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
2e320 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2e330 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2e340 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51  >eOperator&WO_EQ
2e350 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d  )!=0 && pOBExpr-
2e360 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20  >iColumn>=0 ){. 
2e370 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2e380 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20  r *z1, *z2;.    
2e390 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2e3a0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2e3b0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
2e3c0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2e3d0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
2e3e0 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
2e3f0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
2e400 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70  ;.        z1 = p
2e410 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
2e420 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2e430 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2e440 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
2e450 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pTerm->pExpr);. 
2e460 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
2e470 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
2e480 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2e490 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a     z2 = pColl->z
2e4a0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
2e4b0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
2e4c0 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f  (z1, z2)!=0 ) co
2e4d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
2e4e0 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
2e4f0 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d  ASKBIT(i);.    }
2e500 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ..    if( (pLoop
2e510 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2e520 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a  E_ONEROW)==0 ){.
2e530 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
2e540 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2e550 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  _IPK ){.        
2e560 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
2e570 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b      nColumn = 0;
2e580 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2e590 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70   (pIndex = pLoop
2e5a0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2e5b0 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  )==0 || pIndex->
2e5c0 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20  bUnordered ){.  
2e5d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2e5e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e5f0 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70       nColumn = p
2e600 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  Index->nColumn;.
2e610 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
2e620 69 73 74 69 6e 63 74 20 3d 20 70 49 6e 64 65 78  istinct = pIndex
2e630 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
2e640 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ne;.      }..   
2e650 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
2e660 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  gh all columns o
2e670 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
2e680 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e  deal with the on
2e690 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  es.      ** that
2e6a0 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61   are not constra
2e6b0 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e  ined by == or IN
2e6c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2e6d0 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20   rev = revSet = 
2e6e0 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63  0;.      distinc
2e6f0 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20  tColumns = 0;.  
2e700 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 3d      for(j=0; j<=
2e710 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
2e720 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b         u8 bOnce;
2e730 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75     /* True to ru
2e740 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 73  n the ORDER BY s
2e750 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  earch loop */.. 
2e760 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f         /* Skip o
2e770 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55  ver == and IS NU
2e780 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  LL terms */.    
2e790 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d      if( j<pLoop-
2e7a0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
2e7b0 20 20 20 20 20 20 26 26 20 28 28 69 20 3d 20 70        && ((i = p
2e7c0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d  Loop->aLTerm[j]-
2e7d0 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57  >eOperator) & (W
2e7e0 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29  O_EQ|WO_ISNULL))
2e7f0 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
2e800 20 20 20 20 20 20 20 20 20 69 66 28 20 69 20 26           if( i &
2e810 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
2e820 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2e830 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
2e840 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nct );.         
2e850 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2e860 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
2e870 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f    }.          co
2e880 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20  ntinue;  .      
2e890 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2e8a0 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  Get the column n
2e8b0 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62  umber in the tab
2e8c0 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64  le (iColumn) and
2e8d0 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20   sort order.    
2e8e0 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20      ** (revIdx) 
2e8f0 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c  for the j-th col
2e900 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
2e910 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2e920 20 20 20 20 20 69 66 28 20 6a 3c 6e 43 6f 6c 75       if( j<nColu
2e930 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
2e940 2f 2a 20 4e 6f 72 6d 61 6c 20 69 6e 64 65 78 20  /* Normal index 
2e950 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
2e960 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
2e970 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
2e980 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  j];.          re
2e990 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61  vIdx = pIndex->a
2e9a0 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20  SortOrder[j];.  
2e9b0 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
2e9c0 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61  umn==pIndex->pTa
2e9d0 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f  ble->iPKey ) iCo
2e9e0 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
2e9f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ea00 20 20 20 20 2f 2a 20 54 68 65 20 52 4f 57 49 44      /* The ROWID
2ea10 20 63 6f 6c 75 6d 6e 20 61 74 20 74 68 65 20 65   column at the e
2ea20 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
2ea30 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 6f 6c 75  assert( j==nColu
2ea40 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mn );.          
2ea50 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
2ea60 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d          revIdx =
2ea70 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
2ea80 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63         /* An unc
2ea90 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d  onstrained colum
2eaa0 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  n that might be 
2eab0 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  NULL means that 
2eac0 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
2ead0 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74  WhereLoop is not
2eae0 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 0a 20   well-ordered . 
2eaf0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2eb00 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
2eb10 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26  tinct.         &
2eb20 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  & iColumn>=0.   
2eb30 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f        && j>=pLoo
2eb40 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20  p->u.btree.nEq. 
2eb50 20 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65          && pInde
2eb60 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
2eb70 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
2eb80 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
2eb90 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2eba0 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
2ebb0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2ebc0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44   /* Find the ORD
2ebd0 45 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20  ER BY term that 
2ebe0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
2ebf0 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20  he j-th column. 
2ec00 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
2ec10 20 69 6e 64 65 78 20 61 6e 64 20 61 6e 64 20 6d   index and and m
2ec20 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42  ark that ORDER B
2ec30 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20  Y term off .    
2ec40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62      */.        b
2ec50 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Once = 1;.      
2ec60 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20    isMatch = 0;. 
2ec70 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2ec80 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65  bOnce && i<nOrde
2ec90 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
2eca0 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
2ecb0 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
2ecc0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2ecd0 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69    pOBExpr = sqli
2ece0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2ecf0 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  te(pOrderBy->a[i
2ed00 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
2ed10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63      testcase( wc
2ed20 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2ed30 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20  _GROUPBY );.    
2ed40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ed50 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2ed60 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b  RE_DISTINCTBY );
2ed70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
2ed80 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48  wctrlFlags & (WH
2ed90 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52  ERE_GROUPBY|WHER
2eda0 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d  E_DISTINCTBY))==
2edb0 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20  0 ) bOnce = 0;. 
2edc0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
2edd0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
2ede0 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UMN ) continue;.
2edf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
2ee00 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
2ee10 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
2ee20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
2ee30 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  BExpr->iColumn!=
2ee40 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  iColumn ) contin
2ee50 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
2ee60 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ( iColumn>=0 ){.
2ee70 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2ee80 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
2ee90 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
2eea0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
2eeb0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2eec0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2eed0 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
2eee0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
2eef0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2ef00 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
2ef10 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  ll->zName, pInde
2ef20 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30  x->azColl[j])!=0
2ef30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2ef40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ef50 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a     isMatch = 1;.
2ef60 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2ef70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ef80 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29     if( isMatch )
2ef90 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2efa0 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
2efb0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2efc0 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  e( distinctColum
2efd0 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ns==0 );.       
2efe0 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c       distinctCol
2eff0 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  umns = 1;.      
2f000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2f010 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
2f020 28 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (i);.          i
2f030 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
2f040 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
2f050 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20  ROUPBY)==0 ){.  
2f060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
2f070 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20  e sure the sort 
2f080 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69  order is compati
2f090 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  ble in an ORDER 
2f0a0 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20  BY clause..     
2f0b0 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f         ** Sort o
2f0c0 72 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61  rder is irreleva
2f0d0 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42  nt for a GROUP B
2f0e0 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20  Y clause. */.   
2f0f0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
2f100 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Set ){.         
2f110 20 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20       if( (rev ^ 
2f120 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42  revIdx)!=pOrderB
2f130 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
2f140 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
2f150 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2f160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2f170 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f  ev = revIdx ^ pO
2f180 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
2f190 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20  tOrder;.        
2f1a0 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20        if( rev ) 
2f1b0 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53  *pRevMask |= MAS
2f1c0 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20  KBIT(iLoop);.   
2f1d0 20 20 20 20 20 20 20 20 20 20 20 72 65 76 53 65             revSe
2f1e0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
2f1f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2f200 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2f210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
2f220 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20  match found */. 
2f230 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
2f240 30 20 7c 7c 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29  0 || j<nColumn )
2f250 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
2f260 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
2f270 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20  istinct!=0 );.  
2f280 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
2f290 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
2f2a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f2b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f2c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a      }.      } /*
2f2d0 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61   end Loop over a
2f2e0 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  ll index columns
2f2f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69   */.      if( di
2f300 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b  stinctColumns ){
2f310 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2f320 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
2f330 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
2f340 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2f350 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
2f360 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f    } /* end-if no
2f370 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20  t one-row */..  
2f380 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
2f390 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59  y other ORDER BY
2f3a0 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65   terms that refe
2f3b0 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20  rence pLoop */. 
2f3c0 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69     if( isOrderDi
2f3d0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
2f3e0 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
2f3f0 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  k |= pLoop->mask
2f400 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28  Self;.      for(
2f410 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
2f420 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
2f430 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20  xpr *p;.        
2f440 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
2f450 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
2f460 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  e;.        p = p
2f470 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2f480 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
2f490 20 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65   (exprTableUsage
2f4a0 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
2f4b0 65 74 2c 20 70 29 26 7e 6f 72 64 65 72 44 69 73  et, p)&~orderDis
2f4c0 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b  tinctMask)==0 ){
2f4d0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74  .          obSat
2f4e0 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
2f4f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f500 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45  }.    }.  } /* E
2f510 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72  nd the loop over
2f520 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20   all WhereLoops 
2f530 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20  from outer-most 
2f540 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f  down to inner-mo
2f550 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61  st */.  if( obSa
2f560 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75  t==obDone ) retu
2f570 72 6e 20 31 3b 0a 20 20 69 66 28 20 21 69 73 4f  rn 1;.  if( !isO
2f580 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 20 72  rderDistinct ) r
2f590 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
2f5a0 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n -1;.}..#ifdef 
2f5b0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
2f5c0 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67  ED./* For debugg
2f5d0 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f  ing use only: */
2f5e0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
2f5f0 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d  ar *wherePathNam
2f600 65 28 57 68 65 72 65 50 61 74 68 20 2a 70 50 61  e(WherePath *pPa
2f610 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57  th, int nLoop, W
2f620 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29  hereLoop *pLast)
2f630 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
2f640 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74  zName[65];.  int
2f650 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
2f660 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e  <nLoop; i++){ zN
2f670 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e  ame[i] = pPath->
2f680 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d  aLoop[i]->cId; }
2f690 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a  .  if( pLast ) z
2f6a0 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73  Name[i++] = pLas
2f6b0 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b  t->cId;.  zName[
2f6c0 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  i] = 0;.  return
2f6d0 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66   zName;.}.#endif
2f6e0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  .../*.** Given t
2f6f0 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65  he list of Where
2f700 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 6f 6e 20  Loop objects on 
2f710 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
2f720 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
2f730 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64  attempts to find
2f740 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
2f750 20 70 61 74 68 20 74 68 61 74 20 76 69 73 69 74   path that visit
2f760 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70  s each WhereLoop
2f770 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20  .** once.  This 
2f780 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61  path is then loa
2f790 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49  ded into the pWI
2f7a0 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20  nfo->a[].pWLoop 
2f7b0 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73  fields..**.** As
2f7c0 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f  sume that the to
2f7d0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  tal number of ou
2f7e0 74 70 75 74 20 72 6f 77 73 20 74 68 61 74 20 77  tput rows that w
2f7f0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
2f800 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65  orted.** will be
2f810 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65   nRowEst (in the
2f820 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65   10*log2 represe
2f830 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69  ntation).  Or, i
2f840 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a  gnore sorting.**
2f850 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73   costs if nRowEs
2f860 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  t==0..**.** Retu
2f870 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
2f880 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54  success or SQLIT
2f890 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d  E_NOMEM of a mem
2f8a0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
2f8b0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  * error occurs..
2f8c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
2f8d0 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68  erePathSolver(Wh
2f8e0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
2f8f0 20 57 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 45   WhereCost nRowE
2f900 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f  st){.  int mxCho
2f910 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ice;            
2f920 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
2f930 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f  er of simultaneo
2f940 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65 64  us paths tracked
2f950 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b   */.  int nLoop;
2f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f970 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
2f980 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a  ms in the join *
2f990 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
2f9a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2f9b0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
2f9c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
2f9d0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2f9e0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
2f9f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
2fa00 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20  int iLoop;      
2fa10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2fa20 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74  p counter over t
2fa30 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
2fa40 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69  join */.  int ii
2fa50 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20  , jj;           
2fa60 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2fa70 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  ters */.  WhereC
2fa80 6f 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20  ost rCost;      
2fa90 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
2faa0 66 20 61 20 70 61 74 68 20 2a 2f 0a 20 20 57 68  f a path */.  Wh
2fab0 65 72 65 43 6f 73 74 20 6d 78 43 6f 73 74 20 3d  ereCost mxCost =
2fac0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   0;        /* Ma
2fad0 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20  ximum cost of a 
2fae0 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a  set of paths */.
2faf0 20 20 57 68 65 72 65 43 6f 73 74 20 72 53 6f 72    WhereCost rSor
2fb00 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 2f  tCost;         /
2fb10 2a 20 43 6f 73 74 20 74 6f 20 64 6f 20 61 20 73  * Cost to do a s
2fb20 6f 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  ort */.  int nTo
2fb30 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  , nFrom;        
2fb40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2fb50 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e  valid entries in
2fb60 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d   aTo[] and aFrom
2fb70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  [] */.  WherePat
2fb80 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20  h *aFrom;       
2fb90 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70    /* All nFrom p
2fba0 61 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76  aths at the prev
2fbb0 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  ious level */.  
2fbc0 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20  WherePath *aTo; 
2fbd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fbe0 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20   nTo best paths 
2fbf0 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
2fc00 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
2fc10 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20  ath *pFrom;     
2fc20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
2fc30 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61  t of aFrom[] tha
2fc40 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  t we are working
2fc50 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61   on */.  WherePa
2fc60 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20  th *pTo;        
2fc70 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
2fc80 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77   of aTo[] that w
2fc90 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
2fca0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
2fcb0 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  *pWLoop;        
2fcc0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68  /* One of the Wh
2fcd0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
2fce0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
2fcf0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *pX;           /
2fd00 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75  * Used to divy u
2fd10 70 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d  p the pSpace mem
2fd20 6f 72 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ory */.  char *p
2fd30 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
2fd40 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
2fd50 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
2fd60 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a  his routine */..
2fd70 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
2fd80 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  o->pParse;.  db 
2fd90 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2fda0 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  nLoop = pWInfo->
2fdb0 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e  nLevel;.  /* TUN
2fdc0 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20  ING: For simple 
2fdd0 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68  queries, only th
2fde0 65 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74  e best path is t
2fdf0 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72  racked..  ** For
2fe00 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68   2-way joins, th
2fe10 65 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61  e 5 best paths a
2fe20 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a  re followed..  *
2fe30 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33  * For joins of 3
2fe40 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c   or more tables,
2fe50 20 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65   track the 10 be
2fe60 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78  st paths */.  mx
2fe70 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3d  Choice = (nLoop=
2fe80 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70  =1) ? 1 : (nLoop
2fe90 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20  ==2 ? 5 : 10);. 
2fea0 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d   assert( nLoop<=
2feb0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2fec0 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52  ->nSrc );.  WHER
2fed0 45 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22  ETRACE(0x002, ("
2fee0 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65  ---- begin solve
2fef0 72 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c  r\n"));..  /* Al
2ff00 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
2ff10 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20  alize space for 
2ff20 61 54 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f  aTo and aFrom */
2ff30 0a 20 20 69 69 20 3d 20 28 73 69 7a 65 6f 66 28  .  ii = (sizeof(
2ff40 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f  WherePath)+sizeo
2ff50 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c  f(WhereLoop*)*nL
2ff60 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b  oop)*mxChoice*2;
2ff70 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69  .  pSpace = sqli
2ff80 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
2ff90 62 2c 20 69 69 29 3b 0a 20 20 69 66 28 20 70 53  b, ii);.  if( pS
2ffa0 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
2ffb0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2ffc0 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74   aTo = (WherePat
2ffd0 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72  h*)pSpace;.  aFr
2ffe0 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63  om = aTo+mxChoic
2fff0 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f  e;.  memset(aFro
30000 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72  m, 0, sizeof(aFr
30010 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20  om[0]));.  pX = 
30020 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46  (WhereLoop**)(aF
30030 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20  rom+mxChoice);. 
30040 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65   for(ii=mxChoice
30050 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69  *2, pFrom=aTo; i
30060 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d  i>0; ii--, pFrom
30070 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29  ++, pX += nLoop)
30080 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f  {.    pFrom->aLo
30090 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20  op = pX;.  }..  
300a0 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72  /* Seed the sear
300b0 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ch with a single
300c0 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61   WherePath conta
300d0 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65  ining zero Where
300e0 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Loops..  **.  **
300f0 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20   TUNING: Do not 
30100 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  let the number o
30110 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20  f iterations go 
30120 61 62 6f 76 65 20 32 35 2e 20 20 49 66 20 74 68  above 25.  If th
30130 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63  e cost.  ** of c
30140 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f  omputing an auto
30150 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e  matic index is n
30160 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74  ot paid back wit
30170 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 35  hin the first 25
30180 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e  .  ** rows, then
30190 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20   do not use the 
301a0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
301b0 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e   */.  aFrom[0].n
301c0 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65  Row = MIN(pParse
301d0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36  ->nQueryLoop, 46
301e0 29 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d  );  assert( 46==
301f0 77 68 65 72 65 43 6f 73 74 28 32 35 29 20 29 3b  whereCost(25) );
30200 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20  .  nFrom = 1;.. 
30210 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 20 74   /* Precompute t
30220 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69  he cost of sorti
30230 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73  ng the final res
30240 75 6c 74 20 73 65 74 2c 20 69 66 20 74 68 65 20  ult set, if the 
30250 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73  caller.  ** to s
30260 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
30270 28 29 20 77 61 73 20 63 6f 6e 63 65 72 6e 65 64  () was concerned
30280 20 61 62 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a   about sorting *
30290 2f 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20  /.  rSortCost = 
302a0 30 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  0;.  if( pWInfo-
302b0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
302c0 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20  nRowEst==0 ){.  
302d0 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64    aFrom[0].isOrd
302e0 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20  eredValid = 1;. 
302f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
30300 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64  UNING: Estimated
30310 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
30320 20 69 73 20 4e 2a 6c 6f 67 32 28 4e 29 20 77 68   is N*log2(N) wh
30330 65 72 65 20 4e 20 69 73 20 74 68 65 0a 20 20 20  ere N is the.   
30340 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75   ** number of ou
30350 74 70 75 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20  tput rows. */.  
30360 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52    rSortCost = nR
30370 6f 77 45 73 74 20 2b 20 65 73 74 4c 6f 67 28 6e  owEst + estLog(n
30380 52 6f 77 45 73 74 29 3b 0a 20 20 20 20 57 48 45  RowEst);.    WHE
30390 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 28 22  RETRACE(0x002,("
303a0 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25  ---- sort cost=%
303b0 2d 33 64 5c 6e 22 2c 20 72 53 6f 72 74 43 6f 73  -3d\n", rSortCos
303c0 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  t));.  }..  /* C
303d0 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76  ompute successiv
303e0 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65  ely longer Where
303f0 50 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20  Paths using the 
30400 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74  previous generat
30410 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72  ion.  ** of Wher
30420 65 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61  ePaths as the ba
30430 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  sis for the next
30440 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  .  Keep track of
30450 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20   the mxChoice.  
30460 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74  ** best paths at
30470 20 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e   each generation
30480 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
30490 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
304a0 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54  iLoop++){.    nT
304b0 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  o = 0;.    for(i
304c0 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d  i=0, pFrom=aFrom
304d0 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b  ; ii<nFrom; ii++
304e0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
304f0 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49    for(pWLoop=pWI
30500 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c  nfo->pLoops; pWL
30510 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f  oop; pWLoop=pWLo
30520 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a  op->pNextLoop){.
30530 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
30540 6d 61 73 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20  maskNew;.       
30550 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b   Bitmask revMask
30560 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38   = 0;.        u8
30570 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
30580 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  = pFrom->isOrder
30590 65 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20  edValid;.       
305a0 20 75 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20   u8 isOrdered = 
305b0 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
305c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
305d0 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20  WLoop->prereq & 
305e0 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70  ~pFrom->maskLoop
305f0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
30600 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
30610 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26  Loop->maskSelf &
30620 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
30630 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
30640 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74  .        /* At t
30650 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f  his point, pWLoo
30660 70 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  p is a candidate
30670 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20   to be the next 
30680 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a  loop. .        *
30690 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f  * Compute its co
306a0 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 43  st */.        rC
306b0 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74 41  ost = whereCostA
306c0 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75  dd(pWLoop->rSetu
306d0 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b  p,pWLoop->rRun +
306e0 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20   pFrom->nRow);. 
306f0 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77         rCost = w
30700 68 65 72 65 43 6f 73 74 41 64 64 28 72 43 6f 73  hereCostAdd(rCos
30710 74 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29  t, pFrom->rCost)
30720 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65  ;.        maskNe
30730 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  w = pFrom->maskL
30740 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61  oop | pWLoop->ma
30750 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20  skSelf;.        
30760 69 66 28 20 21 69 73 4f 72 64 65 72 65 64 56 61  if( !isOrderedVa
30770 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lid ){.         
30780 20 73 77 69 74 63 68 28 20 77 68 65 72 65 50 61   switch( wherePa
30790 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
307a0 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20  By(pWInfo,.     
307b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307c0 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
307d0 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66  By, pFrom, pWInf
307e0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20  o->wctrlFlags,. 
307f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30800 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c        iLoop, pWL
30810 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 20 29  oop, &revMask) )
30820 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  {.            ca
30830 73 65 20 31 3a 20 20 2f 2a 20 59 65 73 2e 20 20  se 1:  /* Yes.  
30840 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65  pFrom+pWLoop doe
30850 73 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  s satisfy the OR
30860 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
30870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
30880 73 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20  sOrdered = 1;.  
30890 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
308a0 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a  deredValid = 1;.
308b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
308c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
308d0 20 63 61 73 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e   case 0:  /* No.
308e0 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77    pFrom+pWLoop w
308f0 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 73 65  ill require a se
30900 70 61 72 61 74 65 20 73 6f 72 74 20 2a 2f 0a 20  parate sort */. 
30910 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
30920 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20 20 20  rdered = 0;.    
30930 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
30940 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  redValid = 1;.  
30950 20 20 20 20 20 20 20 20 20 20 20 20 72 43 6f 73              rCos
30960 74 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64  t = whereCostAdd
30970 28 72 43 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73  (rCost, rSortCos
30980 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
30990 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
309a0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a       default: /*
309b0 20 43 61 6e 6e 6f 74 20 74 65 6c 6c 20 79 65 74   Cannot tell yet
309c0 2e 20 20 54 72 79 20 61 67 61 69 6e 20 6f 6e 20  .  Try again on 
309d0 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
309e0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
309f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
30a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
30a10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
30a20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d  revMask = pFrom-
30a30 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  >revLoop;.      
30a40 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 43    }.        /* C
30a50 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
30a60 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20  WLoop should be 
30a70 61 64 64 65 64 20 74 6f 20 74 68 65 20 6d 78 43  added to the mxC
30a80 68 6f 69 63 65 20 62 65 73 74 20 73 6f 20 66 61  hoice best so fa
30a90 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  r */.        for
30aa0 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20  (jj=0, pTo=aTo; 
30ab0 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54  jj<nTo; jj++, pT
30ac0 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
30ad0 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f  if( pTo->maskLoo
30ae0 70 3d 3d 6d 61 73 6b 4e 65 77 20 26 26 20 70 54  p==maskNew && pT
30af0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
30b00 64 3d 3d 69 73 4f 72 64 65 72 65 64 56 61 6c 69  d==isOrderedVali
30b10 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
30b20 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e   testcase( jj==n
30b30 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  To-1 );.        
30b40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
30b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
30b60 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e  .        if( jj>
30b70 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  =nTo ){.        
30b80 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f    if( nTo>=mxCho
30b90 69 63 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d 78  ice && rCost>=mx
30ba0 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57  Cost ){.#ifdef W
30bb0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
30bc0 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  D.            if
30bd0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
30be0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
30bf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30c00 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69  DebugPrintf("Ski
30c10 70 20 20 20 25 73 20 63 6f 73 74 3d 25 33 64 20  p   %s cost=%3d 
30c20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
30c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
30c40 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
30c50 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
30c60 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20  p), rCost,.     
30c70 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
30c80 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69  rderedValid ? (i
30c90 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
30ca0 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
30cb0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
30cc0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  if.            c
30cd0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
30ce0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
30cf0 2a 20 41 64 64 20 61 20 6e 65 77 20 50 61 74 68  * Add a new Path
30d00 20 74 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73 65   to the aTo[] se
30d10 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  t */.          i
30d20 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20  f( nTo<mxChoice 
30d30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
30d40 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73  * Increase the s
30d50 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73  ize of the aTo s
30d60 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20  et by one */.   
30d70 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54           jj = nT
30d80 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  o++;.          }
30d90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
30da0 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65    /* New path re
30db0 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72  places the prior
30dc0 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63   worst to keep c
30dd0 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f  ount below mxCho
30de0 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ice */.         
30df0 20 20 20 66 6f 72 28 6a 6a 3d 6e 54 6f 2d 31 3b     for(jj=nTo-1;
30e00 20 61 54 6f 5b 6a 6a 5d 2e 72 43 6f 73 74 3c 6d   aTo[jj].rCost<m
30e10 78 43 6f 73 74 3b 20 6a 6a 2d 2d 29 7b 20 61 73  xCost; jj--){ as
30e20 73 65 72 74 28 6a 6a 3e 30 29 3b 20 7d 0a 20 20  sert(jj>0); }.  
30e30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30e40 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a      pTo = &aTo[j
30e50 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45  j];.#ifdef WHERE
30e60 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
30e70 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
30e80 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
30e90 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
30ea0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
30eb0 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20 63  ntf("New    %s c
30ec0 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25  ost=%-3d order=%
30ed0 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
30ee0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
30ef0 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
30f00 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
30f10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30f20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
30f30 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20   ? (isOrdered ? 
30f40 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
30f50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
30f60 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65  endif.        }e
30f70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
30f80 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72  f( pTo->rCost<=r
30f90 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57  Cost ){.#ifdef W
30fa0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
30fb0 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  D.            if
30fc0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
30fd0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
30fe0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30ff0 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
31000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
31010 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25  Skip   %s cost=%
31020 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  -3d order=%c",. 
31030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31040 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
31050 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
31060 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20  oop), rCost,.   
31070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
31080 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
31090 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  (isOrdered ? 'Y'
310a0 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
310b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
310c0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
310d0 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d  ("   vs %s cost=
310e0 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  %-3d order=%c\n"
310f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31100 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
31110 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
31120 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a  0), pTo->rCost,.
31130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31140 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
31150 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73  Valid ? (pTo->is
31160 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
31170 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
31180 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
31190 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  f.            te
311a0 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f  stcase( pTo->rCo
311b0 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20  st==rCost );.   
311c0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
311d0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
311e0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
311f0 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
31200 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20  Cost+1 );.      
31210 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 61 6e 64      /* A new and
31220 20 62 65 74 74 65 72 20 73 63 6f 72 65 20 66 6f   better score fo
31230 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20 63  r a previously c
31240 72 65 61 74 65 64 20 65 71 75 69 76 61 6c 65 6e  reated equivalen
31250 74 20 70 61 74 68 20 2a 2f 0a 23 69 66 64 65 66  t path */.#ifdef
31260 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
31270 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20 69 66  LED.          if
31280 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
31290 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
312a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
312b0 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
312c0 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61             "Upda
312d0 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20  te %s cost=%-3d 
312e0 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
312f0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
31300 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
31310 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
31320 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20  rCost,.         
31330 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
31340 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72  Valid ? (isOrder
31350 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
31360 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
31370 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
31380 50 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73  Printf("  was %s
31390 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72   cost=%-3d order
313a0 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
313b0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
313c0 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
313d0 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
313e0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
313f0 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
31400 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e  edValid ? (pTo->
31410 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20  isOrdered ? 'Y' 
31420 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20  : 'N') : '?');. 
31430 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
31440 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  f.        }.    
31450 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73      /* pWLoop is
31460 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20   a winner.  Add 
31470 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  it to the set of
31480 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a   best so far */.
31490 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73          pTo->mas
314a0 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d  kLoop = pFrom->m
314b0 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70  askLoop | pWLoop
314c0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
314d0 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70      pTo->revLoop
314e0 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20   = revMask;.    
314f0 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20      pTo->nRow = 
31500 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57  pFrom->nRow + pW
31510 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20  Loop->nOut;.    
31520 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d      pTo->rCost =
31530 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20   rCost;.        
31540 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
31550 6c 69 64 20 3d 20 69 73 4f 72 64 65 72 65 64 56  lid = isOrderedV
31560 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 70 54  alid;.        pT
31570 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69  o->isOrdered = i
31580 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20  sOrdered;.      
31590 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c    memcpy(pTo->aL
315a0 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  oop, pFrom->aLoo
315b0 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  p, sizeof(WhereL
315c0 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20  oop*)*iLoop);.  
315d0 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70        pTo->aLoop
315e0 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70  [iLoop] = pWLoop
315f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54  ;.        if( nT
31600 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20  o>=mxChoice ){. 
31610 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
31620 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a  = aTo[0].rCost;.
31630 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a            for(jj
31640 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b  =1, pTo=&aTo[1];
31650 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a   jj<mxChoice; jj
31660 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
31670 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
31680 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 29 20  >rCost>mxCost ) 
31690 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43  mxCost = pTo->rC
316a0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ost;.          }
316b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
316c0 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66   }.    }..#ifdef
316d0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
316e0 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
316f0 74 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32  te3WhereTrace>=2
31700 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
31710 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d  3DebugPrintf("--
31720 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25  -- after round %
31730 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70  d ----\n", iLoop
31740 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
31750 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e  0, pTo=aTo; ii<n
31760 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29  To; ii++, pTo++)
31770 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
31780 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
31790 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77  s cost=%-3d nrow
317a0 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  =%-3d order=%c",
317b0 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72  .           wher
317c0 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
317d0 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
317e0 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
317f0 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  w,.           pT
31800 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
31810 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65  d ? (pTo->isOrde
31820 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
31830 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
31840 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65   if( pTo->isOrde
31850 72 65 64 56 61 6c 69 64 20 26 26 20 70 54 6f 2d  redValid && pTo-
31860 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20  >isOrdered ){.  
31870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
31880 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76  ebugPrintf(" rev
31890 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d  =0x%llx\n", pTo-
318a0 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  >revLoop);.     
318b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
318c0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
318d0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
318e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
318f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
31900 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f    /* Swap the ro
31910 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64  les of aFrom and
31920 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78   aTo for the nex
31930 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  t generation */.
31940 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b      pFrom = aTo;
31950 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d  .    aTo = aFrom
31960 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46  ;.    aFrom = pF
31970 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d  rom;.    nFrom =
31980 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   nTo;.  }..  if(
31990 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20   nFrom==0 ){.   
319a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
319b0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65  (pParse, "no que
319c0 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20  ry solution");. 
319d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
319e0 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20  (db, pSpace);.  
319f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31a00 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20  ERROR;.  }.  .  
31a10 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65  /* Find the lowe
31a20 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70  st cost path.  p
31a30 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66  From will be lef
31a40 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
31a50 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72  at path */.  pFr
31a60 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 61 73  om = aFrom;.  as
31a70 73 65 72 74 28 20 6e 46 72 6f 6d 3d 3d 31 20 29  sert( nFrom==1 )
31a80 3b 0a 23 69 66 20 30 20 2f 2a 20 54 68 65 20 66  ;.#if 0 /* The f
31a90 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6e 65 65 64  ollowing is need
31aa0 65 64 20 69 66 20 6e 46 72 6f 6d 20 69 73 20 65  ed if nFrom is e
31ab0 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 31 20  ver more than 1 
31ac0 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69  */.  for(ii=1; i
31ad0 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a  i<nFrom; ii++){.
31ae0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72      if( pFrom->r
31af0 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72  Cost>aFrom[ii].r
31b00 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26  Cost ) pFrom = &
31b10 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 23  aFrom[ii];.  }.#
31b20 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
31b30 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
31b40 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f  nLoop );.  /* Lo
31b50 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  ad the lowest co
31b60 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49  st path into pWI
31b70 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  nfo */.  for(iLo
31b80 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
31b90 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
31ba0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
31bb0 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20  vel = pWInfo->a 
31bc0 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65  + iLoop;.    pLe
31bd0 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57  vel->pWLoop = pW
31be0 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c  Loop = pFrom->aL
31bf0 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20  oop[iLoop];.    
31c00 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20  pLevel->iFrom = 
31c10 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20  pWLoop->iTab;.  
31c20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75    pLevel->iTabCu
31c30 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  r = pWInfo->pTab
31c40 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
31c50 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a  iFrom].iCursor;.
31c60 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66    }.  if( (pWInf
31c70 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
31c80 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
31c90 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70  NCT)!=0.   && (p
31ca0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
31cb0 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
31cc0 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70  CTBY)==0.   && p
31cd0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
31ce0 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
31cf0 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77  _NOOP.   && nRow
31d00 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74  Est.  ){.    Bit
31d10 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20  mask notUsed;.  
31d20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65    int rc = where
31d30 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
31d40 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49  erBy(pWInfo, pWI
31d50 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c  nfo->pResultSet,
31d60 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20   pFrom,.        
31d70 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 44           WHERE_D
31d80 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70  ISTINCTBY, nLoop
31d90 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  -1, pFrom->aLoop
31da0 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55  [nLoop-1], &notU
31db0 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sed);.    if( rc
31dc0 3d 3d 31 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44  ==1 ) pWInfo->eD
31dd0 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
31de0 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
31df0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 6f  ;.  }.  if( pFro
31e00 6d 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a  m->isOrdered ){.
31e10 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
31e20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
31e30 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b  RE_DISTINCTBY ){
31e40 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
31e50 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
31e60 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
31e70 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
31e80 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53      pWInfo->bOBS
31e90 61 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 57  at = 1;.      pW
31ea0 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
31eb0 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
31ec0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e      }.  }.  pWIn
31ed0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46  fo->nRowOut = pF
31ee0 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a  rom->nRow;..  /*
31ef0 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20   Free temporary 
31f00 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72  memory and retur
31f10 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73  n success */.  s
31f20 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
31f30 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75   pSpace);.  retu
31f40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
31f50 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72  ./*.** Most quer
31f60 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73  ies use only a s
31f70 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65  ingle table (the
31f80 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29  y are not joins)
31f90 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d   and have.** sim
31fa0 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ple == constrain
31fb0 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78  ts against index
31fc0 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73  ed fields.  This
31fd0 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
31fe0 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f  s.** to plan tho
31ff0 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20  se simple cases 
32000 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20  using much less 
32010 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68  ceremony than th
32020 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72  e.** general-pur
32030 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e  pose query plann
32040 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20  er, and thereby 
32050 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c  yield faster sql
32060 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a  ite3_prepare().*
32070 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20  * times for the 
32080 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a  common case..**.
32090 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
320a0 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69  ro on success, i
320b0 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  f this query can
320c0 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74   be handled by t
320d0 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73  his.** no-frills
320e0 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20   query planner. 
320f0 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20   Return zero if 
32100 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73  this query needs
32110 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c   the .** general
32120 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70  -purpose query p
32130 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  lanner..*/.stati
32140 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74  c int whereShort
32150 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  Cut(WhereLoopBui
32160 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
32170 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
32180 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53  Info;.  struct S
32190 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
321a0 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  em;.  WhereClaus
321b0 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54  e *pWC;.  WhereT
321c0 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68  erm *pTerm;.  Wh
321d0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a  ereLoop *pLoop;.
321e0 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e    int iCur;.  in
321f0 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  t j;.  Table *pT
32200 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
32210 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d  x;.  .  pWInfo =
32220 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
32230 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  o;.  if( pWInfo-
32240 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
32250 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20  ERE_FORCE_TABLE 
32260 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
32270 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54  sert( pWInfo->pT
32280 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20  abList->nSrc>=1 
32290 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49  );.  pItem = pWI
322a0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
322b0 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d  ;.  pTab = pItem
322c0 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73  ->pTab;.  if( Is
322d0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
322e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
322f0 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20  pItem->zIndex ) 
32300 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72  return 0;.  iCur
32310 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
32320 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  r;.  pWC = &pWIn
32330 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70  fo->sWC;.  pLoop
32340 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
32350 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  w;.  pLoop->wsFl
32360 61 67 73 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d  ags = 0;.  pTerm
32370 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
32380 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
32390 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  _EQ, 0);.  if( p
323a0 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  Term ){.    pLoo
323b0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
323c0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
323d0 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45  RE_IPK|WHERE_ONE
323e0 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  ROW;.    pLoop->
323f0 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
32400 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  m;.    pLoop->nL
32410 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c  Term = 1;.    pL
32420 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
32430 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e   = 1;.    /* TUN
32440 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72  ING: Cost of a r
32450 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31  owid lookup is 1
32460 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 */.    pLoop->
32470 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33  rRun = 33;  /* 3
32480 33 3d 3d 77 68 65 72 65 43 6f 73 74 28 31 30 29  3==whereCost(10)
32490 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
324a0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
324b0 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
324c0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
324d0 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
324e0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
324f0 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
32500 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
32510 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  Idx->nColumn; j+
32520 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72  +){.        pTer
32530 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
32540 2c 20 69 43 75 72 2c 20 70 49 64 78 2d 3e 61 69  , iCur, pIdx->ai
32550 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 57 4f  Column[j], 0, WO
32560 5f 45 51 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  _EQ, pIdx);.    
32570 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
32580 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
32590 20 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a    whereLoopResiz
325a0 65 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  e(pWInfo->pParse
325b0 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6a 29 3b  ->db, pLoop, j);
325c0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
325d0 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72  aLTerm[j] = pTer
325e0 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
325f0 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 43   if( j!=pIdx->nC
32600 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
32610 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77  ;.      pLoop->w
32620 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
32630 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f  OLUMN_EQ|WHERE_O
32640 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45  NEROW|WHERE_INDE
32650 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 28  XED;.      if( (
32660 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26  pItem->colUsed &
32670 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78   ~columnsInIndex
32680 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20  (pIdx))==0 ){.  
32690 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46        pLoop->wsF
326a0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44  lags |= WHERE_ID
326b0 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a  X_ONLY;.      }.
326c0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54        pLoop->nLT
326d0 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70  erm = j;.      p
326e0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
326f0 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  q = j;.      pLo
32700 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
32710 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  ex = pIdx;.     
32720 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
32730 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64   of a unique ind
32740 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20  ex lookup is 15 
32750 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  */.      pLoop->
32760 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33  rRun = 39;  /* 3
32770 39 3d 3d 77 68 65 72 65 43 6f 73 74 28 31 35 29  9==whereCost(15)
32780 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
32790 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
327a0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
327b0 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  ){.    pLoop->nO
327c0 75 74 20 3d 20 28 57 68 65 72 65 43 6f 73 74 29  ut = (WhereCost)
327d0 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
327e0 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f  [0].pWLoop = pLo
327f0 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d  op;.    pLoop->m
32800 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73  askSelf = getMas
32810 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
32820 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  Set, iCur);.    
32830 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61  pWInfo->a[0].iTa
32840 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20  bCur = iCur;.   
32850 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
32860 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57   = 1;.    if( pW
32870 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
32880 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20   pWInfo->bOBSat 
32890 3d 20 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57  =  1;.    if( pW
328a0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
328b0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
328c0 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
328d0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
328e0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
328f0 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
32900 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
32910 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  EBUG.    pLoop->
32920 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69  cId = '0';.#endi
32930 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  f.    return 1;.
32940 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
32950 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
32960 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  e the beginning 
32970 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64  of the loop used
32980 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
32990 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
329a0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
329b0 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
329c0 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75  o an opaque stru
329d0 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
329e0 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  ins.** informati
329f0 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72  on needed to ter
32a00 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
32a10 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c    Later, the cal
32a20 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ling routine.** 
32a30 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
32a40 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
32a50 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
32a60 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
32a70 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64  nction.** in ord
32a80 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  er to complete t
32a90 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
32aa0 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
32ab0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
32ac0 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  curs, this routi
32ad0 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
32ae0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63  .**.** The basic
32af0 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61   idea is to do a
32b00 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e   nested loop, on
32b10 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20  e loop for each 
32b20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
32b30 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
32b40 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52   select.  (INSER
32b50 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61  T and UPDATE sta
32b60 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a  tements are the.
32b70 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c  ** same as a SEL
32b80 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20  ECT with only a 
32b90 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
32ba0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
32bb0 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  )  For.** exampl
32bc0 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73  e, if the SQL is
32bd0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
32be0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
32bf0 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
32c00 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  E ...;.**.** The
32c10 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  n the code gener
32c20 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75  ated is conceptu
32c30 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f  ally like the fo
32c40 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
32c50 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
32c60 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20   in t1 do       
32c70 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
32c80 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ted.**        fo
32c90 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
32ca0 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20   do      |-- by 
32cb0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
32cc0 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  n().**          
32cd0 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20  foreach row3 in 
32ce0 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20  t3 do   /.**    
32cf0 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
32d00 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
32d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
32d30 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e  ted.**        en
32d40 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
32d50 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20           |-- by 
32d60 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
32d70 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20  ).**      end   
32d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d90 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f        /.**.** No
32da0 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70  te that the loop
32db0 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e  s might not be n
32dc0 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ested in the ord
32dd0 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79  er in which they
32de0 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68  .** appear in th
32df0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66  e FROM clause if
32e00 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
32e10 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c  er is better abl
32e20 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65  e to make.** use
32e30 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f   of indices.  No
32e40 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65  te also that whe
32e50 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  n the IN operato
32e60 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20  r appears in.** 
32e70 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
32e80 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c  , it might resul
32e90 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  t in additional 
32ea0 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72  nested loops for
32eb0 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  .** scanning thr
32ec0 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20  ough all values 
32ed0 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
32ee0 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
32ef0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
32f00 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20  e Btree cursors 
32f10 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
32f20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20  each table.  t1 
32f30 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e  uses cursor.** n
32f40 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e  umber pTabList->
32f50 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74  a[0].iCursor.  t
32f60 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f  2 uses the curso
32f70 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d  r pTabList->a[1]
32f80 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64  .iCursor..** And
32f90 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73   so forth.  This
32fa0 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
32fb0 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20  es code to open 
32fc0 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f  those VDBE curso
32fd0 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  rs.** and sqlite
32fe0 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65  3WhereEnd() gene
32ff0 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  rates the code t
33000 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a  o close them..**
33010 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61  .** The code tha
33020 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  t sqlite3WhereBe
33030 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20  gin() generates 
33040 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
33050 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70  rs named.** in p
33060 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67  TabList pointing
33070 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70   at their approp
33080 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20  riate entries.  
33090 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a  The [...] code.*
330a0 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c  * can use OP_Col
330b0 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64  umn and OP_Rowid
330c0 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73   opcodes on thes
330d0 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74  e cursors to ext
330e0 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f  ract.** data fro
330f0 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61  m the various ta
33100 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  bles of the loop
33110 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ..**.** If the W
33120 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65  HERE clause is e
33130 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63  mpty, the foreac
33140 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63  h loops must eac
33150 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20  h scan their.** 
33160 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20  entire tables.  
33170 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79  Thus a three-way
33180 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e   join is an O(N^
33190 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  3) operation.  B
331a0 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  ut if.** the tab
331b0 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73  les have indices
331c0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74   and there are t
331d0 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
331e0 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a  E clause that.**
331f0 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20   refer to those 
33200 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c  indices, a compl
33210 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63  ete table scan c
33220 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e  an be avoided an
33230 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  d the.** code wi
33240 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74  ll run much fast
33250 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65  er.  Most of the
33260 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f   work of this ro
33270 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e  utine is checkin
33280 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74  g.** to see if t
33290 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73  here are indices
332a0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
332b0 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68  d to speed up th
332c0 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65  e loop..**.** Te
332d0 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
332e0 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f   clause are also
332f0 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77   used to limit w
33300 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c  hich rows actual
33310 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f  ly.** make it to
33320 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68   the "..." in th
33330 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20  e middle of the 
33340 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63  loop.  After eac
33350 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20  h "foreach",.** 
33360 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
33370 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75  RE clause that u
33380 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e  se only terms in
33390 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f   that loop and o
333a0 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72  uter.** loops ar
333b0 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  e evaluated and 
333c0 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20  if false a jump 
333d0 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61  is made around a
333e0 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  ll subsequent.**
333f0 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72   inner loops (or
33400 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e   around the "...
33410 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63  " if the test oc
33420 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
33430 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c  inner-.** most l
33440 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52  oop).**.** OUTER
33450 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20   JOINS.**.** An 
33460 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61  outer join of ta
33470 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69  bles t1 and t2 i
33480 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f  s conceptally co
33490 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ded as follows:.
334a0 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68  **.**    foreach
334b0 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a   row1 in t1 do.*
334c0 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a  *      flag = 0.
334d0 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
334e0 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a  row2 in t2 do.**
334f0 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a          start:.*
33500 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a  *          ....*
33510 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  *          flag 
33520 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a  = 1.**      end.
33530 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d  **      if flag=
33540 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  =0 then.**      
33550 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20    move the row2 
33560 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c  cursor to a null
33570 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67   row.**        g
33580 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20  oto start.**    
33590 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a    fi.**    end.*
335a0 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c  *.** ORDER BY CL
335b0 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a  AUSE PROCESSING.
335c0 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69  **.** pOrderBy i
335d0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
335e0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
335f0 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50  se (or the GROUP
33600 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66   BY clause.** if
33610 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50   the WHERE_GROUP
33620 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  BY flag is set i
33630 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66  n wctrlFlags) of
33640 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
33650 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ent.** if there 
33660 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72  is one.  If ther
33670 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
33680 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68   clause or if th
33690 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
336a0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20   called from an 
336b0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
336c0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
336d0 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c   pOrderBy is NUL
336e0 4c 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  L..*/.WhereInfo 
336f0 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
33700 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
33710 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
33720 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
33730 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
33740 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
33750 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c  FROM clause: A l
33760 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
33770 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
33780 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
33790 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
337a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
337b0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
337c0 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20  rderBy,   /* An 
337d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
337e0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
337f0 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53  prList *pResultS
33800 65 74 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65  et, /* Result se
33810 74 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  t of the query *
33820 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
33830 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  gs,       /* One
33840 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
33850 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
33860 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
33870 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 20 20    int iIdxCur   
33880 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48          /* If WH
33890 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
338a0 59 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20  Y is set, index 
338b0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f  cursor number */
338c0 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57  .){.  int nByteW
338d0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
338e0 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
338f0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
33900 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
33910 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
33920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33930 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
33940 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
33950 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
33960 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
33970 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
33980 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
33990 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
339a0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
339b0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
339c0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
339d0 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
339e0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
339f0 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
33a00 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
33a10 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
33a20 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
33a30 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
33a40 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
33a50 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
33a60 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
33a70 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
33a80 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
33a90 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
33aa0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
33ab0 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
33ac0 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
33ad0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
33ae0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
33af0 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  p;          /* P
33b00 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
33b10 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  le WhereLoop obj
33b20 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ect */.  int ii;
33b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b40 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
33b50 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
33b60 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
33b70 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
33b80 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
33b90 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
33ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
33bb0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20  turn code */... 
33bc0 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69   /* Variable ini
33bd0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
33be0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
33bf0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42  ;.  memset(&sWLB
33c00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42  , 0, sizeof(sWLB
33c10 29 29 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65  ));.  sWLB.pOrde
33c20 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
33c30 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68  .  /* Disable th
33c40 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d  e DISTINCT optim
33c50 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54  ization if SQLIT
33c60 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73  E_DistinctOpt is
33c70 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71   set via.  ** sq
33c80 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28  lite3_test_ctrl(
33c90 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
33ca0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e  OPTIMIZATIONS,..
33cb0 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  .) */.  if( Opti
33cc0 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
33cd0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74  (db, SQLITE_Dist
33ce0 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20  inctOpt) ){.    
33cf0 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57  wctrlFlags &= ~W
33d00 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
33d10 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  CT;.  }..  /* Th
33d20 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  e number of tabl
33d30 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
33d40 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
33d50 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
33d60 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61  f.  ** bits in a
33d70 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20   Bitmask .  */. 
33d80 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c   testcase( pTabL
33d90 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29  ist->nSrc==BMS )
33da0 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  ;.  if( pTabList
33db0 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20  ->nSrc>BMS ){.  
33dc0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
33dd0 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f  g(pParse, "at mo
33de0 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20  st %d tables in 
33df0 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20  a join", BMS);. 
33e00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
33e10 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
33e20 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65  tion normally ge
33e30 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64  nerates a nested
33e40 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61   loop for all ta
33e50 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54  bles in .  ** pT
33e60 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20  abList.  But if 
33e70 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  the WHERE_ONETAB
33e80 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
33e90 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f  set, then we sho
33ea0 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65  uld.  ** only ge
33eb0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
33ec0 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20  the first table 
33ed0 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  in pTabList and 
33ee0 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a  assume that.  **
33ef0 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73   any cursors ass
33f00 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75 62  ociated with sub
33f10 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61  sequent tables a
33f20 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  re uninitialized
33f30 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73  ..  */.  nTabLis
33f40 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20  t = (wctrlFlags 
33f50 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
33f60 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61  _ONLY) ? 1 : pTa
33f70 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20  bList->nSrc;..  
33f80 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
33f90 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
33fa0 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
33fb0 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
33fc0 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
33fd0 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e  urn value. A sin
33fe0 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  gle allocation i
33ff0 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
34000 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20  the WhereInfo.  
34010 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63  ** struct, the c
34020 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65  ontents of Where
34030 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68  Info.a[], the Wh
34040 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
34050 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ure.  ** and the
34060 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
34070 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57  ructure. Since W
34080 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61  hereClause conta
34090 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20  ins an 8-byte.  
340a0 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42  ** field (type B
340b0 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20  itmask) it must 
340c0 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e  be aligned on an
340d0 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
340e0 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72   on.  ** some ar
340f0 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e  chitectures. Hen
34100 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20  ce the ROUND8() 
34110 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42  below..  */.  nB
34120 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44  yteWInfo = ROUND
34130 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e  8(sizeof(WhereIn
34140 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29  fo)+(nTabList-1)
34150 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
34160 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  el));.  pWInfo =
34170 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
34180 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49  Zero(db, nByteWI
34190 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65  nfo + sizeof(Whe
341a0 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20  reLoop));.  if( 
341b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
341c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
341d0 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
341e0 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  );.    pWInfo = 
341f0 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  0;.    goto wher
34200 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
34210 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  .  pWInfo->nLeve
34220 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20  l = nTabList;.  
34230 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d  pWInfo->pParse =
34240 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66   pParse;.  pWInf
34250 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54  o->pTabList = pT
34260 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
34270 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
34280 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d  derBy;.  pWInfo-
34290 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52  >pResultSet = pR
342a0 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e  esultSet;.  pWIn
342b0 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c  fo->iBreak = sql
342c0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
342d0 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  l(v);.  pWInfo->
342e0 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
342f0 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66  rlFlags;.  pWInf
34300 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
34310 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
34320 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b  eryLoop;.  pMask
34330 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  Set = &pWInfo->s
34340 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e  MaskSet;.  sWLB.
34350 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b  pWInfo = pWInfo;
34360 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70  .  sWLB.pWC = &p
34370 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57  WInfo->sWC;.  sW
34380 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65  LB.pNew = (Where
34390 4c 6f 6f 70 2a 29 26 70 57 49 6e 66 6f 2d 3e 61  Loop*)&pWInfo->a
343a0 5b 6e 54 61 62 4c 69 73 74 5d 3b 0a 20 20 77 68  [nTabList];.  wh
343b0 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42  ereLoopInit(sWLB
343c0 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53  .pNew);.#ifdef S
343d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57  QLITE_DEBUG.  sW
343e0 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27  LB.pNew->cId = '
343f0 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  *';.#endif..  /*
34400 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45   Split the WHERE
34410 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70   clause into sep
34420 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73  arate subexpress
34430 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a  ions where each.
34440 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69    ** subexpressi
34450 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
34460 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  by an AND operat
34470 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d  or..  */.  initM
34480 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29  askSet(pMaskSet)
34490 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
344a0 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  nit(&pWInfo->sWC
344b0 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c  , pWInfo);.  sql
344c0 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73  ite3ExprCodeCons
344d0 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57  tants(pParse, pW
344e0 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70  here);.  whereSp
344f0 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  lit(&pWInfo->sWC
34500 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
34510 29 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 31  );   /* IMP: R-1
34520 35 38 34 32 2d 35 33 32 39 36 20 2a 2f 0a 20 20  5842-53296 */.  
34530 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20    .  /* Special 
34540 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c  case: a WHERE cl
34550 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e  ause that is con
34560 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65  stant.  Evaluate
34570 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73   the.  ** expres
34580 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20  sion and either 
34590 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66  jump over all of
345a0 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c   the code or fal
345b0 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69  l thru..  */.  i
345c0 66 28 20 70 57 68 65 72 65 20 26 26 20 28 6e 54  f( pWhere && (nT
345d0 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c  abList==0 || sql
345e0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
345f0 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65  ntNotJoin(pWhere
34600 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
34610 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
34620 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49  rse, pWhere, pWI
34630 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c  nfo->iBreak, SQL
34640 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
34650 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
34660 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
34670 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d  al case: No FROM
34680 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69   clause.  */.  i
34690 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29  f( nTabList==0 )
346a0 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  {.    if( pOrder
346b0 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42  By ) pWInfo->bOB
346c0 53 61 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Sat = 1;.    if(
346d0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
346e0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
346f0 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
34700 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
34710 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
34720 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  IQUE;.    }.  }.
34730 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62  .  /* Assign a b
34740 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d  it from the bitm
34750 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72  ask to every ter
34760 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
34770 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
34780 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62  When assigning b
34790 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f  itmask values to
347a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72   FROM clause cur
347b0 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65  sors, it must be
347c0 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74  .  ** the case t
347d0 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20  hat if X is the 
347e0 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
347f0 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65  N-th FROM clause
34800 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20   term then.  ** 
34810 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
34820 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
34830 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66  terms to the lef
34840 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65  t of the N-th te
34850 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29  rm.  ** is (X-1)
34860 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f  .   An expressio
34870 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c  n from the ON cl
34880 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
34890 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a  OIN can use.  **
348a0 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74   its Expr.iRight
348b0 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20  JoinTable value 
348c0 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d  to find the bitm
348d0 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74  ask of the right
348e0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74   table.  ** of t
348f0 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61  he join.  Subtra
34900 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74  cting one from t
34910 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62  he right table b
34920 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20  itmask gives a. 
34930 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20   ** bitmask for 
34940 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
34950 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f  e left of the jo
34960 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65  in.  Knowing the
34970 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f   bitmask.  ** fo
34980 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
34990 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
349a0 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72  ft join is impor
349b0 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33  tant.  Ticket #3
349c0 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  015..  **.  ** N
349d0 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b  ote that bitmask
349e0 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
349f0 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e  r all pTabList->
34a00 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20  nSrc tables in. 
34a10 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f   ** pTabList, no
34a20 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  t just the first
34a30 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73   nTabList tables
34a40 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e  .  nTabList is n
34a50 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75  ormally.  ** equ
34a60 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e  al to pTabList->
34a70 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62  nSrc but might b
34a80 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31  e shortened to 1
34a90 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45   if the.  ** WHE
34aa0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
34ab0 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20   flag is set..  
34ac0 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
34ad0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
34ae0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65  ; ii++){.    cre
34af0 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  ateMask(pMaskSet
34b00 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69  , pTabList->a[ii
34b10 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ].iCursor);.  }.
34b20 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
34b30 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74   {.    Bitmask t
34b40 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20  oTheLeft = 0;.  
34b50 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
34b60 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
34b70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i++){.      Bitm
34b80 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28  ask m = getMask(
34b90 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
34ba0 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f  st->a[ii].iCurso
34bb0 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
34bc0 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65  ( (m-1)==toTheLe
34bd0 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68  ft );.      toTh
34be0 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20  eLeft |= m;.    
34bf0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
34c00 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f  /* Analyze all o
34c10 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  f the subexpress
34c20 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  ions.  Note that
34c30 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d   exprAnalyze() m
34c40 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65  ight.  ** add ne
34c50 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  w virtual terms 
34c60 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
34c70 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
34c80 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a  .  We do not.  *
34c90 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a  * want to analyz
34ca0 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20  e these virtual 
34cb0 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20  terms, so start 
34cc0 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65  analyzing at the
34cd0 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f   end.  ** and wo
34ce0 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68  rk forward so th
34cf0 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72  at the added vir
34d00 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e  tual terms are n
34d10 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a  ever processed..
34d20 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79    */.  exprAnaly
34d30 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20  zeAll(pTabList, 
34d40 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20  &pWInfo->sWC);. 
34d50 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
34d60 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
34d70 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
34d80 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  r;.  }..  /* If 
34d90 74 68 65 20 4f 52 44 45 52 20 42 59 20 28 6f 72  the ORDER BY (or
34da0 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73   GROUP BY) claus
34db0 65 20 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72  e contains refer
34dc0 65 6e 63 65 73 20 74 6f 20 67 65 6e 65 72 61 6c  ences to general
34dd0 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
34de0 73 2c 20 74 68 65 6e 20 77 65 20 77 6f 6e 27 74  s, then we won't
34df0 20 62 65 20 61 62 6c 65 20 74 6f 20 73 61 74 69   be able to sati
34e00 73 66 79 20 69 74 20 75 73 69 6e 67 20 69 6e 64  sfy it using ind
34e10 69 63 65 73 2c 20 73 6f 0a 20 20 2a 2a 20 67 6f  ices, so.  ** go
34e20 20 61 68 65 61 64 20 61 6e 64 20 64 69 73 61 62   ahead and disab
34e30 6c 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  le it now..  */.
34e40 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
34e50 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
34e60 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
34e70 4e 43 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 66  NCT)!=0 ){.    f
34e80 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 64  or(ii=0; ii<pOrd
34e90 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  erBy->nExpr; ii+
34ea0 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
34eb0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
34ec0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
34ed0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 70  OrderBy->a[ii].p
34ee0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
34ef0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
34f00 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
34f10 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
34f20 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 30  y = pOrderBy = 0
34f30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
34f40 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
34f50 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
34f60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  0 ){.        bre
34f70 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
34f80 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74  }.  }..  if( wct
34f90 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
34fa0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
34fb0 0a 20 20 20 20 69 66 28 20 69 73 44 69 73 74 69  .    if( isDisti
34fc0 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61  nctRedundant(pPa
34fd0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26  rse, pTabList, &
34fe0 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65  pWInfo->sWC, pRe
34ff0 73 75 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20  sultSet) ){.    
35000 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43    /* The DISTINC
35010 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69  T marking is poi
35020 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20  ntless.  Ignore 
35030 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49  it. */.      pWI
35040 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
35050 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
35060 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73  UNIQUE;.    }els
35070 65 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d  e if( pOrderBy==
35080 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  0 ){.      /* Tr
35090 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68  y to ORDER BY th
350a0 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20  e result set to 
350b0 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72  make distinct pr
350c0 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65 72 20  ocessing easier 
350d0 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  */.      pWInfo-
350e0 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  >wctrlFlags |= W
350f0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b  HERE_DISTINCTBY;
35100 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  .      pWInfo->p
35110 4f 72 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c  OrderBy = pResul
35120 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tSet;.    }.  }.
35130 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
35140 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
35150 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48 45 52 45  jects */.  WHERE
35160 54 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a  TRACE(0xffff,("*
35170 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61  ** Optimizer Sta
35180 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69  rt ***\n"));.  i
35190 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c  f( nTabList!=1 |
351a0 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  | whereShortCut(
351b0 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20  &sWLB)==0 ){.   
351c0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
351d0 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20  ddAll(&sWLB);.  
351e0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
351f0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
35200 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69 73 70 6c  .  .    /* Displ
35210 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68  ay all of the Wh
35220 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
35230 69 66 20 77 68 65 72 65 74 72 61 63 65 20 69 73  if wheretrace is
35240 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64   enabled */.#ifd
35250 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
35260 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71  ABLED.    if( sq
35270 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
35280 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f  ){.      WhereLo
35290 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74  op *p;.      int
352a0 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63   i;.      static
352b0 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d   char zLabel[] =
352c0 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64   "0123456789abcd
352d0 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
352e0 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20  uvwyxz".        
352f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
35310 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
35320 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20  QRSTUVWYXZ";.   
35330 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d     for(p=pWInfo-
35340 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b  >pLoops, i=0; p;
35350 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c   p=p->pNextLoop,
35360 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
35370 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69  ->cId = zLabel[i
35380 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d  %sizeof(zLabel)]
35390 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
353a0 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 54 61 62  oopPrint(p, pTab
353b0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
353c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20     }.#endif.  . 
353d0 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
353e0 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20  er(pWInfo, 0);. 
353f0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
35400 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
35410 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
35420 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
35430 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
35440 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
35450 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  er(pWInfo, pWInf
35460 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20  o->nRowOut+1);. 
35470 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
35480 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
35490 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
354a0 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  r;.    }.  }.  i
354b0 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
354c0 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66  rBy==0 && (db->f
354d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
354e0 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29  verseOrder)!=0 )
354f0 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  {.     pWInfo->r
35500 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61 73  evMask = (Bitmas
35510 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66  k)(-1);.  }.  if
35520 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
35530 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c  | NEVER(db->mall
35540 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20  ocFailed) ){.   
35550 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
35560 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65  Error;.  }.#ifde
35570 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
35580 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
35590 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
355a0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
355b0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
355c0 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f  tf("---- Solutio
355d0 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e  n nRow=%d", pWIn
355e0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20  fo->nRowOut);.  
355f0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 62 4f    if( pWInfo->bO
35600 42 53 61 74 20 29 7b 0a 20 20 20 20 20 20 73 71  BSat ){.      sq
35610 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
35620 28 22 20 4f 52 44 45 52 42 59 3d 30 78 25 6c 6c  (" ORDERBY=0x%ll
35630 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d  x", pWInfo->revM
35640 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ask);.    }.    
35650 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e  switch( pWInfo->
35660 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  eDistinct ){.   
35670 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
35680 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b  STINCT_UNIQUE: {
35690 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
356a0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
356b0 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29  ISTINCT=unique")
356c0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
356d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
356e0 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
356f0 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
35700 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
35710 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
35720 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a  INCT=ordered");.
35730 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
35740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
35750 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
35760 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  _UNORDERED: {.  
35770 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
35780 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
35790 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29  INCT=unordered")
357a0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
357b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
357c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
357d0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
357e0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57   for(ii=0; ii<pW
357f0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69  Info->nLevel; ii
35800 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
35810 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f  LoopPrint(pWInfo
35820 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20  ->a[ii].pWLoop, 
35830 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d  pTabList);.    }
35840 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
35850 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74   Attempt to omit
35860 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65   tables from the
35870 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f   join that do no
35880 74 20 65 66 66 65 63 74 20 74 68 65 20 72 65 73  t effect the res
35890 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49  ult */.  if( pWI
358a0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20  nfo->nLevel>=2. 
358b0 20 20 26 26 20 70 52 65 73 75 6c 74 53 65 74 21    && pResultSet!
358c0 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
358d0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
358e0 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70   SQLITE_OmitNoop
358f0 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42  Join).  ){.    B
35900 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d  itmask tabUsed =
35910 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
35920 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
35930 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69  esultSet);.    i
35940 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 74 61  f( pOrderBy ) ta
35950 62 55 73 65 64 20 7c 3d 20 65 78 70 72 4c 69 73  bUsed |= exprLis
35960 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
35970 6b 53 65 74 2c 20 70 4f 72 64 65 72 42 79 29 3b  kSet, pOrderBy);
35980 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e  .    while( pWIn
35990 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b  fo->nLevel>=2 ){
359a0 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
359b0 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a   *pTerm, *pEnd;.
359c0 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57        pLoop = pW
359d0 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e  Info->a[pWInfo->
359e0 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70  nLevel-1].pWLoop
359f0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 57 49  ;.      if( (pWI
35a00 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
35a10 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f  [pLoop->iTab].jo
35a20 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
35a30 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
35a40 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
35a50 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
35a60 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20  _DISTINCT)==0.  
35a70 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
35a80 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
35a90 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20  ONEROW)==0.     
35aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
35ab0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
35ac0 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20   if( (tabUsed & 
35ad0 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
35ae0 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
35af0 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70     pEnd = sWLB.p
35b00 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43  WC->a + sWLB.pWC
35b10 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66  ->nTerm;.      f
35b20 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57  or(pTerm=sWLB.pW
35b30 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64  C->a; pTerm<pEnd
35b40 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
35b50 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
35b60 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f  prereqAll & pLoo
35b70 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a  p->maskSelf)!=0.
35b80 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70           && !Exp
35b90 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
35ba0 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
35bb0 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
35bc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
35bd0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
35be0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
35bf0 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65  pTerm<pEnd ) bre
35c00 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ak;.      WHERET
35c10 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d  RACE(0xffff, ("-
35c20 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e  > drop loop %c n
35c30 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f  ot used\n", pLoo
35c40 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20  p->cId));.      
35c50 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d  pWInfo->nLevel--
35c60 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74  ;.      nTabList
35c70 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
35c80 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
35c90 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  f,("*** Optimize
35ca0 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e  r Finished ***\n
35cb0 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  "));.  pWInfo->p
35cc0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
35cd0 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  p += pWInfo->nRo
35ce0 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  wOut;..  /* If t
35cf0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
35d00 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
35d10 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
35d20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
35d30 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
35d40 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
35d50 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
35d60 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
35d70 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70  ..  ** The one-p
35d80 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e  ass algorithm on
35d90 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20  ly works if the 
35da0 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
35db0 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68  straints.  ** th
35dc0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75  e statement to u
35dd0 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72  pdate a single r
35de0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ow..  */.  asser
35df0 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
35e00 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
35e10 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57  ESIRED)==0 || pW
35e20 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20  Info->nLevel==1 
35e30 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46  );.  if( (wctrlF
35e40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
35e50 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30  PASS_DESIRED)!=0
35e60 20 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d   .   && (pWInfo-
35e70 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73  >a[0].pWLoop->ws
35e80 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
35e90 45 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20  EROW)!=0 ){.    
35ea0 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
35eb0 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66  s = 1;.    pWInf
35ec0 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
35ed0 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  wsFlags &= ~WHER
35ee0 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_IDX_ONLY;.  }.
35ef0 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74  .  /* Open all t
35f00 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61  ables in the pTa
35f10 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e  bList and any in
35f20 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66  dices selected f
35f30 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e  or.  ** searchin
35f40 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  g those tables..
35f50 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f    */.  sqlite3Co
35f60 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
35f70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49  Parse, -1); /* I
35f80 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65  nsert the cookie
35f90 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a   verifier Goto *
35fa0 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
35fb0 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
35fc0 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  r(ii=0, pLevel=p
35fd0 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61  WInfo->a; ii<nTa
35fe0 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65  bList; ii++, pLe
35ff0 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
36000 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
36010 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
36020 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
36030 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
36040 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
36050 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
36060 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  x */.    struct 
36070 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
36080 61 62 49 74 65 6d 3b 0a 20 20 20 20 57 68 65 72  abItem;.    Wher
36090 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 0a 20  eLoop *pLoop;.. 
360a0 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
360b0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
360c0 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70  l->iFrom];.    p
360d0 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
360e0 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20  pTab;.    iDb = 
360f0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
36100 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
36110 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f  Schema);.    pLo
36120 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
36130 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54  oop;.    if( (pT
36140 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
36150 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
36160 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
36170 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20   ){.      /* Do 
36180 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d  nothing */.    }
36190 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
361a0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
361b0 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70  TABLE.    if( (p
361c0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
361d0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
361e0 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
361f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61  const char *pVTa
36200 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  b = (const char 
36210 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  *)sqlite3GetVTab
36220 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
36230 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
36240 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
36250 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
36260 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
36270 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20  VOpen, iCur, 0, 
36280 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41  0, pVTab, P4_VTA
36290 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  B);.    }else if
362a0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
362b0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  ) ){.      /* no
362c0 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a  op */.    }else.
362d0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
362e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
362f0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
36300 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
36310 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
36320 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
36330 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  OSE)==0 ){.     
36340 20 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f   int op = pWInfo
36350 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50  ->okOnePass ? OP
36360 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f  _OpenWrite : OP_
36370 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
36380 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
36390 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
363a0 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c  m->iCursor, iDb,
363b0 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20   pTab, op);.    
363c0 20 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49    testcase( !pWI
363d0 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
363e0 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  & pTab->nCol==BM
363f0 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
36400 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e  tcase( !pWInfo->
36410 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
36420 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  b->nCol==BMS );.
36430 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
36440 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
36450 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29  pTab->nCol<BMS )
36460 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  {.        Bitmas
36470 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  k b = pTabItem->
36480 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20  colUsed;.       
36490 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20   int n = 0;.    
364a0 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62      for(; b; b=b
364b0 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  >>1, n++){}.    
364c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
364d0 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74  hangeP4(v, sqlit
364e0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
364f0 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20  r(v)-1, .       
36500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36510 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f       SQLITE_INT_
36520 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e  TO_PTR(n), P4_IN
36530 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73  T32);.        as
36540 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e  sert( n<=pTab->n
36550 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Col );.      }. 
36560 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36570 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
36580 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
36590 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
365a0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
365b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
365c0 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
365d0 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c  NDEX.    if( (pL
365e0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
365f0 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
36600 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  !=0 ){.      con
36610 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
36620 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 70 57  ndex(pParse, &pW
36630 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 54 61 62 49  Info->sWC, pTabI
36640 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  tem, notReady, p
36650 4c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  Level);.    }els
36660 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
36670 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
36680 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
36690 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  ){.      Index *
366a0 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  pIx = pLoop->u.b
366b0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
366c0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
366d0 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
366e0 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
366f0 49 78 29 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49  Ix);.      /* FI
36700 58 4d 45 3a 20 20 41 73 20 61 6e 20 6f 70 74 69  XME:  As an opti
36710 6d 69 7a 61 74 69 6f 6e 20 75 73 65 20 70 54 61  mization use pTa
36720 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 69  bItem->iCursor i
36730 66 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  f WHERE_IDX_ONLY
36740 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 49   */.      int iI
36750 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  ndexCur = pLevel
36760 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 64 78  ->iIdxCur = iIdx
36770 43 75 72 20 3f 20 69 49 64 78 43 75 72 20 3a 20  Cur ? iIdxCur : 
36780 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
36790 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
367a0 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
367b0 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
367c0 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65     assert( iInde
367d0 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  xCur>=0 );.     
367e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
367f0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p4(v, OP_OpenRea
36800 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49  d, iIndexCur, pI
36810 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20  x->tnum, iDb,.  
36820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36830 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
36840 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P4_KEYINFO_HA
36850 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64  NDOFF);.      Vd
36860 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
36870 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29  s", pIx->zName))
36880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
36890 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
368a0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
368b0 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26  ;.    notReady &
368c0 3d 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  = ~getMask(&pWIn
368d0 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 54  fo->sMaskSet, pT
368e0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
368f0 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
36900 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  iTop = sqlite3Vd
36910 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
36920 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
36930 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
36940 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
36950 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
36960 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  the code to do t
36970 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68  he search.  Each
36980 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
36990 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20  e for.  ** loop 
369a0 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20  below generates 
369b0 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
369c0 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  e nested loop of
369d0 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f   the VM.  ** pro
369e0 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  gram..  */.  not
369f0 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
36a00 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  k)0;.  for(ii=0;
36a10 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
36a20 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20  ++){.    pLevel 
36a30 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  = &pWInfo->a[ii]
36a40 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65  ;.    explainOne
36a50 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61  Scan(pParse, pTa
36a60 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69  bList, pLevel, i
36a70 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  i, pLevel->iFrom
36a80 2c 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20  , wctrlFlags);. 
36a90 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f     notReady = co
36aa0 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70  deOneLoopStart(p
36ab0 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65  WInfo, ii, notRe
36ac0 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  ady);.    pWInfo
36ad0 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c  ->iContinue = pL
36ae0 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a  evel->addrCont;.
36af0 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20    }..  /* Done. 
36b00 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  */.  return pWIn
36b10 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  fo;..  /* Jump h
36b20 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ere if malloc fa
36b30 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69  ils */.whereBegi
36b40 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57  nError:.  if( pW
36b50 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72  Info ){.    pPar
36b60 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
36b70 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
36b80 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68  ueryLoop;.    wh
36b90 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
36ba0 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72  pWInfo);.  }.  r
36bb0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
36bc0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65  * Generate the e
36bd0 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
36be0 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65  loop.  See comme
36bf0 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74  nts on .** sqlit
36c00 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66  e3WhereBegin() f
36c10 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
36c20 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  formation..*/.vo
36c30 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  id sqlite3WhereE
36c40 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  nd(WhereInfo *pW
36c50 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a  Info){.  Parse *
36c60 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
36c70 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20  >pParse;.  Vdbe 
36c80 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
36c90 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  be;.  int i;.  W
36ca0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
36cb0 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  l;.  WhereLoop *
36cc0 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74  pLoop;.  SrcList
36cd0 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
36ce0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
36cf0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
36d00 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
36d10 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74   Generate loop t
36d20 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e  ermination code.
36d30 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
36d40 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
36d50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70  arse);.  for(i=p
36d60 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b  WInfo->nLevel-1;
36d70 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
36d80 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
36d90 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f  o->a[i];.    pLo
36da0 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
36db0 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  oop;.    sqlite3
36dc0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
36dd0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
36de0 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Cont);.    if( p
36df0 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f  Level->op!=OP_No
36e00 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  op ){.      sqli
36e10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
36e20 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65   pLevel->op, pLe
36e30 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
36e40 3e 70 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  >p2);.      sqli
36e50 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
36e60 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a  v, pLevel->p5);.
36e70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
36e80 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
36e90 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20  HERE_IN_ABLE && 
36ea0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
36eb0 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  >0 ){.      stru
36ec0 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
36ed0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
36ee0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
36ef0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
36f00 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a  evel->addrNxt);.
36f10 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76        for(j=pLev
36f20 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49  el->u.in.nIn, pI
36f30 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  n=&pLevel->u.in.
36f40 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e  aInLoop[j-1]; j>
36f50 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a  0; j--, pIn--){.
36f60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
36f70 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
36f80 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29  In->addrInTop+1)
36f90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
36fa0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70  3VdbeAddOp2(v, p
36fb0 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20  In->eEndLoopOp, 
36fc0 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e  pIn->iCur, pIn->
36fd0 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20  addrInTop);.    
36fe0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
36ff0 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
37000 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20  addrInTop-1);.  
37010 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
37020 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
37030 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
37040 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  op);.    }.    s
37050 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
37060 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
37070 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
37080 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
37090 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69  tJoin ){.      i
370a0 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
370b0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
370c0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
370d0 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  Pos, pLevel->iLe
370e0 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61  ftJoin);.      a
370f0 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
37100 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
37110 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
37120 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70         || (pLoop
37130 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
37140 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b  E_INDEXED)!=0 );
37150 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  .      if( (pLoo
37160 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
37170 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
37180 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
37190 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
371a0 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62  OP_NullRow, pTab
371b0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
371c0 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
371d0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
371e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
371f0 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 20  DEXED ){.       
37200 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37210 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
37220 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
37230 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
37240 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
37250 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20  ==OP_Return ){. 
37260 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
37270 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
37280 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  osub, pLevel->p1
37290 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
372a0 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rst);.      }els
372b0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
372c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
372d0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
372e0 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
372f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
37300 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
37310 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
37320 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
37330 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73  "break" point is
37340 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74   here, just past
37350 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
37360 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  outer loop..  **
37370 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20   Set it..  */.  
37380 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
37390 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66  veLabel(v, pWInf
373a0 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f  o->iBreak);..  /
373b0 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74  * Close all of t
373c0 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
373d0 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73  were opened by s
373e0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
373f0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
37400 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c   pWInfo->nLevel<
37410 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  =pTabList->nSrc 
37420 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  );.  for(i=0, pL
37430 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
37440 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
37450 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
37460 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
37470 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  x = 0;.    struc
37480 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
37490 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
374a0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
374b0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c  iFrom];.    Tabl
374c0 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74  e *pTab = pTabIt
374d0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  em->pTab;.    as
374e0 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
374f0 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
37500 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20  vel->pWLoop;.   
37510 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
37520 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
37530 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  ral)==0.     && 
37540 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
37550 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f  .     && (pWInfo
37560 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
37570 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43  HERE_OMIT_OPEN_C
37580 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  LOSE)==0.    ){.
37590 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70        int ws = p
375a0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
375b0 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
375c0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28  ->okOnePass && (
375d0 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  ws & WHERE_IDX_O
375e0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
375f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37600 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
37610 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
37620 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
37630 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48      if( (ws & WH
37640 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
37650 26 26 20 28 77 73 20 26 20 28 57 48 45 52 45 5f  && (ws & (WHERE_
37660 49 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49  IPK|WHERE_AUTO_I
37670 4e 44 45 58 29 29 3d 3d 30 20 29 7b 0a 20 20 20  NDEX))==0 ){.   
37680 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37690 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
376a0 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  se, pLevel->iIdx
376b0 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
376c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
376d0 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e  his scan uses an
376e0 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42   index, make VDB
376f0 45 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74  E code substitut
37700 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74  ions to read dat
37710 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68  a.    ** from th
37720 65 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20  e index instead 
37730 6f 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  of from the tabl
37740 65 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65  e where possible
37750 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  .  In some cases
37760 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74  .    ** this opt
37770 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e  imization preven
37780 74 73 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ts the table fro
37790 6d 20 65 76 65 72 20 62 65 69 6e 67 20 72 65 61  m ever being rea
377a0 64 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20  d, which can.   
377b0 20 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e   ** yield a sign
377c0 69 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61  ificant performa
377d0 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a  nce boost..    *
377e0 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20  * .    ** Calls 
377f0 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
37800 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e  rator in between
37810 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
37820 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71  in and.    ** sq
37830 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69  lite3WhereEnd wi
37840 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20  ll have created 
37850 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65  code that refere
37860 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20  nces the table. 
37870 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20     ** directly. 
37880 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73   This loop scans
37890 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c   all that code l
378a0 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64  ooking for opcod
378b0 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  es.    ** that r
378c0 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62  eference the tab
378d0 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20  le and converts 
378e0 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65  them into opcode
378f0 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65  s that.    ** re
37900 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65  ference the inde
37910 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  x..    */.    if
37920 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
37930 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45   & (WHERE_INDEXE
37940 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  D|WHERE_IDX_ONLY
37950 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20  ) ){.      pIdx 
37960 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
37970 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c  .pIndex;.    }el
37980 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  se if( pLoop->ws
37990 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
379a0 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20  LTI_OR ){.      
379b0 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75  pIdx = pLevel->u
379c0 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a  .pCovidx;.    }.
379d0 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20      if( pIdx && 
379e0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
379f0 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  d ){.      int k
37a00 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20  , j, last;.     
37a10 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20   VdbeOp *pOp;.. 
37a20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
37a30 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
37a40 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20  WInfo->iTop);.  
37a50 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
37a60 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
37a70 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  r(v);.      for(
37a80 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20  k=pWInfo->iTop; 
37a90 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70  k<last; k++, pOp
37aa0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
37ab0 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
37ac0 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
37ad0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
37ae0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
37af0 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  P_Column ){.    
37b00 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
37b10 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
37b20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
37b30 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70    if( pOp->p2==p
37b40 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
37b50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
37b60 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20    pOp->p2 = j;. 
37b70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
37b80 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
37b90 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
37ba0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
37bb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
37bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
37bd0 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
37be0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
37bf0 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c  _IDX_ONLY)==0 ||
37c00 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
37c10 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
37c20 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
37c30 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
37c40 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
37c50 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
37c60 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
37c70 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
37c80 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  dxRowid;.       
37c90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
37ca0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  .  }..  /* Final
37cb0 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20   cleanup.  */.  
37cc0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
37cd0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
37ce0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
37cf0 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62  whereInfoFree(db
37d00 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74  , pWInfo);.  ret
37d10 75 72 6e 3b 0a 7d 0a                             urn;.}.